DeepLearning---层归一化(LayerNorm)与批量归一化(BatchNorm)的区别
虽然我们认为训练样本是独立同分布的,但是在实际训练过程中,我们会划分 batch 来提高训练效率,此时不同的 batch 之间可能不再是同分布,从而影响模型的训练效果。
深度学习模型往往都具有较多的层,网络越深越容易出现梯度消失和梯度爆炸的问题,导致模型不稳定,不容易收敛。
对于深层的模型,如果不做归一化可能会出现靠后的层有很多权重为零的神经元,起不到任何作用。这是因为经过太多的层后,由于梯度消失或爆炸的影响,某些神经元的量级差距过大,从而导致模型不得不尽可能的降低这些“离群”权重的影响,而设置很多权重非常小的神经元。
Batch_Normalzation
BN 层主要对一个 batch 进行归一化,即在 batch 的维度上计算均值和方差,从而对每个输入特征都得到其在整个 batch 数据上的均值和方差,然后进行归一化。这种方法可以保证从每个输入特征学习到的信息不丢失,同时保证数据之间的量级基本一致。
使用细节
BN 归一化依赖于 batch_size,batch 越大,则其计算的均值和方差越接近真实值,归一化效果越好。
BN 使用在激活函数之前。
优点
- BN 可以使各层的数据分布相对稳定,从而加快收敛速度
- 有一定的正则化效果,减弱模型参数对初始化的依赖。
- 允许使用饱和性激活,可以缓解梯度消失问题。
缺点
- Batch_size 过小时效果不好,甚至可能起反作用。
- 不适合以 RNN 为基础的动态网络或时序模型。因为 BN 会计算该层整个 batch 的均值和方差并保存,而 RNN 模型的输入是序列数据,其长度可能不一致,从而导致不同时间步的隐层看到的输入数据不同。
Layer Normalization
Layer Normalization 针对层进行归一化,及对于该层的所有神经元进行归一化,不依赖于 batch。
对每个训练样本,对其所有输入特征,在当前层上的所有神经元上求均值和反差,总共求得 batch_size 个均值和方差,然后进行归一化。
优点
不依赖于 batch 大小,可以适应差距较大的输入样本,因此适合于 RNN 类型的模型。
缺点
对所有的神经元进行归一化,也就是其求均值和方差时会将不同的输入特征放在一起处理,如果各个特征之间存在较大的差异,则可能会影响学习效果。