文章:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

什么是BN层

BN层(Batch Normalization)顾名思义是对一个batch的数据进行标准化,一般用在网络的中间层,其计算方式如下:
image.png
主要步骤:

  • 计算每一个batch的均值;
  • 计算每一个batch的方差;
  • 使用计算得到的均值和方差,对数据进行归一化操作,获得0~1分布;
  • 尺度变换与偏移:归一化之后的数据会被限制在正态分布下,使得网络的表达能力下降,因此引入尺度因子和平移因子(神经网络中的BN层 - 图2)使其具备了保留学习到的特征的能力(神经网络中的BN层 - 图3,此时恢复为原始特征)。

CNN中的BN层对batch中的channel做归一化,归一化维度为[N,H,W]。
第1个样本的第一个通道,加上第2个样本的第一个通道,……,第N个样本的第一个通道,得到第一个通道的均值(除以NHW而不是单纯除以N,最后得到的是代表这个batch的第一个通道的平均值的数字,而不是一个H×W的矩阵)。同样的方法求出方差。

BN的出发点

神经网络训练过程中,由于参数不断更新,除了输入层的数据外,后面网络每一层的输入数据分布是一直在发生变化的。而神经网络学习本质是学习到数据的分布,若每批训练数据的分布各不相同,那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练收敛速度。网络中间层在训练过程中,中间层数据分布的改变称之为“Internal Covariate Shift”。Batch Normalization的提出就是要解决该问题。

covariate shift:这个现象指的是训练集数据分布与预测集数据分布不一致。

主要作用

  • 加快网络的训练收敛速度(网络参数初始化不敏感,允许更大的学习率);
  • 控制梯度爆炸防止梯度消失
  • 增强泛化性能,防止过拟合(减少dropout,L2正则的依赖);
  • 可以把训练数据彻底打乱。防止了每批训练的时候,某一个样本经常被挑选到。论文中指出这个操作可以提高1%的精度。
  • 不再需要局部响应归一化。

几个概念

梯度消失

网络前向传播过程中,如果网络使用sigmod激活函数,经过sigmod单元,需要乘sigmoid的梯度,而sigmoid的梯度最大是0.25,若前向传播网络层的参数神经网络中的BN层 - 图4,则越靠近输入层的梯度就越小,导致网络训练过程中仅更新只是靠近输出层的部分,靠近输入层的部分几乎不更新,这就是梯度消失。

梯度爆炸

与梯度消失类似,若前向传播过程中的网络层参数神经网络中的BN层 - 图5很大,大过了sigmoid带来的梯度减小的影响,即神经网络中的BN层 - 图6,则在前向传播过程中梯度不断增加,导致梯度过大,这个现象就是梯度爆炸。

过拟合

网络过度拟合训练数据,泛化性能差,对训练集外的数据无法进行良好的预测。

作用分析

加速网络训练收敛

在深度神经网络中,每一层的输入数据分布是一直在发生变化,将会导致网络非常难收敛和训练。若每个batch输入数据的分布一致,则网络可以更快的拟合这个分布,加快收敛速度。如下图所示,若每次输入数据的分布不同,假如当前网络层已经找到一个划分左上角数据的超平面,当下一批次数据是另一种分布(右下角)网络又要去学习划分这个分布数据的超平面。这样就会造成网络不断抖动,难以收敛。
神经网络中的BN层 - 图7

对网络参数初始化不敏感

训练数据如果分布在右上角,我们在初始化网络参数w和b的时候,可能得到的分界面是左下角那些线,需要经过训练不断调整才能得到穿过数据点的分界面,这个就使训练过程变慢了;如果我们将数据标准化后,得到的数据点就是坐标上的一个圆形分布,如图中间的数据点,这时候随便初始化一个w,b设置为0,得到的分界面已经穿过数据了,因此训练调整,训练进程会加快,故对网络参数初始化不敏感。
神经网络中的BN层 - 图8

允许使用更大的学习率

未采用BN时,较大的学习率会导致输出结果的变化大,也就是中间层的输入分布变化大,BN解决了这个问题,缓解了网络对学习率的敏感性,可采用较大的学习率,加速网络学习。

控制梯度消失和梯度爆炸

经过BN后,网络层的输出值较小在0附近,这样能使得sigmoid的梯度更大,从而缓解梯度消失。
通过规范化操作将输出x规范化到均值为0,方差为1保证网络的稳定性。反向传播式子中有w的存在,所以w的大小影响了梯度的消失和爆炸,BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题。

防止过拟合

在网络的训练中,BN的使用使得一个mini-batch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合。

BN层的位置

BN层一般用在线性层和卷积层后面,而不是放在非线性单元后。因为非线性单元的输出分布形状会在训练过程中变化,归一化无法消除他的方差偏移,相反的,全连接和卷积层的输出一般是一个对称,非稀疏的一个分布,更加类似高斯分布,对他们进行归一化会产生更加稳定的分布。

BN中的参数更新

image.png

模型测试阶段的BN

在测试阶段,所有参数的取值是固定的,对BN层而言,意味着均值μ、方差σ、γ、β都是固定值。γ和β比较好理解,随着训练结束,两者最终收敛,预测阶段使用训练结束时的值即可。对于μ和σ,在训练阶段,它们为当前mini batch的统计量,随着输入batch的不同,μ和σ一直在变化。在测试阶段,输入数据可能只有1个,该使用哪个μ和σ,或者说,每个BN层的μ和σ该如何取值?一个建议的方案是采用训练收敛最后几批mini-batch的μ和σ的期望,作为预测阶段的μ和σ(下图7-11)。
image.png

参考