李宏毅深度学习-梯度下降和Batch Normalization批量归一化

news2024/10/6 3:25:38

Gradient Descent梯度下降

在这里插入图片描述
▽ -> 梯度gradient -> vector向量 -> 下图中的红色箭头(loss等高线的法线方向)
在这里插入图片描述

Tip1: Tuning your learning rates

在这里插入图片描述

Adaptive Learning Rates自适应lr

在这里插入图片描述

通常lr会越来越小
Adaptive Learning Rates中每个参数都给它不同的lr

Adagrad

Adagrad也是Adaptive Learning Rates,因此每个参数都给它不同的lr
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Tip2: Stochastic Gradient Descent随机梯度下降

在这里插入图片描述
在这里插入图片描述
左边走一步,右边已经二十步
天下武功唯快不破

Tip3: Feature Scaling特征缩放

为什么要做归一化处理

在这里插入图片描述

如果要predict宝可梦进化以后CP值,有两个input feature:x1是进化前CP值,x2是它的生命值
如果x1和x2分布的range很不一样,建议把它们做scaling,也就是把它们的range分布变成是一样的
希望不同的feature,它们的scale是一样的
在这里插入图片描述

左边这种情况下会发现,w1的变化对y的变化而言是比较小的,而w2的变化对y的变化而言是比较大的
如果画error surface会是长椭圆形状的:因此,w1对loss是有比较小的微分的,因此w1方向上比较平滑。此时,在不同方向上,就会需要非常不同的lr,除非Adagrad等adaptive lr否则很难搞定它,很难update参数
正圆形update参数就比较容易,而且注意到梯度方向就是指向最低点的,效率就比较高,而椭圆形开始时不是指向最低点

常见的Feature Scaling方式:

深度学习中典型的特征归一化代表就是Batch Normalization批归一化,具体的计算方法也是较简单即计算批中均值和方差,通过均值和方差对原数据进行归一化操作:
在这里插入图片描述
看上图绿色框框圈起来的地方,我们称作它是“第i个dimension”。然后在第i个dimension当中再取出其中一个element出来看(就是红色框框的地方)。

每一个元素减掉同一个dimension的所有elements平均值再除以standard deviation后再放回原位,然后每一个elements都经过一次这样的计算,就完成了feature normalization

那做完Normalization后有什么好处?

所有dimension的mean会被限制是0,而variance变成全部是1。呈现一个统计上的常态分布,这样就可以制造出一个较好(较smooth)的error surface。

再做梯度下降可以收敛地更快更好

此外,在 Deep Learning 中,还要考虑 hidden layer (中间层)的输出。如下图所示的 z i z^i zi它同时是下一层的输入,因此也需要做 Normalization。
在这里插入图片描述
看上图,最左边的三个x tilde已经做feature normalization(x变成x tilde: tilde就是波浪符号的意思),但他们还会因为要经过下一层的hidden layer,经过下一层的hidden layer,代表必须再做一次feature normalization的动作.可以在z的那层做或是在a的那层做feature normalization都可以; 事实上在实作上, 在activation前或后做feature normalization不会有太大的变化,所以其实都可以。

在什么位置做 Normalization 呢?

一般来说,在 activation function 之前(对 z i z^i zi做)或之后(对 a i a^i ai做)都可以。不过,如果 activation function 是 Sigmoid,因为 Sigmoid function 在取值范围 [0,1] 的 gradient 较大,因此对 z i z^i zi做normalization 更好。

我们接下来对z层做feature normalization。先算出 μ \mu μ σ \sigma σ
在这里插入图片描述
再对每一个element做feature normalization,得到z-tilde
在这里插入图片描述

z i z^i zi做了 normalization 之后,有一个有趣的现象:本来各条数据(各个 sample )之间是互不影响的。例如 z 1 z^1 z1的变化只影响 a 1 a^1 a1但是做 normalization 要在全部数据 (samples) 上求均值和方差,如下图所示, z 1 z^1 z1的变化会通过 μ \mu μ, σ \sigma σ影响KaTeX parse error: Expected group after '_' at position 2: z_̲^2,KaTeX parse error: Expected group after '_' at position 2: z_̲^3,进而影响到 a 2 a^2 a2, a 3 a^3 a3
在这里插入图片描述
也就是说,以前是一次只需要考虑一个 sample ,输入到 deep neural network 得到一个 output。做 Normalization 会使得 samples 之间互相有影响,因此现在一次需要考虑一批 samples,输入一个大的 deep neural network,得到一批 outputs。

但我们经过feature normalization关联化之后,那我们下一层必须把被关联化的所有input都包在一起做计算。这也是为什么这个演算法叫做Batch的原因。所以请记住一个关键: Batch的原因就是input已经在feature normalization的时候就"被关联"起来了。也可以看做,不是一个network处理一个example,而是变成一个巨大的network处理一大把example然后output出另一大把example.

然而,这边又有一个问题,我们资料要是有好几百万笔的话,我们在实作的时候或许会受限于硬体效能状况下会跑很久,那这时候我们就可以只取Batch做计算。

但另一个问题是,若我们只取Batch,这个Batch也必须要够大,大到足以表示整个data corpus的分布。这个时候就可以把原本要对整个corpus做feature normalization变成只需要对一个batch做feature normalization,做为整个data corpus的概估值。

所以这样大大减少计算量且减小了”Internal Covariate Shift”带来的负面效应。

把输入 samples 的各个维度都调整成均值为 0,方差为 1的分布,有时可能不好解决问题,此时可以做一点改变。如下图右上角的公式所示。注意: γ \gamma γ β \beta β 的值通过学习得到,也就是根据模型和数据的情况调整。 γ \gamma γ 初始设为全 1 向量, β \beta β 初始设为全 0 向量。
在这里插入图片描述

Testing Performance

刚刚说的都是training的状况,接下来看一下testing时怎么做:

Batch Normalization 虽好,但是在 testing 时就遇到了问题。testing 或者实际部署时,数据都是实时处理,不可能每次等到满一个 batch 才处理

怎么办呢?

训练时,每处理一个 batch,就按下图中所示公式,更新均值 μ \mu μ 的 moving average μ ‾ \overline\mu μ σ \sigma σ 也是类似操作。训练结束后,把得到的 μ ‾ \overline\mu μ σ ‾ \overline\sigma σ 用作 testing data 的均值和方差
在这里插入图片描述

在这里插入图片描述
为什么说 Batch Normalization 对优化参数有帮助?

“Experimental results (and theoretically analysis) support batch normalization change the landscape of error surface.”

实验结果和理论分析验证了 Batch Normalization 可以通过改变 error surface,让 optimization 更顺利。

Batch Normalization的表现

在这里插入图片描述
所以BN实际上有一些对抗过拟合的效果

看到一个方法时要考虑是对training performance有用还是对testing performance有用。BN是对两个stage都有用,主要的作用还是在training不好的时候帮助比较大;如果是training已经很好但testing不好,还有很多其他方法可用

在这里插入图片描述

BN归一化的表现没有说特别突出,因为Normalization不仅仅只有BN,还有其他Layer Normalization,Instance Normalization等等,但是BN所使用最为广泛,并且如图实验数据可以看出BN的加入能够使得模型收敛速度更快并且随着batch的增大表现出更大的优势,特别是在使用sigmoid的时候,由于sigmoid函数曲线的特殊性,使得BN后输入sigmoid激活函数中能够表现出更好的梯度。要有BN,sigmoid才train的起来

Gradient Descent Theory

在这里插入图片描述

update参数后,loss不一定会下降

此时,人物往前和往右都会变低,因此会往右前方走,但是却变高了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2191025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于依赖注入技术的.net core WebApi框架创建实例

依赖注入(Dependency Injection, DI)是一种软件设计模式,用于实现控制反转(Inversion of Control, IoC)。在ASP.NET Core中,依赖注入是内置的核心功能之一。它允许你将应用程序的组件解耦和配置&#xff0c…

【JAVA开源】基于Vue和SpringBoot的服装生产管理系统

本文项目编号 T 066 ,文末自助获取源码 \color{red}{T066,文末自助获取源码} T066,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【LVGL进阶日记】① 开源LVGL在MCU上的移植

关注+星标公众号,不错过精彩内容 作者 | 量子君 微信公众号 | 极客工作室 【LVGL进阶日记】专栏目录 第一章 开源LVGL在MCU上的移植 文章目录 前言一、LVGL介绍1.1 LVGL的主要特性如下:1.2 LVGL对MCU的要求如下:二、移植LittlevGL到MCU2.1 LVGL源码下载和文件组织2.2 LVGL配…

【AI人工智能】文心智能体,你的情诗小助理,哄女朋友必备, 低代码工作流易上手,干货满满,不容错过哦

💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…

数字图像处理项目——基于Unet网络实现MRI图像的双肺区域分割(论文/代码)

完整的论文代码见文章末尾 以下为核心内容 摘要 在医学图像处理领域,肺部图像的分割是一个重要的研究方向,特别是针对肺部疾病的检测与诊断。传统的X射线和CT(计算机断层扫描)是常用的肺部成像技术,但MRI&#xff08…

I/O多路转接

目录 一、select 1.1、select概念 1.2、select 函数原型 1.3、理解 select 执行过程 1.4、select就绪条件 1.4.1、读就绪 1.4.2、写就绪 1.4.3、异常就绪(了解) 1.5、select 基本工作流程 1.6、select服务器 1.6.1、Sock.hpp 1.6.2、selectS…

python实战四:输入一个年份,判断是否是闰年

问题: 从键盘获取一个四位的整数年份,判断其是否是闰年。闰年的判断条件为︰能被4整除但不能被100整除,或者能被400整除。 需求方法: 使用 input() 函数从键盘获取输入。输入的年份是一个字符串。检查输入是否为四位数&#xf…

Elasticsearch学习笔记(四) Elasticsearch集群安全配置一

继续我们的实验。先谈一下我对Elasticsearch粗浅的一些认识,首先Elasticsearch是一个非常宏大的技术栈,发展到今天围绕着Elasticsearch已经产生了更多的组件、套件。因此在看官方文档或者别人的一些教程的时候经常会遇到ELK,elastic stack等。elastic st…

如何在电脑上浏览手机界面

联想浏览器中,点击右键-》检查,进入开发者工具: 点击如上,红色框框选中的手机浏览模式即可。

【微服务】服务注册与发现、分布式配置管理 - Nacos

概述 Nacos是阿里巴巴旗下的一个开源产品,目前市场使用率还是比较高的。在最初开源时,Nacos选择内部三个产品合并并统一开源,这三个产品分别是:非持久化注册中心(Configserver)、持久化注册中心&#xff0…

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读可重复读MVCC会出现幻读的…

腾讯自研Git客户端,助力每个人都可以轻松使用Git

工具介绍 UGit是一款腾讯自研的Git客户端,为了让每个人都可以轻松使用Git,从而提高开发效率和团队协作的流畅性。支持工蜂MR/CR,工蜂议题管理,另外对于Git的原生特性有着深度支持。 支持的系统 支持macOS 10.11、Apple Silicon和…

【数据结构】什么是哈希表(散列表)?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌哈希表的概念 📌哈希函数的构造方法 🎏直接定址法 🎏除留余数法 🎏平方取中法 🎏折叠法 &#x…

自动驾驶的技术实现及原理

自动驾驶技术是现代科技领域中一项引人注目的创新,它具有变革运输行业并提升道路安全的潜力。随着人工智能、传感器技术以及数据处理能力的不断提升,自动驾驶车辆已经从实验室研究逐渐走向现实应用。 自动驾驶的技术实现及原理 1. 自动驾驶技术的核心…

【深度学习】— 多层感知机介绍、 隐藏层、从线性到非线性、线性模型的局限性

【深度学习】— 多层感知机介绍 4.1 多层感知机4.1.1 隐藏层线性模型的局限性引入隐藏层 4.2 从线性到非线性线性组合的局限性引入非线性堆叠更多隐藏层 4.1 多层感知机 在第 3 节中,我们介绍了 softmax 回归,并实现了其从零开始的实现和基于高级 API 的…

UART通信协议

什么是UART UART ( Universal Asynchronous Receiver/Transmitter, 通用异步收发器) 是一种常用的串行通信协议,用于在 计算机和外部设备之间传输数据。它是一种异步通信协议,也就是说数据的传输不需要事先建立好同步时钟信号。 UART&#xf…

Unity MVC框架演示 1-1 理论分析

本文仅作学习笔记分享与交流,不做任何商业用途,该课程资源来源于唐老狮 1.一般的图解MVC 什么是MVC我就不说了,老生常谈,网上有大量的介绍,想看看这三层都起到什么职责?那就直接上图吧 2.我举一个栗子 我有…

深入理解 JavaScript 事件循环机制:单线程中的异步处理核心

深入理解 JavaScript 事件循环机制:单线程中的异步处理核心 JavaScript 是一门单线程的编程语言,也就是说它在同一时间只能执行一个任务。然而,现代 Web 应用经常需要处理大量的异步操作,如用户输入、网络请求、定时器等。为了确…

Vue的基本用法及模板语法

Vue.js使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue实例的数据。所有 Vue.js的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析。 在底层的实现上,Vue将模板编译成虚拟 DOM 渲染函数。结合响应系…

实现Xshell与虚拟机中Linux服务器的连接(附常见错误解决)

前言 Xshell是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 本文将介绍Xshell与虚拟机中Linux服务器连接…