Batch Normalization的作用及原理

声明

由于学习本篇博客的内容时翻阅了很多资源,如知乎、他人博客等,很多内容已经不记得是在哪学到的了,也没有办法一一列举了,能列举的我尽量列举,如有侵权,请联系我删除,谢谢。

BN是什么[1]

BN是谷歌在这篇文章中提出的。具体的操作是,在每次SGD时,对mini-batch进行规范化操作,使结果的均值为0,方差为1。再经过scale+shift操作,尽量去还原BN前的输出。


为什么提出BN[1, 2]

先看一下论文的题目《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》,可以看出,BN的动机是降低Internal Covariate Shift(以下简称ICS)来加速网络训练,下面解释什么是ICS。

在训练过程中,由于不同层的参数是不断变化的,这会导致,对于不同层,输入的分布是不断变化的。随着网络层数的加深,高层输入的分布会与原始输入样本的分布存在较大差异。以上便是ICS问题。

由于ICS问题,模型的优化难度变大,收敛速度慢。

BN的作用及原理

加速训练,提高收敛速度[1]

一方面,BN通过固定层间数据分布的方法,解决了ICS问题,从而提高了模型的训练速度。另一方面,由于BN能够缓解梯度消失(梯度爆炸),可以提高模型的收敛速度。

缓解梯度消失(梯度爆炸)[3]

  • 不使用BN
    在不使用BN时,对于某一层的前向传播,应有:
    H l = W l T H l − 1 H_l=W_l^TH_{l-1} Hl=WlTHl1
    那么该层的反向传播梯度为:
    ∂ H l ∂ H l − 1 = W l \frac{\partial H_l}{\partial H_{l-1}}=W_l Hl1Hl=Wl
    多层累计后的梯度为:
    ∂ H l ∂ H k = ∏ i = k + 1 l W i \frac{\partial H_l}{\partial H_k}=\prod_{i=k+1}^lW_i HkHl=i=k+1lWi
    可以看出,如果 W i W_i Wi总是较小的,经过不断的连乘,梯度呈指数级下降,即梯度消失。反之,如果 W i W_i Wi总是较大的,会发生梯度爆炸。

  • 使用BN
    带有BN的前向传播为:
    H l = B N ( W l T H l − 1 ) = 1 σ l ( W l T H l − 1 − μ l ) H_l=BN(W_l^TH_{l-1})=\frac{1}{\sigma_l}(W_l^TH_{l-1}-\mu_l) Hl=BN(WlTHl1)=σl1(WlTHl1μl)
    则反向传播的梯度为:
    ∂ H l ∂ H l − 1 = W l 1 σ l \frac{\partial H_l}{\partial H_{l-1}}=W_l\frac{1}{\sigma_l} Hl1Hl=Wlσl1
    多层累计后的梯度为:
    ∂ H l ∂ H k = ∏ i = k + 1 l W i 1 σ i \frac{\partial H_l}{\partial H_k}=\prod_{i=k+1}^lW_i\frac{1}{\sigma_i} HkHl=i=k+1lWiσi1
    可以看出,使用BN后,在反向传播时,使用 1 σ i \frac{1}{\sigma_i} σi1对梯度进行了缩放。如果 W i W_i Wi较小,则 W i T H l − 1 W_i^TH_{l-1} WiTHl1较小,则 σ i {\sigma_i} σi较小, 1 σ i \frac{1}{\sigma_i} σi1较大, W i 1 σ l W_i\frac{1}{\sigma_l} Wiσl1 W i W_i Wi大,实现了放缩。如果 W i W_i Wi较大,也是同理。为什么 W i T H l − 1 W_i^TH_{l-1} WiTHl1较小,则 σ i {\sigma_i} σi较小?举个例子,1,5,10,20,30这组数据的标准差是10.5338,而0.1,0.5,1,2,3这组数据的标准差是1.05338。

缓解过拟合[4]

BN能够缓解过拟合在于引入了noise。对于特定的一层,在某个batch的前向传播过程中,如果添加了BN操作,则会对该层的输出进行normalization,具体如下式:
o u t p u t A f t e r _ B N = o u t p u t − b a t c h _ m e a n ( o u t p u t ) b a t c h _ v a r i a n c e ( o u t p u t ) output_{After\_BN}=\frac{output-batch\_mean(output)}{batch\_variance(output)} outputAfter_BN=batch_variance(output)outputbatch_mean(output)
这说明,在每一次训练过程中,即使对于相同的样本,如果在batch中的其他样本发生了变化, b a t c h _ m e a n ( o u t p u t ) batch\_mean(output) batch_mean(output) b a t c h _ v a r i a n c e ( o u t p u t ) batch\_variance(output) batch_variance(output)就会发生变化。这会导致,相同样本在不同的batch中会产生不同的 o u t p u t A f t e r _ B N output_{After\_BN} outputAfter_BN,相当于对于每个样本都引入了noise。模型为了克服样本的noise,会更加generalize,即降低了过拟合。

其他相关问题

BN和激活函数的顺序问题[5]

现在大多数的模型中都是用BN+ReLU,但是从BN论文的原理上将,其实ReLU+BN似乎能更好的解决ICS问题,下面分析一下两种方式的优缺点。

  • BN+ReLU
    让ReLU更好的进行特征选择,使其单侧抑制起作用。
  • ReLU+BN
    更好地解决ICS问题,训练效率更高。

使用ReLU还需要用BN吗[6, 7]

由于ReLU有dead neuron问题,使用BN后可以保证有一定占比的神经元处于激活状态,解决了dying ReLU问题。


[1] https://www.zhihu.com/question/38102762
[2] https://zhuanlan.zhihu.com/p/136701745
[3] https://www.zhihu.com/collection/537883741
[4] https://www.zhihu.com/question/291571486/answer/861428056
[5] https://zhuanlan.zhihu.com/p/113442866
[6] https://www.zhihu.com/question/304603935/answer/544970232
[7] https://www.zhihu.com/question/338802747/answer/784239481

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值