这个问题没有定论,很多人都在探索,所以只是聊一下我自己的理解,顺便为讲 layer-norm做个引子。
BN的理解重点在于它是针对整个Batch中的样本在同一维度特征在做处理。
在MLP中,比如我们有10行5列数据。5列代表特征,10行代表10个样本。是对第一个特征这一列(对应10个样本)做一次处理,第二个特征(同样是一列)做一次处理,依次类推。
在CNN中扩展,我们的数据是N·C·H·W。其中N为样本数量也就是batch_size,C为通道数,H为高,W为宽,BN保留C通道数,在N,H,W上做操作。比如说把第一个样本的第一个通道的数据,第二个样本第一个通道的数据…第N个样本第一个通道的数据作为原始数据,处理得到相应的均值和方差。
第一个就是可以解决内部协变量偏移,简单来说训练过程中,各层分布不同,增大了学习难度,BN缓解了这个问题。当然后来也有论文证明BN有作用和这个没关系,而是可以使损失平面更加的平滑,从而加快的收敛速度。
第二个优点就是缓解了梯度饱和问题(如果使用sigmoid激活函数的话),加快收敛。
第一个,batch_size较小的时候,效果差。这一点很容易理解。BN的过程,使用 整个batch中样本的均值和方差来模拟全部数据的均值和方差,在batch_size 较小的时候,效果肯定不好。
第二个缺点就是 BN 在RNN中效果比较差。这一点和第一点原因很类似,不过我单挑出来说。
首先我们要意识到一点