深度学习网络层之 Batch Normalization
Batch Normalization
Ioffe 和 Szegedy 在2015年《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》论文中提出此方法来减缓网络参数初始化的难处.
Batch Norm优点
- 减轻过拟合
 - 改善梯度传播(权重不会过高或过低)
 - 容许较高的学习率,能够提高训练速度。
 - 减轻对初始化权重的强依赖
 - 作为一种正则化的方式,在某种程度上减少对dropout的使用。
 
Batch Norm层摆放位置
在激活层(如 ReLU )之前还是之后,没有一个统一的定论。在原论文中提出在非线性层之前(CONV_BN_RELU),而在实际编程中很多人可能放在激活层之后(BN_CONV_RELU)。
Batch Norm原理
内部协转移(Internal Covariate Shift):由于训练时网络参数的改变导致的网络层输出结果分布的不同。这正是导致网络训练困难的原因。
对输如进行白化(whiten:0均值,单位标准差,并且decorrelate去相关)已被证明能够加速收敛速度,参考Efficient backprop. (LeCun et al.1998b)和 A convergence anal-ysis of log-linear training.(Wiesler & Ney,2011)。由于白化中去除相关性类似PCA等操作,在特征维度较高时计算复杂度较高,因此提出了两种简化方式:1)对特征的每个维度进行归一化,忽略白化中的去除相关性 ;2)在每个mini-batch中计算均值和方差来替代整体训练集的计算.
batch normalization中即使不对每层的输入进行去相关,也能加速收敛。通俗的理解是在网络的每一层的输入都做了归一化预处理。
unit gaussian activations:
\[
\hat x^{(k)}=\frac{x^{(k)}-E[x^{(k)}]}{\sqrt{\operatorname{Var[x^{(k)}]}}}
\]
公式中k为通道channel数。
\[
\text{Batch Normalizing Transform} \\
\begin{align}
u &= \frac{1}{m}\sum_{i=1}^m x_i &\text{//mini-batch mean} \\
var &= \frac{1}{m} \sum_{i=1}^m (x_i - u)^2 &\text{//mini-batch variance} \\
\hat{x_i} &= \frac{x_i - u}{\sqrt{var + \epsilon}} &\text{//normalize} \\
y_i &= \gamma \hat{x_i} + \beta &\text{//scale and shift}
\end{align}
\]
其中ϵ是为了防止方差为0导致数值计算的不稳定而添加的一个小数,如1e−6。可以看做是在原网络中插入了一个
注意,在对每层的输入进行正则化之后会改变特征的表示,如对sigmoid输入进行正则化后将数据限制在进行线性的区域,这样改变了原始特征的分布。如下图所示:

论文中引入了两个可学习的参数\(\gamma , \beta\)来还原原始特征分布。这两个参数学习的目标即为\(\gamma=\sqrt{\text{Var}[x]}、 \beta=\mathbb E[x]\).原来的分布方差和均值由前层的各种参数weight耦合控制,而现在仅由\(\gamma , \beta\)控制,这样在保留BN层足够的学习能力的同时,我们使得其学习更加容易。因此,加速收敛并非由于计算量减少(反而由于增加了参数增加了计算量)。梯度计算如下:

在训练时计算mini-batch的均值和标准差并进行反向传播训练,而测试时并没有batch的概念,训练完毕后需要提供固定的\(\bar\mu,\bar\sigma\)供测试时使用。论文中对所有的mini-batch的\(\mu_\mathcal B,\sigma^2_\mathcal B\)取了均值(m是mini-batch的大小,\(\bar\sigma^2\)采用的是无偏估计):
\[
\begin{align}
\bar\mu &=\mathbb E[\mu_\mathcal B] \\
\bar\sigma^2 &={m\over m-1}\mathbb E[\sigma^2_\mathcal B]
\end{align}
\]
测试阶段,同样要进行归一化和缩放平移操作,唯一不同之处是不计算均值和方差,而使用训练阶段记录下来的\(\bar\mu,\bar\sigma\)。
\[
\begin{align}
y&=γ({x-\bar\mu\over\sqrt{\bar\sigma^2+ϵ}})+ β \\
&={γ\over\sqrt{\bar\sigma^2+ϵ}}\cdot x+(β-{γ\bar\mu\over\sqrt{\bar\sigma^2+ϵ}})
\end{align}
\]
caffe框架中该层全局均值和方差的实现
与论文计算 global 均值和 global 方差的方式不同之处在于,Caffe 中的 global 均值和 global 方差采用的是滑动衰减平均的更新方式,设滑动衰减系数moving_average_fraction 为 λ,当前的 mini-batch 的均值和方差分别为 \(\mu_B,\sigma_B^2\):
\[
\mu_{new}  =  \lambda \mu_{old} + \mu_B \\
\sigma_{new}^2 =
\begin{cases}
\lambda \sigma_{old}^2 + \frac{m - 1}{m} \sigma_B^2 & m > 1 \\
\lambda \sigma_{old}^2 & m = 1
\end{cases}
\]
Batch Norm在卷积层的应用
前边提到的mini-batch说的是神经元的个数,而卷积层中是堆叠的多个特征图,共享卷积参数。如果每个神经元使用一对\(\gamma , \beta\)参数,那么不仅多,而且冗余。可以在channel方向上取m个特征图作为mini-batch,对每一个特征图计算一对参数。这样减少了参数的数量。
应用举例-VGG16
为VGG16结构模型添加Batch Normalization。
- 重新完全训练.如果想将BN添加到卷基层,通常要重新训练整个模型,大概花费一周时间。
 - finetune.只将BN添加到最后的几层全连接层,这样可以在训练好的VGG16模型上进行微调。采用ImageNet的全部或部分数据按batch计算均值和方差作为BN的初始\(\beta,\gamma\)参数。
 
深度学习网络层之 Batch Normalization的更多相关文章
- 深度解析Droupout与Batch Normalization
		
Droupout与Batch Normalization都是深度学习常用且基础的训练技巧了.本文将从理论和实践两个角度分布其特点和细节. Droupout 2012年,Hinton在其论文中提出Dro ...
 - 深度学习中优化【Normalization】
		
深度学习中优化操作: dropout l1, l2正则化 momentum normalization 1.为什么Normalization? 深度神经网络模型的训练为什么会很困难?其中一个重 ...
 - 深度学习中的batch、epoch、iteration的含义
		
深度学习的优化算法,说白了就是梯度下降.每次的参数更新有两种方式. 第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度.这种方法每更新一次参数都要把数据集里的所有样本都看一遍, ...
 - 深度学习中的batch的大小对学习效果的影响
		
Batch_size参数的作用:决定了下降的方向 极端一: batch_size为全数据集(Full Batch Learning): 好处: 1.由全数据集确定的方向能够更好地代表样本总体,从而更准 ...
 - 深度学习网络层之 Pooling
		
pooling 是仿照人的视觉系统进行降维(降采样),用更高层的抽象表示图像特征,这一部分内容从Hubel&wiesel视觉神经研究到Fukushima提出,再到LeCun的LeNet5首次采 ...
 - 深度学习(二十九)Batch Normalization 学习笔记
		
Batch Normalization 学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce 一.背景意义 ...
 - 【深度学习】批归一化(Batch Normalization)
		
BN是由Google于2015年提出,这是一个深度神经网络训练的技巧,它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中"梯度弥散"的问题,从而使得训练深层网 ...
 - caffe︱深度学习参数调优杂记+caffe训练时的问题+dropout/batch Normalization
		
一.深度学习中常用的调节参数 本节为笔者上课笔记(CDA深度学习实战课程第一期) 1.学习率 步长的选择:你走的距离长短,越短当然不会错过,但是耗时间.步长的选择比较麻烦.步长越小,越容易得到局部最优 ...
 - 【深度学习】深入理解Batch Normalization批标准化
		
这几天面试经常被问到BN层的原理,虽然回答上来了,但还是感觉答得不是很好,今天仔细研究了一下Batch Normalization的原理,以下为参考网上几篇文章总结得出. Batch Normaliz ...
 
随机推荐
- LAMP环境的搭建(二)----Mysql安装与配置
			
Mysql是一款免费开源的关系型数据库. 尽管Mysql被oracle公司收购.但是oracle并没有限制了mysql的发展. 目前mysql是使用范围最广的关系型数据库,许多大型公司也在使用.截至本 ...
 - [译] OpenStack Pike 版本中的 53 个新功能盘点
			
原文:https://www.mirantis.com/blog/53-things-to-look-for-in-openstack-pike/ 作者:Mirantis Nick Chase 发 ...
 - 转每天一个linux命令(7):mv命令
			
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...
 - Java入门(7)——循环和debug 调试
			
循环: while 循环: 格式: int i = 0; ① //初始化条件 while(i < 10) { ② //判断条件 System.out.println(i); ④ //循环 ...
 - 函数作用域中的this问题
			
首先一起回顾下预解析和作用域吧: 预解析: 浏览器每读到一个script标签或function,先不执行任何代码,会先把整个代码快速的浏览一遍,然后从中 挑出 var 和 function两个关键字 ...
 - php 数据访问练习:租房查询页面
			
<html> <head> <title></title> <meta charset="UTF-8"/> <li ...
 - live事件的替代方法on的使用注意事项
			
根据jQuery的官方描述,live方法在1.7中已经不建议使用,在1.9中删除了这个方法.并建议在以后的代码中使用on方法来替代. on方法可以接受三个参数:事件名.触发选择器.事件函数. 需要特别 ...
 - [js高手之路]node js系列课程-创建简易web服务器与文件读写
			
web服务器至少有以下几个特点: 1.24小时不停止的工作,也就是说这个进程要常驻在内存中 2.24小时在某一端口监听,如: http://localhost:8080, www服务器默认端口80 3 ...
 - jmeter后置处理器  JSON Extractor取多个变量值
			
1.需要获取响应数据的请求右键添加-后置处理器-JSON Extractor 2.如果要获取json响应数据多个值时,设置的Variable names (后续引用变量值的变量名设置)与JSON Pa ...
 - Jmeter之Bean shell学习(一)
			
一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanS ...