在训练深度神经网络时,随着梯度的下降,网络中的参数会不断更新。当前面网络的参数发生微小变化时,随着每一层的前向传播(线性层和激活函数等)而会使该微小的变化随网络的加深而变大,同时参数的改变会使得每一层的数据分布发生变化,这就是 Internal Covariate Shift(内部协变量偏移)。由于内部协变量偏移问题,后面层的网络需要不断调整以适应前面层输入数据分布(参数)的变化,因而在训练网络时需要使用低的学习率并且谨慎选择初始化参数,这使得模型训练的很慢。而且,在深度神经网络中,若使用饱和非线性激活函数(sigmoid,tanh等),可能会导致梯度消失。
举两个例子:例1:如图一,当输入两组数据大小相差很大时(x1>>x2),在x2上梯度下降快,但在x1上无明显变化。其梯度下降图左下方所示,传统做法是对输入数据进行特征缩放,使其梯度下降如图右下方所示。但由于ICS(内部协变量偏移),若对每层做特征缩放,则很难达到所有层同步变化,因而我们必须降低学习率,谨慎选择初始化参数,致使网络训练较慢。
图一 图二例2:以使用sigmoid激活函数为例,如上图2二所示,当输入信号值很大(右侧蓝色虚线所标)或者输入信号很小(左侧蓝色虚线所标)时,梯度接近于零,因而容易产生梯度离散现象。
白化是机器学习规范数据分布的方法,主要有PCA白化和ZCA白化。它们的目的是去除特征间的相关性,并且使得输入特征分布具有相同的均值和方差。PCA白化和ZCA白化的主要区别是PCA处理后数据服从均值为0,方差为1的标准正态分布;ZCA处理后数据服从均值为0,方差为任意一个值的正态分布。白化通过固定输入特征的分布,加速了模型的训练,但白化也存在一定的问题,如:计算成本高,改变了神经网络本身层的数据表达能力(表达意义)。
BN就是将打乱的数据集分为若干batch,对于每一个batch单独做normaliazation,使其输入特征服从均值为0,方差为1的标准正态分布。为了保证数据能够表达出原有的含义,对normalization后的数据作线性变换,使其能够表达出原有含义。BN的目的就是通过改变输入数据分布来得到较优梯度。
normalization:
线性变换:
在训练集上,BN步骤为,输入一个mini-batch,求出mini-batch的均值和方差,进行标准化处理,线性变化(变换和平移)。
在测试集上,记录训练集上每个batch均值的期望和方差的期望作为测试集的均值和方差。
使用训练好的β,γ进行线性变换
训练一个Batch Normalization网络完整算法
注:μ, 由batch中的data决定;β,γ 是网络中的参数,是学习得到的;ε防止方差为0,保持数值的稳定性。
1、对模型初始化和超参数的影响不敏感。如下图所示,将参数乘以k倍,最后结果不变。
2、加速模型的收敛,能使用大的学习率。
3、有一定的正则化作用,不用dropout,减少正则化的使用,不易过拟合。batch中的数据都是从总体样本中抽样,但不同的mini-batch的均值方差不同,这就相当于增加了随机噪声,与dropout关闭神经元带来噪声类似,有一定正则化效果。
4、去除局部响应归一化(Alexnet用到的方法),相当于做了数据增强。
1、batchsize 选择要慎重,太小的batch可能得到的均值方差不准确,影响训练。
2、不太适用于RNN。
1、https://arxiv.org/abs/1502.03167 《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
2、https://www.bilibili.com/video/BV1Ey4y1y7g1/?share_source=copy_web&vd_source=18dcc28103cc0293145a663372a414fa
3、Batch Normalization(批量归一化)的作用_真心乖宝宝的博客-CSDN博客_批量归一化的作用a