归一化Normalization
BatchNorm 的初衷是解决 Internal Covariate Shift 问题。尽可能将 mini-batch 归一化到标准正态分布,使得网络层的输出分布趋于稳定。
Internal Covariate Shift 问题简单来说,是网络学习更新权重后可能会改变输出的分布,导致下一层总是迟一步适应这次的分布。后来的实验与探究证明,BatchNorm 并不能解决 ICS 问题。
在网络层之间引入归一化层,有以下优势:
- 缓解过拟合,起到正则化效果
- 改善梯度传递,避免梯度弥散和梯度爆炸,模型适应更大的学习率
- 避免像是 Sigmoid 这样的激活函数出现饱和问题
BatchNorm
若输入维度为 [batch, channel, hw]
,BatchNorm 是在 [batch, hw]
维度进行归一化。换句话说,会进行 channel 次归一化。
推荐将 BatchNorm 层放在激活层之后。
带有 BatchNorm 层的网络训练受 batch_size 大小影响较大(例如 batch_size 过小时会严重影响网络训练效果)。接下来的 LayerNorm、InstanceNorm 和 GroupNorm 能够避免 batch 维度上的归一化,回避了这个问题。
LayerNorm
若输入维度为 [batch, channel, hw]
,LayerNorm 是在 [channel, hw]
维度进行归一化。换句话说,会进行 batch 次归一化。
可见,不同于 BatchNorm,这里 LayerNorm 不受 batch 变化的影响。
InstanceNorm
InstanceNorm 仅在 hw
维度进行归一化。换句话说,会进行 batch * channel 次归一化。
GroupNorm
GroupNorm 会将 channel 划分为多个组。若输入维度为 [batch, channel, hw]
,GroupNorm 可以说是将之视为 [batch, group, channel // group, hw]
,然后在 [channel // group, hw]
维度进行归一化。
当 group=channel 时,GroupNorm 等价于 InstanceNorm;当 group=1 时,GroupNorm 等价于 LayerNorm。
GroupNorm 会进行 batch * group 次归一化。
总结
BatchNorm 很强大。但如果 batch_size 的影响过分恶劣(例如 batch_size 小于 8),使用 GroupNorm 值得一试。
LayerNorm 更适合 RNN 和 NLP 领域;BatchNorm 更适合计算机视觉。
参考来源
- 将为帅,“一文搞懂BatchNormalization,Layer/Instance/GroupNorm”,https://zhuanlan.zhihu.com/p/152232203
- 无双谱,“从0到1:批量规范化BatchNormalization(原理篇)”,https://zhuanlan.zhihu.com/p/52736691
- DoubleV,“全面解读Group Normalization-(吴育昕-何恺明 )”,https://zhuanlan.zhihu.com/p/35005794
- Florian June,“BatchNorm and LayerNorm”,https://medium.com/@florian_algo/batchnorm-and-layernorm-2637f46a998b