一、BN(Batch Nomalization,批标准化)
1、为什么要做BN
个人觉得这篇文章讲的很好https://zhuanlan.zhihu.com/p/24810318
一般来说,如果模型的输入特征不相关且满足标准正态分布时,模型的表现一般较好。
但是当每层数据在经过激活函数后,数据值容易趋向于激活函数的饱和值,那么当经过多层的激活函数后,数据将趋于极点,从而丧失了数据原本的分布信息,这时候模型的表现将下降。
为了充分利用数据以及激活函数的的分布信息,我们在每一层后面都会做一个BN,重新将数据标准化。
2、BN的作用
https://zhuanlan.zhihu.com/p/26138673
贴出论文中的两张图,就可以说明BN层的作用
- 使得模型训练收敛的速度更快
- 模型隐藏输出特征的分布更稳定,更利于模型的学习
这图可以看出BN在更小的step时,就能趋近于收敛。且输出的数据波动性更小。
3、如何做BN
算法如下:
我们会发现最后有个反标准化的操作, 将 normalize 后的数据再扩展和平移。这是为了让神经网络自己去学着使用和修改这个扩展参数 gamma, 和 平移参数 β, 这样神经网络就能自己慢慢琢磨出前面的 normalization 操作到底有没有起到优化的作用, 如果没有起到作用, 我就使用 gamma 和 belt 来抵消一些 normalization 的操作.
4、BN的限制
https://zhuanlan.zhihu.com/p/54171297
BN是深度学习调参中非常好用的策略之一(另外一个可能就是Dropout),当你的模型发生梯度消失/爆炸或者损失值震荡比较严重的时候,在BN中加入网络往往能取得非常好的效果。
BN也有一些不是非常适用的场景,在遇见这些场景时要谨慎的使用BN:
- 受制于硬件限制,每个Batch的尺寸比较小,这时候谨慎使用BN;
- 在类似于RNN的动态网络中谨慎使用BN;
- 训练数据集和测试数据集方差较大的时候。
5、如何代码实现BN
https://blog.csdn.net/weixin_40123108/article/details/83509838
https://zhuanlan.zhihu.com/p/269465213
三、BN和LN的区别