Normalization 有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为 0 方差为 1 的数据。我们在把数据送入激活函数之前进行 normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区。同时,使得训练数据在训练过程中尽可能的保持和测试数据拥有相同的分布。
- 一方面,这样可以减少数据的偏差,避免在训练过程中出现梯度爆炸或是梯度消失的问题;
- 另一方面,这也是确保模型测试性能的重要假设之一。
文章图片
- LN:Layer Normalization,LN是“横”着来的,对一个样本,不同的神经元neuron间做归一化。
- BN:Batch Normalization,BN是“竖”着来的,各个维度做归一化,所以与batch size有关系。
在提出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通过标准化让激活函数分布在线性区间,结果就是加大了梯度,让模型更大胆的进行梯度下降,具有如下优点:
- 加大搜索的步长,加快收敛的速度;
- 更容易跳出局部最小值;
- 破坏原来的数据分布,一定程度上缓解了过拟合
BN是深度学习调参中非常好用的策略之一(另外一个可能就是Dropout),当你的模型发生梯度消失/爆炸或者损失值震荡比较严重的时候,在BN中加入网络往往能取得非常好的效果。
【#|归一化(Layer Normalization、Batch Normalization)】BN也有一些不是非常适用的场景,在遇见这些场景时要谨慎的使用BN:
- 受制于硬件限制,每个Batch的尺寸比较小,这时候谨慎使用BN;
- 在类似于RNN的动态网络中谨慎使用BN;
- 训练数据集和测试数据集方差较大的时候。
- BN是在batch size样本上各个维度做标准化的,所以size越大肯定越能得出合理的μ和σ来做标准化,因此BN比较依赖size的大小。
- 在训练的时候,是分批量进行填入模型的,但是在预测的时候,如果只有一个样本或者很少量的样本来做inference,这个时候用BN显然偏差很大,例如在线学习场景。
- RNN是一个动态的网络,也就是输入序列的长度是变化的,可大可小,造成多样本维度都没法对齐,所以不适合用BN。
- BN如右侧所示,它是取不同样本的同一个通道的特征做归一化;
- LN则是如左侧所示,它取的是同一个样本的不同通道做归一化。
- Layer Normalization是每个样本内部做标准化,跟size没关系,不受其影响。
- RNN中LN也不受样本长度影响,内部自己做标准化,所以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
推荐阅读
- 计算机视觉|OpenAI新研究(扩散模型在图像合成质量上击败BigGAN,多样性还更佳)
- Unbox|C++ 调用 Mask R-CNN Detectron2
- 目标检测|【魔改YOLOv5-6.x(下)】YOLOv5s+Ghostconv+BiFPN+CA
- 目标检测|【MMDetection】v2.22.0入门(训练自己的数据集)
- 目标检测|【魔改YOLOv5-6.x(上)】结合轻量化网络Shufflenetv2、Mobilenetv3和Ghostnet
- 目标检测|【YOLOv5-6.x】网络模型&源码解析
- 机器学习基础|nn.dropout()的用法,随机失活
- PyTorch|使用随机梯度下降SGD的BP反向传播算法的PyTorch代码实现
- Pytorch猫狗大战|Kaggle猫狗大战——基于Pytorch的CNN网络分类(预测模型结果(4))