Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
Abstract
Google出品,难怪论文中实验都用到了InceptionVx,支持自家货,总结一下文章BN有点
- Covariate Shift不同分布的输入值对深度网络学习的影响,因此减少了ICS至关重要(Interval Covariate Shift由于前一层的参数更新,所以这一层的输入(前一层的输出)的分布会发生变化)。BN将数据的分布都归一化到均值为0,方差为1的分布上去。因此每一层的输入(上一层输出经过BN后)分布的稳定性都提高了,故而整体减小了网络的ICS。
- BN work的根本原因,是因为在网络的训练阶段,其能够让优化空间(optimization landscape)变的平滑。BN可以防止梯度爆炸或弥散、可以提高训练时模型对于不同超参的鲁棒性、可以让大部分的激活函数能够远离其饱和区域。
- 可以使用较大的学习率、允许在深层网络中使用sigmoid这种易导致梯度消失的激活函数,具有正则化效果,以此可以降低dropout的使用。
Algorithm
- 利用小批量数据样本对feature map的channel方向求均值和方差,一个channel只对应一组可学习的参数γ、β, 可学习的参数为2C个,最终不断调整神经网络中间输出,使整个神经网络在各层的中间输出的数值更加稳定。
- BN层在train与inference时的差别。在训练时,我们可以计算出batch的均值和方差,均值和方差一直在发生变化。在推理时,均值和方差是固定的,为了减少计算量在推理时使用滑动平均值
moving_mean
和滑动方差moving_variance
,参考coding部分 - 文章推荐BN层方在在Conv层之后,非线性变换激活层(Relu)之前插入BN层
Experiment
BN无敌的性能也使得一直沿用到今,在mnist上使用BN层,不仅acc上升同时模型收敛更快
Coding
主要实现和注释皆如图,一般momentum的值为0.9 , 0.99等。多个batch逼近后,即多个0.9连乘后,最早的batch的影响会变弱。
More
Group Normalization
Group Normalization(GN)是针对BN在batch size较小时错误率较高而提出的改进算法,主要目的是使归一化操作的计算不依赖batch size的大小,因为BN层的计算结果依赖当前batch的数据,当在分割检测这类对于输入尺寸要求很大的任务重batch size通常较小时(比如2、4这样),该batch数据的均值和方差的代表性较差,因此对最后的结果影响也较大。
如图bs变小之后对error影响很大
各种归一化区别
BatchNorm在Batch上,对NHW做归一化,对小batchsize效果不好;
LayerNorm在通道方向上,对CHW归一化,用在RNN中;(LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差)
InstanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
GroupNorm将channel分组,然后再做归一化;(C个特征通道分成G组,默认情况下,G=32。可以把LN看成G=1)
SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
SyncBN即在数据并行分布式训练时,将各显卡上分配的数据汇总到一起进行BN,std和mean单独计算的话,需要同步两次,其中一个trick每个节点计算∑x²和∑x ,最后可以直接通过得到方差var[x]=E[x2]−E2[x]
Filtere Response Normalization
FRN层由两部分组成,Filtere Response Normalization (FRN)和Thresholded Linear Unit (TLU)
ν2为使用N=H×W个特征值来求得到的平均平方和
由于FRN不是0对称的,比如产生很多分布在-200 —— -100,这样使用Relu会产生大量0值,因此提出了增强Relu,新增一个可学习参数r