1. 程式人生 > 實用技巧 >《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》

《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》

字可以看出,BN是用來解決“Internal Covariate Shift”問題的,那麼首先得理解什麼是“Internal Covariate Shift”?
  論文首先說明Mini-Batch SGD相對於One Example SGD的兩個優勢:梯度更新方向更準確;平行計算速度快;
(為什麼要說這些?因為BatchNorm是基於Mini-Batch SGD的,所以先誇下Mini-Batch SGD,當然也是大實話);
然後吐槽下SGD訓練的缺點:超引數調起來很麻煩。(作者隱含意思是用BN就能解決很多SGD的缺點)
  接著引入covariate shift的概念:如果ML系統例項集合<X,Y>中的輸入值X的分佈老是變,這不符合IID假設,
網路模型很難穩定的學規律,這不得引入遷移學習才能搞定嗎,我們的ML系統還得去學習怎麼迎合這種分佈變化啊。
對於深度學習這種包含很多隱層的網路結構,在訓練過程中,因為各層引數不停在變化,所以每個隱層都會面臨covariate shift的問題,
也就是在訓練過程中,隱層的輸入分佈老是變來變去,這就是所謂的“Internal Covariate Shift”,Internal指的是深層網路的隱層,
是發生在網路內部的事情,而不是covariate shift問題只發生在輸入層。
  然後提出了BatchNorm的基本思想:能不能讓每個隱層節點的啟用輸入分佈固定下來呢?這樣就避免了“Internal Covariate Shift”問題了。
BN不是憑空拍腦袋拍出來的好點子,它是有啟發來源的:之前的研究表明如果在影象處理中對輸入影象進行白化(Whiten)操作的話——所謂白化,
就是對輸入資料分佈變換到0均值,單位方差的正態分佈——那麼神經網路會較快收斂,那麼BN作者就開始推論了:影象是深度神經網路的輸入層,
做白化能加快收斂,那麼其實對於深度網路來說,其中某個隱層的神經元是下一層的輸入,意思是其實深度神經網路的每一個隱層都是輸入層,
不過是相對下一層來說而已,那麼能不能對每個隱層都做白化呢?這就是啟發BN產生的原初想法,而BN也確實就是這麼做的,
可以理解為對深層神經網路每個隱層神經元的啟用值做簡化版本的白化操作。
BN的基本思想其實相當直觀:因為深層神經網路在做非線性變換前的啟用輸入值(就是那個x=WU+B,U是輸入)隨著網路深度加深或者在訓練過程中,
其分佈逐漸發生偏移或者變動,之所以訓練收斂慢,一般是整體分佈逐漸往非線性函式的取值區間的上下限兩端靠近
(對於Sigmoid函式來說,意味著啟用輸入值WU+B是大的負值或正值),所以這導致反向傳播時低層神經網路的梯度消失,
這是訓練深層神經網路收斂越來越慢的本質原因,而BN就是通過一定的規範化手段,把每層神經網路任意神經元這個輸入值的分佈強行拉回到均值為0
方差為1的標準正態分佈,其實就是把越來越偏的分佈強制拉回比較標準的分佈,這樣使得啟用輸入值落在非線性函式對輸入比較敏感的區域,
這樣輸入的小變化就會導致損失函式較大的變化,意思是這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味著學習收斂速度快,能大大加快訓練速度。
  THAT’S IT。其實一句話就是:對於每個隱層神經元,把逐漸向非線性函式對映後向取值區間極限飽和區靠攏的輸入分佈強制拉回到均值為0
方差為1的比較標準的正態分佈,使得非線性變換函式的輸入值落入對輸入比較敏感的區域,以此避免梯度消失問題。因為梯度一直都能保持比較大的狀態,
所以很明顯對神經網路的引數調整效率比較高,就是變動大,就是說向損失函式最優值邁動的步子大,也就是說收斂地快。BN說到底就是這麼個機制,
方法很簡單,道理很深刻。
https://www.cnblogs.com/guoyaohua/p/8724433.html