Batch Normalization的作用及原理
目錄
- 聲明
- BN是什么[1]
- 為什么提出BN[1, 2]
- BN的作用及原理
- 加速訓練,提高收斂速度[1]
- 緩解梯度消失(梯度爆炸)[3]
- 緩解過擬合[4]
- 其他相關問題
- BN和激活函數的順序問題[5]
- 使用ReLU還需要用BN嗎[6, 7]
聲明
由于學習本篇博客的內容時翻閱了很多資源,如知乎、他人博客等,很多內容已經不記得是在哪學到的了,也沒有辦法一一列舉了,能列舉的我盡量列舉,如有侵權,請聯系我刪除,謝謝。
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時,對于某一層的前向傳播,應有:
Hl=WlTHl?1H_l=W_l^TH_{l-1}Hl?=WlT?Hl?1?
那么該層的反向傳播梯度為:
?Hl?Hl?1=Wl\frac{\partial H_l}{\partial H_{l-1}}=W_l?Hl?1??Hl??=Wl?
多層累計后的梯度為:
?Hl?Hk=∏i=k+1lWi\frac{\partial H_l}{\partial H_k}=\prod_{i=k+1}^lW_i?Hk??Hl??=i=k+1∏l?Wi?
可以看出,如果WiW_iWi?總是較小的,經過不斷的連乘,梯度呈指數級下降,即梯度消失。反之,如果WiW_iWi?總是較大的,會發生梯度爆炸。
- 使用BN
帶有BN的前向傳播為:
Hl=BN(WlTHl?1)=1σl(WlTHl?1?μl)H_l=BN(W_l^TH_{l-1})=\frac{1}{\sigma_l}(W_l^TH_{l-1}-\mu_l)Hl?=BN(WlT?Hl?1?)=σl?1?(WlT?Hl?1??μl?)
則反向傳播的梯度為:
?Hl?Hl?1=Wl1σl\frac{\partial H_l}{\partial H_{l-1}}=W_l\frac{1}{\sigma_l}?Hl?1??Hl??=Wl?σl?1?
多層累計后的梯度為:
?Hl?Hk=∏i=k+1lWi1σi\frac{\partial H_l}{\partial H_k}=\prod_{i=k+1}^lW_i\frac{1}{\sigma_i}?Hk??Hl??=i=k+1∏l?Wi?σi?1?
可以看出,使用BN后,在反向傳播時,使用1σi\frac{1}{\sigma_i}σi?1?對梯度進行了縮放。如果WiW_iWi?較小,則WiTHl?1W_i^TH_{l-1}WiT?Hl?1?較小,則σi{\sigma_i}σi?較小,1σi\frac{1}{\sigma_i}σi?1?較大,Wi1σlW_i\frac{1}{\sigma_l}Wi?σl?1?比WiW_iWi?大,實現了放縮。如果WiW_iWi?較大,也是同理。為什么WiTHl?1W_i^TH_{l-1}WiT?Hl?1?較小,則σ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,具體如下式:
outputAfter_BN=output?batch_mean(output)batch_variance(output)output_{After\_BN}=\frac{output-batch\_mean(output)}{batch\_variance(output)}outputAfter_BN?=batch_variance(output)output?batch_mean(output)?
這說明,在每一次訓練過程中,即使對于相同的樣本,如果在batch中的其他樣本發生了變化,batch_mean(output)batch\_mean(output)batch_mean(output)和batch_variance(output)batch\_variance(output)batch_variance(output)就會發生變化。這會導致,相同樣本在不同的batch中會產生不同的outputAfter_BNoutput_{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
總結
以上是生活随笔為你收集整理的Batch Normalization的作用及原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人周报20200420
- 下一篇: 过拟合、欠拟合的原因和解决办法