Batch Norm、Layer Norm

Batch Norm、Layer Norm

batch norm:

每一batch的样本具有相同的均值和方差
我们在对数据训练之前会对数据集进行归一化,归一化的目的归一化的目的就是使得预处理的数据被限定在一定的范围内(比如[0,1]或者[-1,1]),从而消除奇异样本数据导致的不良影响。虽然输入层的数据,已经归一化,后面网络每一层的输入数据的分布一直在发生变化,前面层训练参数的更新将导致后面层输入数据分布的变化,必然会引起后面每一层输入数据分布的改变。而且,网络前面几层微小的改变,后面几层就会逐步把这种改变累积放大。训练过程中网络中间层数据分布的改变称之为:“Internal Covariate Shift”。

BN的提出,就是要解决在训练过程中中间层数据分布发生改变的情况。所以就引入了BN的概念,来消除这种影响。所以在每次传入网络的数据每一层的网络都进行一次BN,将数据拉回正态分布,这样做使得数据分布一致且避免了梯度消失。

此外,internal corvariate shift和covariate shift是两回事,前者是网络内部,后者是针对输入数据,比如我们在训练数据前做归一化等预处理操作。

需要注意的是在使用小batch-size时BN会破坏性能,当具有分布极不平衡二分类任务时也会出现不好的结果。因为如果小的batch-size归一化的原因,使得原本的数据的均值和方差偏离原始数据,均值和方差不足以代替整个数据分布。分布不均的分类任务也会出现这种情况!

BN实际使用时需要计算并且保存某一层神经网络batch的均值和方差等统计信息,对于对一个固定深度的前向神经网络(DNN,CNN)使用BN,很方便;但对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其他sequence长很多,这样training时,计算很麻烦。
Batch Norm、Layer Norm
Batch Norm、Layer Norm
Batch Norm、Layer Norm

layer norm

每一个神经元有相同的均值和方差,每个样本的均值和方差不同

与BN不同的是,LN对每一层的所有神经元进行归一化,与BN不同的是:

  1. LN同层神经元输入拥有相同的均值和方差不同的输入样本有不同的均值和方差;
  2. BN 中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差
  3. LN不依赖于batch的大小和输入sequence的深度,因此可以用于batchsize为1和RNN中对边长的输入sequence的normalize操作。

一般情况,LN常常用于RNN网络!
Batch Norm、Layer Norm
继续采用上一节的类比,把一个 batch 的 feature 类比为一摞书。LN 求均值时,相当于把每一本书的所有字加起来,再除以这本书的字符总数:C×H×W,即求整本书的“平均字”,求标准差时也是同理。

参考博客:
https://blog.csdn.net/qq_41997920/article/details/89945972
https://www.jianshu.com/p/94d6484cc2fa