BN算法


批量歸一化(BN: Batch Normalization)

1 BN訓練    

    1)隨機梯度下降法(SGD)對於訓練深度網絡簡單高效,但是它有個毛病,就是需要我們人為的去選擇參數,比如學習率、參數初始化、權重衰減系數、Drop out比例等。這些參數的選擇對訓練結果至關重要,以至於我們很多時間都浪費在這些的調參上。那么使用BN(詳見論文《Batch Normalization_ Accelerating Deep Network Training by Reducing Internal Covariate Shift》)之后,你可以不需要那么刻意的慢慢調整參數。

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

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

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

   5)歸一化公式:

        

   6)如果是僅僅使用上面的歸一化公式,對網絡某一層A的輸出數據做歸一化,然后送入網絡下一層B,這樣是會影響到本層網絡A所學習到的特征的。比如我網絡中間某一層學習到特征數據本身就分布在S型激活函數的兩側,你強制把它給我歸一化處理、標准差也限制在了1,把數據變換成分布於s函數的中間部分,這樣就相當於我這一層網絡所學習到的特征分布被你搞壞了,這可怎么辦?於是文獻使出了一招驚天地泣鬼神的招式:變換重構,引入了可學習參數γ、β,這就是算法關鍵之處:

       

       上面的公式表明,通過學習到的重構參數γ、β,是可以恢復出原始的某一層所學到的特征的。

   

     7)引入了這個可學習重構參數γ、β,讓我們的網絡可以學習恢復出原始網絡所要學習的特征分布。最后Batch Normalization網絡層的前向傳導過程公式就是:

             

             

 

     8)BN層是對於每個神經元做歸一化處理,甚至只需要對某一個神經元進行歸一化,而不是對一整層網絡的神經元進行歸一化。既然BN是對單個神經元的運算,那么在CNN中卷積層上要怎么搞?假如某一層卷積層有6個特征圖,每個特征圖的大小是100*100,這樣就相當於這一層網絡有6*100*100個神經元,如果采用BN,就會有6*100*100個參數γ、β,這樣豈不是太恐怖了。因此卷積層上的BN使用,其實也是使用了類似權值共享的策略,把一整張特征圖當做一個神經元進行處理。

    9)卷積神經網絡經過卷積后得到的是一系列的特征圖,如果min-batch sizes為m,那么網絡某一層輸入數據可以表示為四維矩陣(m,f,w,h),m為min-batch sizes,f為特征圖個數,w、h分別為特征圖的寬高。在CNN中我們可以把每個特征圖看成是一個特征處理(一個神經元),因此在使用Batch Normalization,mini-batch size 的大小就是:m*w*h,於是對於每個特征圖都只有一對可學習參數:γ、β。說白了吧,這就是相當於求取所有樣本所對應的一個特征圖的所有神經元的平均值、方差,然后對這個特征圖神經元做歸一化。

    10)    在使用BN前,減小學習率、小心的權重初始化的目的是:使其輸出的數據分布不要發生太大的變化。

    11) BN的作用:

       1)改善流經網絡的梯度

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

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

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

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

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

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

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

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

 

 

2 BN測試

     1)實際測試時,我們依然使用下面的公式:

         

        這里的均值和方差已經不是針對某一個Batch了,而是針對整個數據集而言。因此,在訓練過程中除了正常的前向傳播和反向求導之外,我們還要記錄每一個Batch的均值和方差,以便訓練完成之后按照下式計算整體的均值和方差:  

         

參考:

https://blog.csdn.net/qq_37100442/article/details/81776191

https://blog.csdn.net/qq_30478885/article/details/78816516


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM