BN層詳解

批量歸一化(BN:Batch Normalization:解決在訓練過程中,中間層數據分佈發生改變的問題,以防止梯度消失或爆炸、加快訓練速度)

1、爲什麼輸入數據需要歸一化(Normalized Data)?

        歸一化後有什麼好處呢?原因在於神經網絡學習過程本質就是爲了學習數據分佈,一旦訓練數據與測試數據的分佈不同,那麼網絡的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分佈各不相同(batch 梯度下降),那麼網絡就要在每次迭代都去學習適應不同的分佈,這樣將會大大降低網絡的訓練速度,這也正是爲什麼我們需要對數據都要做一個歸一化預處理的原因。

        對於深度網絡的訓練是一個複雜的過程,只要網絡的前面幾層發生微小的改變,那麼後面幾層就會被累積放大下去。一旦網絡某一層的輸入數據的分佈發生改變,那麼這一層網絡就需要去適應學習這個新的數據分佈,所以如果訓練過程中,訓練數據的分佈一直在發生變化,那麼將會影響網絡的訓練速度。

2、BN訓練  

1)隨機梯度下降法(SGD)對於訓練深度網絡簡單高效,但是它有個毛病,就是需要我們人爲的去選擇參數,比如學習率、參數初始化、權重衰減係數、Drop out比例等。這些參數的選擇對訓練結果至關重要,以至於我們很多時間都浪費在這些的調參上。那麼使用BN之後,你可以不需要那麼刻意的慢慢調整參數。

2)神經網絡一旦訓練起來,那麼參數就要發生更新,除了輸入層的數據外(因爲輸入層數據,我們已經人爲的爲每個樣本歸一化),後面網絡每一層的輸入數據分佈是一直在發生變化的,因爲在訓練的時候,前面層訓練參數的更新將導致後面層輸入數據分佈的變化。以網絡第二層爲例:網絡的第二層輸入,是由第一層的參數和input計算得到的,而第一層的參數在整個訓練過程中一直在變化,因此必然會引起後面每一層輸入數據分佈的改變。我們把網絡中間層在訓練過程中,數據分佈的改變稱之爲:“Internal  Covariate Shift”。文章所提出的算法,就是要解決在訓練過程中,中間層數據分佈發生改變的情況,於是就有了Batch  Normalization,這個算法的誕生。

3)BN的地位:與激活函數層、卷積層、全連接層、池化層一樣,BN(Batch Normalization)也屬於網絡的一層。

4)BN的本質原理:在網絡的每一層輸入的時候,又插入了一個歸一化層,也就是先做一個歸一化處理(歸一化至:均值0、方差爲1),然後再進入網絡的下一層。不過文獻歸一化層,可不像我們想象的那麼簡單,它是一個可學習、有參數(γ、β)的網絡層。

3、BN的作用

 1)改善流經網絡的梯度

 2)允許更大的學習率,大幅提高訓練速度:

      你可以選擇比較大的初始學習率,讓你的訓練速度飆漲。以前還需要慢慢調整學習率,甚至在網絡訓練到一半的時候,還需要想着學習率進一步調小的比例選擇多少比較合適,現在我們可以採用初始很大的學習率,然後學習率的衰減速度也很大,因爲這個算法收斂很快。當然這個算法即使你選擇了較小的學習率,也比以前的收斂速度快,因爲它具有快速訓練收斂的特性;

 3)減少對初始化的強烈依賴

 4)改善正則化策略:作爲正則化的一種形式,輕微減少了對dropout的需求

       你再也不用去理會過擬閤中drop out、L2正則項參數的選擇問題,採用BN算法後,你可以移除這兩項了參數,或者可以選擇更小的L2正則約束參數了,因爲BN具有提高網絡泛化能力的特性;

 5)再也不需要使用使用局部響應歸一化層了(局部響應歸一化是Alexnet網絡用到的方法,搞視覺的估計比較熟悉),因爲BN本身就是一個歸一化網絡層;

6)可以把訓練數據徹底打亂(防止每批訓練的時候,某一個樣本都經常被挑選到,文獻說這個可以提高1%的精度)。

注:以上爲學習過程,在測試時,均值和方差(mean/std)不基於小批量進行計算, 可取訓練過程中的激活值的均值。

參考:https://www.cnblogs.com/king-lps/p/8378561.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章