1. 程式人生 > >Batch Normalization解讀

Batch Normalization解讀

1.為什麼要用BN

在神經網路訓練過程中,經常會出現梯度爆炸或者梯度消失的問題,導致網路訓練困難,特別是在網路層數較多的情況下,網路層數多,網路更新一次,較後的層的輸入資料的分佈會發生較大變化,所以後面的層又要適應這種變化,相當於要求這些層能適應不同分佈的輸入,並總結出規律,這就導致網路訓練很慢,而且不一定會收斂。如果保證每一層的輸入的分佈是穩定的,那麼網路訓練起來會收斂的更快,而且更不依賴於初始化的值。先前的研究中表明,對資料做白化之後可以加快網路的收斂,受此啟發,作者想到在訓練的時候,可以對每一層的輸入資料做白化,白化就是通過空間變換把資料變成均值為0,方差為1的高斯分佈,然而白化操作是很複雜費時。退而求其次,將白化改成將輸入做移動和線性變換,使得輸入的均值為0,方差為1。

單純的歸一化之後,資料的分佈為均值為0,方差為1,BN層的輸出就很有可能在在啟用函式的線性段,多個線性層可以用一個線性來代替,這樣網路的非線性表達能力就不好,所以加上一個係數r,和偏置b,讓輸入能夠到達啟用函式的非線性區域,這兩個引數可以讓網路自學習。尤其是當兩個引數如下時,輸入為原始輸入。這樣輸入既可以是原始輸入也可以是歸一化後的輸入,也可以是歸一化後的輸入的線性變換,讓網路自己學習要什麼樣的輸入。

2.訓練中如何batchnormalization

BN層執行的操作如下圖,eps的作用是保證分母不會除零,計算每個featuremap的minibatch集內的均值方差,歸一化每個神經元xi,也就是CNN中featuremap的每個畫素點,然後乘一個係數r,加上偏置b(初始化時一般r=1,b=0),得到輸出yi,然後yi輸入到啟用函式,啟用函式的輸出再輸入下一個卷積層,下一個卷積層的輸出又重複以上操作。一般BN層都加在非線性層前面。引數r,b也是通過反向傳播演算法學習得到。所以在訓練中,forward和backward都經過BN層。

梯度反向傳播計算公式(epsilon用來防止除0) 3.BN層反向傳播公式推導 http://blog.csdn.net/pan5431333/article/details/78052867 4.測試(inference)時如何batchnormalization 在訓練時,歸一化輸入用的是minibatch的均值方差,而實際上,整個訓練集的均值方差是最能反映資料分佈的,但是由於訓練的計算量考慮,用隨機抽取的minibatch也能大致反映資料的分佈。但是到了測試的時候,輸入只有一個,BN無法對一個輸入歸一化,所以在網路每次訓練時,會儲存每個minibatch的均值方差,在網路訓練好之後,BN層的均值方差用之前訓練用的所有minibatch對整個資料集的均值方差的無偏估計量來代替。r,b任然用仍然用訓練得到的引數。