深度學習中 Batch Normalization爲何效果好

看mnist數據集上其餘人的CNN模型時瞭解到了Batch Normalization 這種操做。效果還不錯,至少對於訓練速度提高了不少。html

batch normalization的作法是把數據轉換爲0均值和單位方差網絡

這裏分五部分簡單解釋一下Batch Normalization (BN)。
1. What is BN?
顧名思義,batch normalization嘛,就是「批規範化」咯。Google在ICML文中描述的很是清晰,即在每次SGD時,經過mini-batch來對相應的activation作規範化操做,使得結果(輸出信號各個維度)的均值爲0,方差爲1. 而最後的「scale and shift」操做則是爲了讓因訓練所需而「刻意」加入的BN可以有可能還原最初的輸入(即當 \gamma^{(k)}=\sqrt{Var[x^{(k)}]}, \beta^{(k)}=E[x^{(k)}]),從而保證整個network的capacity。(有關capacity的解釋:實際上BN能夠看做是在原模型上加入的「新操做」,這個新操做很大可能會改變某層原來的輸入。固然也可能不改變,不改變的時候就是「還原原來輸入」。如此一來,既能夠改變同時也能夠保持原輸入,那麼模型的容納能力(capacity)就提高了。)

關於DNN中的normalization,你們都知道白化(whitening),只是在模型訓練過程當中進行白化操做會帶來太高的計算代價和運算時間。所以本文提出兩種簡化方式:1)直接對輸入信號的每一個維度作規範化(「normalize each scalar feature independently」);2)在每一個mini-batch中計算獲得mini-batch mean和variance來替代總體訓練集的mean和variance. 這即是Algorithm 1.

 

2. How to Batch Normalize?
怎樣學BN的參數在此就不贅述了,就是經典的chain rule:app


3. Where to use BN?
BN能夠應用於網絡中任意的activation set。文中還特別指出在CNN中,BN應做用在非線性映射前,即對x=Wu+b作規範化。另外對CNN的「權值共享」策略,BN還有其對應的作法(詳見文中3.2節)。dom

4. Why BN?
好了,如今纔是重頭戲--爲何要用BN?BN work的緣由是什麼?
說到底,BN的提出仍是爲了克服深度神經網絡難以訓練的弊病。其實BN背後的insight很是簡單,只是在文章中被Google複雜化了。
首先來講說「Internal Covariate Shift」。文章的title除了BN這樣一個關鍵詞,還有一個即是「ICS」。你們都知道在統計機器學習中的一個經典假設是「源空間(source domain)和目標空間(target domain)的數據分佈(distribution)是一致的」。若是不一致,那麼就出現了新的機器學習問題,如,transfer learning/domain adaptation等。而covariate shift就是分佈不一致假設之下的一個分支問題,它是指源空間和目標空間的條件機率是一致的,可是其邊緣機率不一樣,即:對全部x\in \mathcal{X},P_s(Y|X=x)=P_t(Y|X=x),可是P_s(X)\ne P_t(X). 你們細想便會發現,的確,對於神經網絡的各層輸出,因爲它們通過了層內操做做用,其分佈顯然與各層對應的輸入信號分佈不一樣,並且差別會隨着網絡深度增大而增大,但是它們所能「指示」的樣本標記(label)仍然是不變的,這便符合了covariate shift的定義。因爲是對層間信號的分析,也便是「internal」的來由。機器學習

那麼好,爲何前面我說Google將其複雜化了。其實若是嚴格按照解決covariate shift的路子來作的話,大概就是上「importance weight」( ref)之類的機器學習方法。但是這裏Google僅僅說「經過mini-batch來規範化某些層/全部層的輸入,從而能夠固定每層輸入信號的均值與方差」就能夠解決問題。若是covariate shift能夠用這麼簡單的方法解決,那前人對其的研究也真真是白作了。此外,試想,均值方差一致的分佈就是一樣的分佈嗎?固然不是。顯然,ICS只是這個問題的「包裝紙」嘛,僅僅是一種high-level demonstration。

那BN究竟是什麼原理呢?說到底仍是爲了防止「梯度彌散」。關於梯度彌散,你們都知道一個簡單的栗子:0.9^{30}\approx 0.04。在BN中,是經過將activation規範爲均值和方差一致的手段使得本來會減少的activation的scale變大。能夠說是一種更有效的local response normalization方法(見4.2.1節)。學習

5. When to use BN?
OK,說完BN的優點,天然能夠知道何時用BN比較好。例如,在神經網絡訓練時遇到收斂速度很慢,或梯度爆炸等沒法訓練的情況時能夠嘗試BN來解決。另外,在通常使用狀況下也能夠加入BN來加快訓練速度,提升模型精度。spa


誠然,在DL中還有許多除BN以外的「小trick」。別看是「小trick」,實則是「大殺器」,正所謂「The devil is in the details」。但願瞭解其它DL trick(特別是CNN)的各位請移步我以前總結的:Must Know Tips/Tricks in Deep Neural Networks
以上。

 
 

做者:魏秀參
連接:https://www.zhihu.com/question/38102762/answer/85238569
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

 

參考資料:.net

https://blog.csdn.net/shuzfan/article/details/50723877scala

https://www.zhihu.com/question/38102762orm

https://arxiv.org/pdf/1502.03167.pdf

相關文章
相關標籤/搜索