#|归一化(Layer Normalization、Batch Normalization)

Normalization 有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为 0 方差为 1 的数据。我们在把数据送入激活函数之前进行 normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区。同时,使得训练数据在训练过程中尽可能的保持和测试数据拥有相同的分布。

  • 一方面,这样可以减少数据的偏差,避免在训练过程中出现梯度爆炸或是梯度消失的问题;
  • 另一方面,这也是确保模型测试性能的重要假设之一。
二者提出的目的都是为了加快模型收敛,减少训练时间。
#|归一化(Layer Normalization、Batch Normalization)
文章图片

  • LN:Layer Normalization,LN是“横”着来的,对一个样本,不同的神经元neuron间做归一化。
  • BN:Batch Normalization,BN是“竖”着来的,各个维度做归一化,所以与batch size有关系。
一、Batch Normalization(BN) Batch Normalization(BN)是深度学习中非常好用的一个算法,加入BN层的网络往往更加稳定并且BN还起到了一定的正则化的作用。
在提出BN的文章中 Batch normalization: Accelerating deep network training by reducing internal covariate shift,作者BN能工作的原因是BN解决了普通网络的内部协变量偏移(Internel Covariate Shift, ICS)的问题,所谓ICS是指网络各层的分布不一致,网络需要适应这种不一致从而增加了学习的难度。而在How Does Batch Normalization Help Optimization?(No, It Is Not About Internal Covariate Shift)中,作者通过实验验证了BN其实和ICS的关系并不大,其能工作的原因是使损失平面更加平滑,并给出了其结论的数学证明。
批标准化(Batch Normalization,BN)是为了克服神经网络加深导致难以训练而诞生的,随着神经网络深度加深,训练起来就会越来越困难,收敛速度回很慢,常常会导致梯度弥散问题(Vanishing Gradient Problem)。
统计机器学习中有一个经典的假设:Source Domain 和 Target Domain的数据分布是一致的。也就是说,训练数据和测试数据是满足相同分布的。这是通过训练数据获得的模型能够在测试集上获得好的效果的一个基本保障。
Convariate Shift是指训练集的样本数据和目标样本集分布不一致时,训练得到的模型无法很好的Generalization。它是分布不一致假设之下的一个分支问题,也就是指Sorce Domain和Target Domain的条件概率一致的,但是其边缘概率不同。的确,对于神经网络的各层输出,在经过了层内操作后,各层输出分布就会与对应的输入信号分布不同,而且差异会随着网络深度增大而加大了,但每一层所指向的Label仍然是不变的。
解决办法:一般是根据训练样本和目标样本的比例对训练样本做一个矫正。所以,通过引入Bactch Normalization来标准化某些层或者所有层的输入,从而固定每层输入信息的均值和方差。
方法:Bactch Normalization一般用在非线性映射(激活函数)之前,对x=Wu+b做标准化,是结果(输出信号各个维度)的均值为0,方差为1。让每一层的输入有一个稳定的分布会有利于网络的训练。
优点:Bactch Normalization通过标准化让激活函数分布在线性区间,结果就是加大了梯度,让模型更大胆的进行梯度下降,具有如下优点:
  • 加大搜索的步长,加快收敛的速度;
  • 更容易跳出局部最小值;
  • 破坏原来的数据分布,一定程度上缓解了过拟合
因此,在遇到神经网络收敛速度很慢或梯度爆炸(Gradient Explore)等无法训练的情况系啊,都可以尝试用Bactch Normalization来解决。
BN是深度学习调参中非常好用的策略之一(另外一个可能就是Dropout),当你的模型发生梯度消失/爆炸或者损失值震荡比较严重的时候,在BN中加入网络往往能取得非常好的效果。
【#|归一化(Layer Normalization、Batch Normalization)】BN也有一些不是非常适用的场景,在遇见这些场景时要谨慎的使用BN:
  • 受制于硬件限制,每个Batch的尺寸比较小,这时候谨慎使用BN;
  • 在类似于RNN的动态网络中谨慎使用BN;
  • 训练数据集和测试数据集方差较大的时候。
BN的缺陷如下:
  • BN是在batch size样本上各个维度做标准化的,所以size越大肯定越能得出合理的μ和σ来做标准化,因此BN比较依赖size的大小。
  • 在训练的时候,是分批量进行填入模型的,但是在预测的时候,如果只有一个样本或者很少量的样本来做inference,这个时候用BN显然偏差很大,例如在线学习场景。
  • RNN是一个动态的网络,也就是输入序列的长度是变化的,可大可小,造成多样本维度都没法对齐,所以不适合用BN。
二、Layer Normalization BN并不适用于RNN等动态网络和batchsize较小的时候效果不好。Layer Normalization(LN)Layer normalization 的提出有效的解决BN的这两个问题。LN和BN不同点是归一化的维度是互相垂直的,如图1所示。在图1中 [公式] 表示样本轴, [公式] 表示通道轴, [公式] 是每个通道的特征数量。
  • BN如右侧所示,它是取不同样本的同一个通道的特征做归一化;
  • LN则是如左侧所示,它取的是同一个样本的不同通道做归一化。
LN带来的优势:
  • Layer Normalization是每个样本内部做标准化,跟size没关系,不受其影响。
  • RNN中LN也不受样本长度影响,内部自己做标准化,所以LN的应用面更广。
三、总结 LN是和BN非常近似的一种归一化方法,不同的是BN取的是不同样本的同一个特征,而LN取的是同一个样本的不同特征。在BN和LN都能使用的场景中,BN的效果一般优于LN,原因是基于不同数据,同一特征得到的归一化特征更不容易损失信息。
但是有些场景是不能使用BN的,例如batchsize较小或者在RNN中,这时候可以选择使用LN,LN得到的模型更稳定且起到正则化的作用。RNN能应用到小批量和RNN中是因为LN的归一化统计量的计算是和batchsize没有关系的。
参考资料:
模型优化之Batch Normalization
模型优化之Layer Normalization
LN和BN对比
Batch Normalization原理及其TensorFlow实现——为了减少深度神经网络中的internal covariate shift,论文中提出了Batch Normalization算法,首先是对”每一层“的输入做一个Batch Normalization 变换
BN、LN、IN、GN的异同
transformer中attention计算方式_[整理] 聊聊 Transformer

    推荐阅读