Normalization
我们最希望输入网络模型中的数据具有什么样的特点?
回答是:“独立同分布”。
独立同分布的数据可以简化常规机器学习模型的训练、提升机器学习模型的预测能力,已经是一个共识。因此,在把数据喂给机器学习模型之前,“白化(whitening)”是一个重要的数据预处理步骤
白化一般包含两个目的:
(1)去除特征之间的相关性 —> 独立(每次抽样之间是没有关系的,不会相互影响);
(2)使得所有特征具有相同的均值和方差 —> 同分布(每次抽样,样本都服从同样的一个分布)。
白化最典型的方法就是PCA。在传统的机器学习方法中,对数据进行预处理之后,由于模型深度太浅,故可以满足数据是独立同分布的特征。但是对于深度学习模型,就会出现一个问题:经过卷积层、池化层的层层叠加,层层改变,在高层网络中,数据就会失去原始数据的特征,其数据的分布特征也会相应的改变。此问题被google总结为Internal Covariate Shift。
那么ICS会对深度神经网络有什么影响呢?
其一,上层参数需要不断适应新的输入数据分布,降低学习速度
其二,下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止
其三,每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
Batch Normalization
针对单个神经元进行,利用网络训练时一个 mini-batch 的数据来计算该神经元 x_i的均值和方差,因而称为 Batch Normalization
适用的场景
每个 mini-batch 比较大,数据分布比较接近。在进行训练之前,要做好充分的 shuffle. 否则效果会差很多。
存在问题
- BN特别依赖Batch Size;当Batch size很小的时候,BN的效果就非常不理想了。在很多情况下,Batch size大不了,因为你GPU的显存不够。所以,通常会有其他比较麻烦的手段去解决这个问题,比如MegDet的CGBN等;
- BN对处理序列化数据的网络比如RNN是不太适用的。
- BN只在训练的时候用,inference的时候不会用到,因为inference的输入不是批量输入。
Layer Normalization
方式:综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。
适用的场景
LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题,可以用于 小mini-batch场景、动态网络场景和 RNN,特别是自然语言处理领域。此外,LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。
BN vs LN
BN 的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而 LN 对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么 LN 的处理可能会降低模型的表达能力。