Batch Normalization详解(原理+实验分析)
Batch Normalization详解(原理+实验分析)
- 1. 计算过程
- 2. 前向传播过程
- 3. 反向传播过程
- 4. 实验分析
- 4.1 实验一:验证有没有BatchNorm下准确率的区别
- 4.2 实验二:验证有没有BatchNorm+noisy下准确率的区别
- 4.3 实验三:验证有没有BatchNorm+noisy下准确率的区别
- 4.4 实验小结
- 5. BatchNorm的其他细节
- 5.1 训练和推理阶段时参数的初始化问题
- 5.2 BatchNorm在哪个位置最好?
- 5.3 在训练时为什么不直接使用整个训练集的均值/方差?
- 5.4 在预测时为什么不直接使用整个训练集的均值/方差?
- 5.5 batch_size的配置
- 5.6 对学习率有何影响?
- 5.7 BN是正则化吗?
- 5.8 与Dropout的有何异同?
- 5.9 能否和Dropout混合使用?
- 5.10 BN可以用在哪些类型的网络?
- 5.11 缺点
注:本文内容和我的另一篇博客:,在内容上有些重合。本文前三节都是一些表面的东西,第四节注重BN本身的意义和问题,即实验分析,建议重点放在第四节。
1. 计算过程
简单地说,就是在batch的维度上计算相同通道上的均值和方差;然后再用相同batch维度上的均值和方差来做标准化。具体计算过程演示图如下:
认真看应该会看明白吧,看不懂的欢迎下面留言提问。
2. 前向传播过程
未加入Normalization之前的神经网络长成这样:
就是简单的两层全连接,中间有一个激活函数,没啥好说的。
加入BN后前向传播长成这样:
就是在激活函数之后,计算均值和方差做标准化,然后使用γ\gammaγ做缩放,β\betaβ做平移(初始化为1、0)。
均值和方差比较好理解,但是缩放系数γ\gammaγ和平移系数β\betaβ具体有什么意义呢?
由标准化公式xi^=xi−μσ2+ϵ\hat{x_{i}}=\frac{x_{i}-\mu}{\sqrt{\sigma^{2}+\epsilon}}xi^=σ2+ϵxi−μ,可变换下得到:
xi=σxi^+μ(1)x_{i}=\sigma \hat{x_{i}}+\mu \tag{1}xi=σxi^+μ(1)
再看下还原公式:
yi=γxi^+β(2)y_{i}=\gamma \hat{x_{i}}+\beta \tag{2}yi=γxi^+β(2)
(2)中γ\gammaγ和β\betaβ都是向量,显然γ\gammaγ是对 xi^\hat{x_{i}}xi^的缩放,β\betaβ 是对γxi^\gamma\hat{x_{i}}γxi^的平移。可以增加可学习的参数γ\gammaγ、β\betaβ,如果γ=σ\gamma=\sigmaγ=σ, β=μ\beta = \muβ=μ,则yi=xiy_{i}=x_{i}yi=xi,即可以完全还原到未normalization之前的输入!
我们可以通过反向传播来训练这两个参数(推导表明这是可以训练的),而至于 γ\gammaγ 多大程度上接近σ\sigmaσ ,β\betaβ 多大程度上接近 μ\muμ ,让损失函数对它们计算出的梯度决定!
另外贴一张别人写的计算BN的例子:
3. 反向传播过程
前向传播很好理解,反向传播就比较复杂,这块要是掰开了揉碎了说的话,又会占用大量的篇幅,所以我在我的另一篇博客:Batch Normalization的反向传播解说详细说明了BN的反向传播,欢迎关注、评论转发。
4. 实验分析
本文中涉及到的实验数据及分析,均来自于论文《How Does Batch Normalization Help Optimization?
》
4.1 实验一:验证有没有BatchNorm下准确率的区别
实验设置:
· 任务:分类
· 数据集:CIFAR-10
· backbone:VGG
· 对比条件:两个变量,即有没有使用BatchNorm和学习率
分析:
- 不同点:
· a. 图一中表明,在训练时,使用BatchNorm会比不使用更快的进入到收敛状态
· b. 图二中表明,在测试时,使用BatchNorm会比不使用达到更高的准确率- 相同点:
· c. 图三中表明,使用和不使用BatchNorm,在特征权重分布上的差异不明显
针对上述的c点,不禁让我们怀疑了,BatchNorm对分布约束是否有作用?下面用实验二来验证。
4.2 实验二:验证有没有BatchNorm+noisy下准确率的区别
实验设置:
· 任务:分类
· 数据集:CIFAR-10
· backbone:VGG
· 对比条件:两个变量,即有没有使用BatchNorm和随机噪声
分析:
- 不同点:
· a. 图一中表明,在训练时,使用BatchNorm会比不使用更快的进入到收敛状态
· b. 图一中表明,在训练时,即使存在噪声,使用BatchNorm也会比不使用更快的进入到收敛状态
· c. 图二中表明,添加噪声后的模型的某一层的分布,会比不使用BatchNorm和没有噪声的BatchNorm的稳定性更差- 相同点:
· d. 图一中表明,添加的噪声的模型,在有BatchNorm的作用下,噪声对模型的影响十分的小
显然,这些发现很难与BatchNorm带来的性能提升源于层输入分布稳定性增加的说法相一致,所以下面进行实验三。
4.3 实验三:验证有没有BatchNorm+noisy下准确率的区别
根据上图,概括性地说,BatchNorm改善了损失的平滑性,使得损失函数曲面变得平滑,而平滑的损失函数进行梯度下降法变得非常容易。(“平滑性”参考下图)
4.4 实验小结
为什么BatchNorm会好使?从上面的三个实验可以看出,其原因并不主要是因为对分布有了较稳定的约束能力,更主要的原因是BatchNorm改善了损失的平滑性!
5. BatchNorm的其他细节
5.1 训练和推理阶段时参数的初始化问题
在训练阶段, 均值μ\muμ和方差σ\sigmaσ不用初始化,是计算出来的;缩放系数γ\gammaγ和β\betaβ分别初始化为1和0,训练阶段结束,模型会学习出γ\gammaγ和β\betaβ作为推理阶段的初始化。
在推理阶段, 缩放系数γ\gammaγ和β\betaβ分别初始化训练阶段学习到的值;均值μ\muμ和方差σ\sigmaσ利用训练集统计的均值和方差,统计方式一般包括移动平均和全局平均。(即在训练的时候实现计算好 mean 和 var 测试的时候直接拿来用就可以了,不用计算均值和方差。)
计算方法见我的另一篇博客:BatchNorm怎样解决训练和推理时batch size 不同的问题?
5.2 BatchNorm在哪个位置最好?
首先,由3中的反向传播可以知道,BatchNorm放在任何位置都能进行求导,所以BatchNorm放在哪里都行。
放在哪里最好?这个问题已经有大量的文论说明了,看论文吧(后续整理)
5.3 在训练时为什么不直接使用整个训练集的均值/方差?
使用 BN 的目的就是为了保证每批数据的分布稳定,使用全局统计量反而违背了这个初衷。
5.4 在预测时为什么不直接使用整个训练集的均值/方差?
完全可以。由于神经网络的训练数据量一般很大,所以内存装不下,因此用指数滑动平均方法去近似值,好处是不占内存,计算方便,但其结果不如整个训练集的均值/方差那么准确。
5.5 batch_size的配置
不适合batch_size较小的学习任务。因为batch_size太小,每一个step里前向计算中所统计的本batch上的方差和均值,噪音声量大,与总体方差和总体均值相差太大。前向计算已经不准了,反向传播的误差就更大了
5.6 对学习率有何影响?
由于BN对损失函数的平滑作用,因此可以采用较大的学习率。
5.7 BN是正则化吗?
在深度学习中,正则化一般是指为避免过拟合而限制模型参数规模的做法。即正则化=简化。BN能够平滑损失函数的曲面,显然属于正则化。不过,除了在过拟合时起正则作用,在欠拟合状况下,BN也能提升收敛速度。
5.8 与Dropout的有何异同?
BN由于平滑了损失函数的梯度函数,不仅使得模型训练精度提升了,而且收敛速度也提升了;Dropout是一种集成策略,只能提升模型训练精度。因此BN更受欢迎。
5.9 能否和Dropout混合使用?
虽然混合使用较麻烦,但是可以。不过现在主流模型已经全面倒戈BN。Dropout之前最常用的场合是全连接层,也被全局池化日渐取代
5.10 BN可以用在哪些类型的网络?
其他的都行,RNN网络不ok,因为无论训练和测试阶段,每个batch上的输入序列的长度都不确定,均值和方差的统计非常困难。
5.11 缺点
模型运行时间长
Batch Normalization详解(原理+实验分析)相关推荐
- 批归一化(Batch Normalization)详解
批归一化(Batch Normalization)详解 文章目录 批归一化(Batch Normalization)详解 前言 一.数据归一化 二.BN解决的问题:Internal Covariate ...
- Batch Normalization详解以及pytorch实验
Batch Normalization是google团队在2015年论文<Batch Normalization: Accelerating Deep Network Training by R ...
- 【深度学习】Batch Normalization详解
Batch Normalization 学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce 一.背景意义 ...
- batch normalization详解
1.引入BN的原因 1.加快模型的收敛速度 2.在一定程度上缓解了深度网络中的"梯度弥散"问题,从而使得训练深层网络模型更加容易和稳定. 3.对每一批数据进行归一化.这个数据是可以 ...
- Conditional Batch Normalization 详解(SFT思路来源)
Conditional Batch Normalization 的概念来源于这篇文章:Modulating early visual processing by language .后来又先后被用在 ...
- EMD算法之Hilbert-Huang Transform原理详解和案例分析
目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...
- 并发编程五:java并发线程池底层原理详解和源码分析
文章目录 java并发线程池底层原理详解和源码分析 线程和线程池性能对比 Executors创建的三种线程池分析 自定义线程池分析 线程池源码分析 继承关系 ThreadPoolExecutor源码分 ...
- 第20节 核心交换机配置热备份详解及实验演示—基于Cisco Packet Tracer
核心交换机配置热备份详解及实验演示 1 网络规划 1.1 核心交换机的重要性及作用 1.2 对核心交换机做热备份 2 拓扑图分析 2.1 网络环路问题及解决方案 2.1.1 网络环路问题 2.1.2 ...
- java list用法_Java List 用法详解及实例分析
Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...
最新文章
- ASP.NET中的母版页
- 通过Ajax来简单的实现局部刷新(主要为C#中使用的UpdatePanel控件和ScriptManager控件)...
- *36.操作系统中磁盘的调度算法
- 前后端分离的跨域解决方案
- 专门用于微信公众平台的Javascript API
- fs react 使用 保存文件_使用FS进行文件同步和备份
- [转帖]FPGA--Vivado
- 2万字带你攻略掉Selenium
- 虚拟化基础架构Windows 2008篇之2-域用户与域用户组管理
- 3.Knockout.Js(属性绑定)
- 嵌入式系统三级考试终结版2019.3
- Gary Marcus:因果熵理论的荒诞和认知科学带给AI的11个启示 | 文末赠书
- 使用STM32CubeProgrammer烧录STM32芯片
- sharepoint 回收站 java_Sharepoint 2013 回收站知识整理
- 炼石喜获“2020中国网络安全产业联盟突出贡献单位奖”
- Android 手机遥控器添加模拟鼠标功能
- python适合做网页吗_python是否适合网页编程详解
- C语言语音朗读小工具
- 战地4服务器物理地址,战地4 游戏服务器地址
- R语言爬虫豆瓣高评分电影(喝最烈的酒,熬最深的夜,吃最好的胃药,敷最贵的面膜)
热门文章
- python基础语法和变量
- Kafka bootstrap.servers
- 天使的微笑——《天使爱美丽》
- 服务器地址错误如何修复,ip地址错误怎么办
- System.setOut()重定向输出解释
- Local declaration of 'XXX' hides instance variable
- DICOM MPPS 的原理及应用(Principle and Application of DICOM MPPS)
- flink on yarn使用第三方jars的方法如何查看进程所持有jar包
- yii mysql gii_Yii 框架使用Gii生成代码操作示例
- Python学习 - 冯诺伊曼体系结构建模与模拟 之TOY模型机