论文地址:https://arxiv.org/pdf/1502.03167.pdf
《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》批归一化:通过减小内部协变量移位加速深度网络训练,是2015年收录在cv.LG中的论文。
由于深度神经网络中每一层输入都依赖之前层的处理,在不同训练阶段分布也不相同,因此网络的初值非常重要,在修改网络参数时也不能使用太大的学习率(不能一次调整太多),因此需要训练很长时间才能收敛,这还引起了饱合的非线性函数(主要指sigmoid函数,后面详述)难以训练的问题。文中将这一现象称为内部协变量转移(internal covariateshift)。文中用批归一化层缓解了这一问题,具体方法是对每个mini-batch做归一化。它比普通训练收敛加速****14****倍,并且提高了精度。
介绍
梯度下降法的核心是求取合理的模型参数Θ,使误差函数最小化:
训练集中共N个实例,每个训练步(step)使用其中m个实例训练(mini-batch),每一步根据目标函数l在梯度方向上调整网络参数:
使用多个实例训练时计算整体梯度,当m较大时,训练的质量相对更高,且并行处理速度更快。由于每一层的输入都受到之前各层参数的影响,每个对模型参数的微小改变都将影响到深层。
由于网络参数始终外于不断变化之中,每一层的输入也不断变化,参数又需要调整以适应新的输入数据的分布,这种现象被称为covariate shift协变量移位。
最初covariate shift是指在迁移学习中,或者在训练集和测试集分布不一致的情况下,如用数据集A训练模型,在数据集B上应用模型,如果A与B上分布相似,则模型效果较好。如果数据A与B的分布不一致。一种解决方法是使用转换T,B*T=A,把B转换成类似A的数据,使得B使用模型时效果更好。
在神经网络内部也是如此,它的每一层都可以看成一个模型,模型输入的分布越稳定,模型训练效果就越好,这样网络内部的参数就不用因为输入的不同反复调整。
固定网络输入的分布同样有利于网络中其它层的训练,假设网络中使用了sigmoid激活函数,z =g(Wu + b),其中u是网络输入,W,b是被训练的网络参数,g是激活函数,z是最终结果。sigmoid函数定义如下:
当x的绝对值增大到一定程度时,其导数g’(x)趋近于0(随着|x|越大,g(x)的变化越不明显),这就意味着除非x=Wu+b足够小,否则调参将非常慢,即梯度消失问题。之前常用ReLU激活函数、调整参数初值,降低学习率等方法缓解这一问题,如果能将其分布固定下来,则能更有效地解决此问题。
Batch Normalization方法可以减轻covariate shift的影响,归一化也减轻了网络参数和初值的影响,让开发者可以使用更高的学习率,并且可替代部分的Dropout,并且解决了非线性函数的饱合问题(上面提到的sigmoid引发的问题)。
减少内部变量移位(Internal Covariate Shift)
之前的研究证明白化数据可加速模型训练,白化一般指将数据转换成均值为0,标准差为1,且元素之间相关性低的数据。由于层与层之间相互影响,对每一层进行白化操作,将改进各层输入的分布,从而减少Internal Covariate Shift的影响。
如果将归一化层插进神经网络的各个层之间,假设某一层的操作是x=u+b,其中u是该层输入,b是偏移,对该层输出做如下归一化:
如果梯度下降时忽略E[x]与b的相关性,则更新b时只需要计算b←b+ ∆b,因此,有:
结合了对b的更新及后续的归一化将不会影响该层的输出和损失函数(更新了也没用),这样随着训练次数的增加,b将越来越大,而loss却固定不变。在E不只计算位移(减均值相当于向中心移动),同时也考虑缩放时该问题更加明显。
引起上述问题的原因是梯度下降时并未将正则化的影响考虑在内,实际上E[x]与b并非不相关。可将归一化写成如下函数的形式:
归一化的结果不仅取决于实例x,也取决于训练数据中的所有元素X,数据集中的其它元素也由上一层的b计算得出。因此,在反向传播时,应该分别计算对x和X的偏导。
如果忽略了后边的一项,则可能引发上述的梯度爆炸问题。
一般情况下白化,需要计算协方差矩阵以消除各元素之间的相关性,及计算平方根,反向传播等等操作比较复杂,因此,希望能找到一种既可导,又不需要在每次调参时都计算所有训练数据的归一化方法。
使用Mini-Batch的统计值归一化
文中提出的方法是用均值为0,方差为1方法的归一化,之前也有论文证明了,归一化的特征即使不去相关性,也能加速收敛。
通过简单的归一化操作之后,数据的内容就被改变了,这可能引起一些问题,例如在归一化后使用sigmoid激活函数,归一化可能将数据转换到非线性函数的线性段之内(sigmoid在0附近的小区域内几乎是线性函数,这样归一化就把非线性转换变成了线性转换)。为解决此问题,引入了参数γβ,分别用于缩放和平移(类似于一个普通的线性层)。
在γ是标准差,β是均值的情况下,γ和β操作相当于将数据还原成归一化之间的内容,而此处的γβ通过训练调参得到。也就是说,如果需要,模型可将其还原到归一化之前的状态。
另外,很难实现用全部训练数据做归一化,文中通过统计每一步mini-batch的数据,对每一个维度(如图像通道)分别计算归一化,这里用方差替代了协方差,具体算法如下:
其中每个元素都是可微的,可用链式法则计算:
使用BN网络训练和预测
预测(或称推理inference,即:使用模型)时与训练时的方法不同,一般在测试时只希望对输入值计算,并不一定有一组输入用于计算统计信息。因此使用模型训练阶段的均值和方差,此时BN变成了简单的线性变换。
在卷积网络中使用BN
假设网络处理了仿射变换(线性变换)和非线性的激活函数:z=g(Wu+b),其中u是输入,W、b是模型参数,g是激活函数。该公式对全连接层和卷积层同样适用,一般将归一化层加在线性变换和激活函数之间。原因是:输入u也是之前层非线性函数的输出,它的分布在训练过程中不断改变,相对来说Wu+b更加对称,且非稀疏,更近似高斯分布,对其做归一化的效果也更好。
对于卷积层,对不同的位置做相同的特征映射(feature map),卷积层的归一化也同理,对每个mini-batch中的每个空间区域做同样的归一化处理。因此,对每一个小区域训练γβ,替代对整个层的mini-batch训练γβ。
使用更高的学习率
在传统的深度网络中,较高学习率往往引起梯度爆炸、梯度消失,或者陷入局部最小值。BN防止了小的改变通过多层网络传播被放大的问题。
较大的学习速率会放大网络参数,在反向传播过程中放大梯度,导致模型爆炸。而BN处理可使反向传播不受参数缩放的影响。假设参数被放大了a倍:BN(Wu) =BN((aW)u)。求导过程中:
这使缩放不影响梯度传播,BN也能使参数更稳定的增长。
实验
下图为对比使用BN在MINST数据集上的效果,从(a)可以看到使用了BN之后,模型更加稳定快速收敛。(b)(c)中展示了送入sigmoid函数数据分布的15,50,85分位数的变化过程,可以看到BN变化更加稳定。
在ImageNet图片分类任务中,除增加BN层以外,还了加大了学习率;去掉了Dropout层;减小了l2损失的权重;加快了学习率衰减;去掉了本地响应归一化(Local Response Normalization);使用更加彻底地洗牌(shuffle),在训练数据中within-shard shuffling,并防止同样实例出现在同一mini-batch中;减少了图片扭曲。
下图是使用了BN的效果对比:
其中Inception是未被修改的基础模型,BN-Baseline是加入了BN的模型;BN-x5将学习率提升5倍;BN-30将学习率提升30倍;BN-x5-Sigmoid将激活函数从ReLU改为Sigmoid,菱形为达到Inception模型最佳效果的迭代次数。
网友评论