这次想总结一下神经网络中的各种normalization。
- Batch Normalization
- Layer Normalization
- Instance Normalization
- Group Normalization
BN
为什么提出BN? 深度神经网络随着网络深度的加深,训练起来越来越困难,收敛越来越慢。
我们看一下论文题目:《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》,BN通过减少内部协方差偏移,从而加速了网络的训练。
内部协方差偏移:在训练过程中,参数不停地变化,隐层的输入分布变来变去,这样使得网络难以训练。
BN是在深度神经网络训练过程中使得每一层的输入保持均值为0,方差为1的分布。
网络收敛越来越慢的原因是底层神经网络的梯度消失。BN对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0,方差为1的标准正态分布,使得非线性变换函数的输入值落入对输入值比较敏感的区域(几乎线性区内),以此缓解梯度消失。
为了防止网络的表达能力下降,在进行均值为0方差为1的操作后,每个神经元还增加了两个参数scale和shift, y = s c a l e ∗ x + s h i f t y = scale * x + shift y=scale∗x+shift,这两个参数是训练学习到的。
训练阶段:使用mini-batch的均值和方差
测试阶段:将训练过程中每个mini-batch的均值和方差记录下来,对其求期望。测试阶段是固定的。
BN效果真的是好:
- 提升训练速度,加快收敛速度
- 防止过拟合,可以不使用dropout
- 对初始化要求不高
- 可以使用大的学习率
BN的缺点:幕后黑手就是—batch
- 受到batchsize的影响,如果batchsize太小,效果明显下降。因为得不到有效的统计量。
- 对于像素级图片生成任务来说,BN效果不佳。
- RNN等动态网络使用BN效果不佳且使用不方便。
- 训练和推理时统计量不一致,虽实际使用并没有大问题。
LN、IN和GN
LN适合用在RNN这种动态网络。
IN只适合CNN。IN对于一些图片生成类的任务比如图片风格转换来说效果是明显优于BN的,但在很多其它图像类任务比如分类等场景效果不如BN。
GN介于LN和IN之间。Batchsize较小时使用GN。
这三种都和batchsize无关,自然不受到其影响。
[1] https://www.cnblogs.com/guoyaohua/p/8724433.html
[2] https://blog.youkuaiyun.com/qq_14845119/article/details/79702040
[3] 张俊林老师的博客 https://blog.youkuaiyun.com/malefactor/article/details/82154224#commentBox