归一化相关技术已经经过了几年的发展,目前针对不同的应用场合有相应的方法,在本文将这些方法做了一个总结,介绍了它们的思路,方法,应用场景。主要涉及到:LRN,BN,LN,IN,GN,FRN,WN,BRN,CBN,CmBN等。
LRN(2012)BatchNormalization(2015)论文:BatchNormalization:AcceleratingDeepNetworkTrainingbyReducingInternalCovariateShift
论文中关于BN提出的解释:训练深度神经网络非常复杂,因为在训练过程中,随着先前各层的参数发生变化,各层输入的分布也会发生变化,图层输入分布的变化带来了一个问题,因为图层需要不断适应新的分布,因此训练变得复杂,随着网络变得更深,网络参数的细微变化也会放大。由于要求较低的学习率和仔细的参数初始化,这减慢了训练速度,并且众所周知,训练具有饱和非线性的模型非常困难。我们将此现象称为内部协变量偏移,并通过归一化层输入来解决该问题。
如下左图所示,由于两个数据不在同一范围,但它们是使用相同的学习率,导致梯度下降轨迹沿一维来回振荡,从而需要更多的步骤才能达到最小值。且此时学习率不容易设置,学习率过大则对于范围小的数据来说来回震荡,学习率过小则对范围大的数据来说基本没什么变化。如下右图所示,当进行归一化后,特征都在同一个大小范围,则losslandscape像一个碗,学习率更容易设置,且梯度下降比较平稳。

实现算法:

在一个batch中,在每一BN层中,对每个样本的同一通道,计算它们的均值和方差,再对数据进行归一化,归一化的值具有零均值和单位方差的特点,最后使用两个可学习参数gamma和beta对归一化的数据进行缩放和移位。此外,在训练过程中还保存了每个mini-batch每一BN层的均值和方差,最后求所有mini-batch均值和方差的期望值,以此来作为推理过程中该BN层的均值和方差。
实际效果:
1)与没有BN相比,可使用更大的学习率
2)防止过拟合,可去除Dropout和LocalResponseNormalization
3)由于dataloader打乱顺序,因此每个epoch中mini-batch都不一样,对不同mini-batch做归一化可以起到数据增强的效果。
4)明显加快收敛速度
5)避免梯度爆炸和梯度消失
BN、LN、IN和GN的区别与联系下图比较明显地表示出了它们之间的区别。(N表示N个样本,C表示通道,这里为了表达方便,把HxW的二维用H*W的一维表示。)

后面这三个解决的主要问题是BN的效果依赖于batchsize,当batchsize比较小时,性能退化严重。可以看到,IN,LN和GN都与batchsize无关。它们之间的区别在于计算均值和方差的数据范围不同,LN计算单个样本在所有通道上的均值和方差,IN值计算单个样本在每个通道上的均值和方差,GN将每个样本的通道分成g组,计算每组的均值和方差。
它们之间的效果对比。(注:这个效果是只在同一场合下的对比,实际上它们各有自己的应用场景,且后三者在各自的应用场合上都明显超过了BN)

论文:InstanceNormalization:TheMissingIngredientforFastStylization
LayerNormalization(2016)论文:LayerNormalization
BN的第一个缺陷是依赖Batchsize,第二个缺陷是对于RNN这样的动态网络效果不明显,且当推理序列长度超过训练的所有序列长度时,容易出问题。为此,提出了LayerNormalization。当我们以明显的方式将批归一化应用于RNN时,我们需要为序列中的每个时间步计算并存储单独的统计信息。如果测试序列比任何训练序列都长,这是有问题的。LN没有这样的问题,因为它的归一化项仅取决于当前时间步长对层的总输入。它还只有一组在所有时间步中共享的增益和偏置参数。(注:LN中的增益和偏置就相当于BN中的gamma和beta)
GroupNormalization(2018)论文:GroupNormalization
如下图所示,当batchsize减少时,BN退化明显,而GroupNormalization始终一致,在batchsize比较大的时候,略低于BN,但当batchsize比较小的时候,明显优于BN。

但GN有两个缺陷,其中一个是在batchsize大时略低于BN,另一个是由于它是在通道上分组,因此它要求通道数是分组数g的倍数。GN应用场景:在目标检测,语义分割等要求尽可能大的分辨率的任务上,由于内存限制,为了更大的分辨率只能取比较小的batchsize,可以选择GN这种不依赖于batchsize的归一化方法。
GN实现算法

论文:WeightNormalization:ASimpleReparameterizationtoAccelerateTrainingofDeepNeuralNetworks
前面的方法都是基于featuremap做归一化,这篇论文提出对Weights做归一化。这种方式改善了优化问题的条件,并加速了随机梯度下降的收敛,不依赖于batchsize的特点,适用于循环模型(如LSTM)和噪声敏感应用(如深度强化学习或生成模型),而批量归一化不太适合这些应用。WeightNormalization也有个明显的缺陷:WN不像BN有归一化特征尺度的作用,因此WN的初始化需要慎重,为此作者提出了对向量v和标量g的初始化方法。
BatchRenormalization(2017)论文:BatchRenormalization:TowardsReducingMinibatchDepenceinBatch-NormalizedModels
前面我们提到BN使用训练过程中每个mini-batch的均值和方差的期望作为推理过程中的均值和方差,这样做的前提是mini-batch与样本总体是独立同分布的。因此BN的第三个缺陷是当mini-batch中的样本非独立同分布时,性能比较差。基于第一个缺陷batchsize太小时性能退化和第三个缺陷,作者提出了BatchRenormalization(简称BRN)。BRN与BN的主要区别在于BN使用训练过程中每个mini-batch的均值和方差的期望来当作整个数据集的均值和方差,而训练过程中每个mini-batch都有自己的均值和方差,因此在推理阶段的均值和方差与训练时不同,而BRN提出在训练过程中就不断学习修正整个数据集的均值和方差,使其尽可能逼近整个数据集的均值和方差,并最终用于推理阶段。
BRN实现算法如下:

当使用小batchsize或非独立同分布的mini-batch进行训练时,使用BRN训练的模型的性能明显优于BN。同时,BRN保留了BN的优势,例如对初始化的敏感性和训练效率
Cross-GPUBN(2018)论文:MegDet:ALargeMini-BatchObjectDetector
在使用多卡分布式训练的情况下,输入数据被等分成多份,在各自的卡上完成前向和回传,参数更新,BN是针对单卡上的样本做的归一化,因此实际的归一化的样本数并不是batchsize。例如batchsize=32,用四张卡训练,实际上只在32/4=8个样本上做归一化。Cross-GPUBatchNormalization的思想就是在多张卡上做归一化。
具体实现算法如下:

论文:FilterResponseNormalizationLayer:EliminatingBatchDepenceintheTrainingofDeepNeuralNetworks
FRN仍然是基于小batchsize会退化性能的问题改进的。FRN由两个组件构成,一个是FilterResponseNormalization(FRN),一个是ThresholdedLinearUnit(TLU)。前者跟InstanceNormalization非常相似,也是基于单样本单通道,所不同的是IN减去了均值,再除以标准差。而FRN没有减去均值。作者给出的理由如下:虽然减去均值是归一化方案的正常操作,但对于batchindepent的归一化方案来说,它是任意的,没有任何理由。TLU则是在ReLU的基础上加了一个阈值,这个阈值是可学习的参数。这是考虑到FRN没有减去均值的操作,这可能使得归一化的结果任意地偏移0,如果FRN之后是ReLU激活层,可能产生很多0值,这对于模型训练和性能是不利的。

FRN实现算法

实验效果

论文:Cross-IterationBatchNormalization
CBN的主要思想在于将前k-1个iteration的样本参与当前均值和方差的计算。但由于前k-1次iteration的数据更新,因此无法直接拿来使用。论文提出了一个处理方式是通过泰勒多项式来近似计算出前k-1次iteration的数据。

在Yolo_v4中还提出改进版,在每个batch中只统计四个mini-batches的数据,并在第四个mini-batch后才更新权重,尺度缩放和偏移。