看mnist數據集上其餘人的CNN模型時瞭解到了Batch Normalization 這種操做。效果還不錯,至少對於訓練速度提高了不少。html
batch normalization的作法是把數據轉換爲0均值和單位方差網絡
2. How to Batch Normalize?
怎樣學BN的參數在此就不贅述了,就是經典的chain rule:app
3. Where to use BN?
BN能夠應用於網絡中任意的activation set。文中還特別指出在CNN中,BN應做用在非線性映射前,即對作規範化。另外對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就是分佈不一致假設之下的一個分支問題,它是指源空間和目標空間的條件機率是一致的,可是其邊緣機率不一樣,即:對全部,
,可是
. 你們細想便會發現,的確,對於神經網絡的各層輸出,因爲它們通過了層內操做做用,其分佈顯然與各層對應的輸入信號分佈不一樣,並且差別會隨着網絡深度增大而增大,但是它們所能「指示」的樣本標記(label)仍然是不變的,這便符合了covariate shift的定義。因爲是對層間信號的分析,也便是「internal」的來由。機器學習
那BN究竟是什麼原理呢?說到底仍是爲了防止「梯度彌散」。關於梯度彌散,你們都知道一個簡單的栗子:。在BN中,是經過將activation規範爲均值和方差一致的手段使得本來會減少的activation的scale變大。能夠說是一種更有效的local response normalization方法(見4.2.1節)。學習
5. When to use BN?
OK,說完BN的優點,天然能夠知道何時用BN比較好。例如,在神經網絡訓練時遇到收斂速度很慢,或梯度爆炸等沒法訓練的情況時能夠嘗試BN來解決。另外,在通常使用狀況下也能夠加入BN來加快訓練速度,提升模型精度。spa
參考資料:.net
https://blog.csdn.net/shuzfan/article/details/50723877scala
https://www.zhihu.com/question/38102762orm
https://arxiv.org/pdf/1502.03167.pdf