BN
BatchNormalization于2015年被谷歌提出,简称BN。
计算方式如下:
就是对每个batch_size 的数据进行标准化,变成均值为0,标准差为1的数据,消除特征间的量纲差别。
同事还引入了两个可学习的参数: β 和 γ
分别为 scala 和shift,让模型学习适应的分布。
值得注意的是,BN是对不同batch内样本的同一个特征进行归一化,例如有身高体重和年龄三个特征。
是一种“列缩放”。
BN能够解决梯度弥散。通过将输出进行适当的缩放,可以缓解梯度消失的状况。
拿sigmoid激活函数距离,从图中,我们很容易知道,数据值越靠近0梯度越大,越远离0梯度越接近0,我们通过BN改变数据分布到0附近,从而解决梯度消失问题。
LN
LayerNormalization则是在Transformer被所有人广泛熟知的。从而广泛用于NLP中。
其是针对样本的不同维度特征进行归一化。
在nlp中,我们输入为(batch_size, seq_len,dim)
LN是在句子内部的每个token的embedding进行归一化,
BN 感觉是对样本内部特征的缩放,LN 是样本直接之间所有特征的缩放。
因为NLP中不同句子长度大小不同,用BN会导致 均值不同batch间方差非常大,并且在预测时需要计算全局均值方差,这样会更加不准,而LN则不需要计算全局,只需要内部计算即可。
为啥BN不适合NLP ?
是因为NLP模型训练里的每次输入的句子都是多个句子,并且长度不一,那么 针对每一句的缩放才更加合理,才能表达每个句子之间代表不同的语义表示,这样让模型更加能捕捉句子之间的上下语义关系。如果要用BN,它首先要面临的长度不一的问题。有时候batch size 越小的bn 效果更不好。
参考文献:
https://zhuanlan.zhihu.com/p/74516930
https://mp.weixin.qq.com/s/QFpolIXvOQjUsPAngqvqmg