08 BN: Accelerating Deep Network Training by Reducing Internal Covariate Shift
对于deepNN的训练为什么复杂:
一旦之前的层的参数变了,这一层的输入的分布就会发生变化(可能很显著),这样就需要降低learning rate以及仔细的参数初始化。当整体分布逐渐往非线性函数的取值区间的饱和部分逼近时,反向传播的梯度可能消失收敛很慢
以上的现象称为internal covariate shift(在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程)
ICS(内部变量分布迁移问题)带来的问题:
1)更深层的网络需要不断调整来适应不断变化的输入的分布
2)训练过程中容易陷入梯度饱和区,减缓训练速度
为了解决,提出bn,这样可以:
1)可以使用更大的learning rate
2)可以不必太仔细地选择调试参数初始化方法
3)正则化方法
Introduction
minibatch好用
深层网络训练很难:随着前面的网络的参数变化,深层的网络的输入的分布会发生很剧烈的变化(有点类似蝴蝶效应,变化会越放越大)。就需要一直去调整以适应不同的输入分布,但是这肯定是很浪费时间不利于训练的
如果可以一直保持输入的分布不变,是有利于训练的,因为就不用再训练的时候先调整参数以补偿输入x的分布变化
而且保持输入分布不变,就可以使得这一层的输出可以保持在一个相对不饱和的区域(不然大家都越变越大然后陷入饱和区域梯度变小)。如果可以保持非线性单元的输入的分布大致不变,是可以减少陷入饱和区域的几率、加速收敛的训练的
bn:
1)使得输入分布相同,加速训练
2)对网络的梯度流动也有益处,因为梯度不再依赖于输入和参数的规模。这样就可以用更高的学习率
3)正则化,减少使用dropout的必要
4)使得使用饱和线性单元成为可能(之前用ReLU就是因为它是非饱和的)
Toward Reducing ICS
白化:
目的:使得输入特征分布具有0均值和固定方差,去除特征之间的相关性
对每一层的输入进行相同的白化处理
可以在每一步训练里白化激活值,也可以直接调整模型的结构或依照激活值来修改优化函数的参数来进行白化。
xbar=Norm(x,Χ)
白化的问题:计算量太大啦。需要计算协方差矩阵、协方差矩阵的-1/2次逆以及变换的导数,参数更新的时候需要对整个数据集进行分析;白化过程由于改变了网络每一层的数据分布,因而改变了网络层中本身数据的表达能力,
由于去掉了激活值的绝对值缩放,而改变了网络的表征能力。我们希望通过同时考虑单个训练样本和整个训练样本集的统计信息来归一化激活值,从而在网络中保留更多的信息。底层网络中学习到的参数信息就会被白化操作给丢掉
所以我们需要:更简化的计算过程,尽可能保留层的表达能力
Normalization via Mini-Batch Statistics
关于白化的两个简化:
1)我们对特征进行单独的进行零均值一方差归一化,也就是说我求的方差不再是协方差,而是每个维度自己单独的方差
xbar= (x-E(x)) / sqrt(var(x))
这样的简单归一化可能会导致层的表达能力的改变,例如会导致sigmoid的输入趋近于sigmoid的近线性部分。为了解决:引入参数
y = γ*xbar + β , γ和β也是需要学习的参数
从某种意义上来说,gamma和beta代表的其实是输入数据分布的方差和偏移。对于没有BN的网络,这两个值与前一层网络带来的非线性性质有关,而经过变换后,就跟前面一层无关,变成了当前层的一个学习参数,这更加有利于优化并且不会降低网络的能力。
为什么要加入γ和β的学习?:因为如果只是简单的归一化函数,学到的特征有可能被破坏掉,比如说本来学到的就是sigmoid函数的较大部分,结果强行拉回中间的话,那学到的东西就无了。所以说每一层要自己再学两个参数,来尝试恢复这一层网络所学到的特征
2)使用mini-batch而不是一整个batch,计算的不是输入特征的协方差,而是每个维度的自己的方差(如果是计算协方差的话,很有可能mini-batch的size还不如激活向量的size还要小,会产生奇异协方差矩阵)
训练的时候把x变成BN(x)
验证的时候,使用之前训练时保留好的μ和σ来估计validation数据的均值和方差,然后来normalize输入的验证集数据
BN enables higher learning rate
传统网络中,太高的学习率可能导致梯度消失或者梯度爆炸,或者将训练局限在局部最优。BN可以防止“蝴蝶效应”的发生,防止前面的一点点小变化导致之后层的急剧变化
BN regularize the model
更有利于泛化
BN的优点:
1)BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度:
BN通过规范化与线性变换使得每一层网络的输入数据的均值与方差都在一定范围内,使得后一层网络不必不断去适应底层网络中输入的变化,从而实现了网络中层与层之间的解耦,允许每一层进行独立学习,有利于提高整个神经网络的学习速度。
2)BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定
在神经网络中,我们经常会谨慎地采用一些权重初始化方法(例如Xavier)或者合适的学习率来保证网络稳定训练。
当学习率设置太高时,会使得参数更新步伐过大,容易出现震荡和不收敛。但是使用BN的网络将不会受到参数数值大小的影响。
因此,在使用Batch Normalization之后,抑制了参数微小变化随着网络层数加深被放大的问题,使得网络对参数大小的适应能力更强,此时我们可以设置较大的学习率而不用过于担心模型divergence的风险。
3)BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
在不使用BN层的时候,由于网络的深度与复杂性,很容易使得底层网络变化累积到上层网络中,导致模型的训练很容易进入到激活函数的梯度饱和区;通过normalize操作可以让激活函数的输入数据落在梯度非饱和区,缓解梯度消失的问题;另外通过自适应学习γ与 β 又让数据保留更多的原始信息。
4)BN具有一定的正则化效果
在Batch Normalization中,由于我们使用mini-batch的均值与方差作为对整体训练样本均值与方差的估计,尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。
The stochastic uncertainty of the batch statistics also acts as a regularizer that can benefifit generalization
另外,原作者通过也证明了网络加入BN后,可以丢弃Dropout,模型也同样具有很好的泛化效果。
BN的缺陷
从上面可以看出,batch normalization依赖于batch的大小,当batch值很小时,计算的均值和方差不稳定。研究表明对于ResNet类模型在ImageNet数据集上,batch从16降低到8时开始有非常明显的性能下降,在训练过程中计算的均值和方差不准确,而在测试的时候使用的就是训练过程中保持下来的均值和方差。
这一个特性,导致batch normalization不适合以下的几种场景。
(1)batch非常小,比如训练资源有限无法应用较大的batch,也比如在线学习等使用单例进行模型参数更新的场景。
(2)rnn,因为它是一个动态的网络结构,同一个batch中训练实例有长有短,导致每一个时间步长必须维持各自的统计量,这使得BN并不能正确的使用。在rnn中,对bn进行改进也非常的困难。
BN:各个通道独立进行计算
LN(Layer N):抛弃对batch的依赖,对每一个样本单独进行normalization,同时各个通道都要用到,把每一层的特征通道一起用于归一化,基于C*H*W个数值进行求平均及方差的操作
IN:把每一个特征层单独进行归一化,也就是限制在某一个特征通道内,基于H*W个数值进行求平均和方差的操作。适用于风格化类的图像应用
GN:LN和IN的中间体,将通道方向分group,对每个group内做归一化
why BN works?
之前也有很多认识过normalization,但是效果并不好,这篇文章的突破宰予,增加了β和γ两个参数,使得每层的信息可以被一定程度上还原
原作者:性能提升的原因是因为网络各层标准化后拥有了相对一致的分布
MIT:
实验1:普通网络和norm之后的网络的输入的可视化分布没有特别大的区别,虽然norm后的性能确实更好
提出问题:BN的高效真的跟解决ICS有关吗?BN真的解决了ICS吗?
实验2:在norm后的网络中添加噪声,这样子虽然进行了bn但分布被打乱。这样的情况下网络性能跟无噪声的网络还是差不多,说明性能提升可能不是相同分布的原因
似乎BN没能很好解决ICS的问题,BN带来的性能提升似乎也不是因为解决了ICS
MIT提出的BN带来性能提升的真正原因:BN重新参数化了待优化的问题,使得其更加平滑,其中一个表现为loss function Lipschitz连续性的改善,提升后的Lipschitzness让我们放心地设置一个较大的learning rate且梯度方向维持不错的精确。这允许任何基于梯度的训练算法可以采取更大的学习率而不用担心起遭遇梯度突然变好的危险,例如平缓区域会导致梯度消失,尖锐的局部最小值会导致梯度爆炸等等。由此,BN使得训练过程更快且对超参数选择没那么敏感。
tion Lipschitz连续性的改善,提升后的Lipschitzness让我们放心地设置一个较大的learning rate且梯度方向维持不错的精确。这允许任何基于梯度的训练算法可以采取更大的学习率而不用担心起遭遇梯度突然变好的危险,例如平缓区域会导致梯度消失,尖锐的局部最小值会导致梯度爆炸等等。由此,BN使得训练过程更快且对超参数选择没那么敏感。