Batch Normalizatoin學習筆記

原文地址:https://blog.csdn.net/hjimce/article/details/50866313

我們知道再神經網絡訓練之前,都需要對輸入數據做一個歸一化處理,那麼具體爲什麼要歸一化呢?歸一化之後又什麼好處呢?

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


Batch Normalization概述

就像激活函數層、卷積層、全連接層、池化層一樣,BN(Batch Normalization)也屬於網絡的一層。在前面我們提到網絡除了輸出層外,其它層因爲低層網絡在訓練的時候更新了參數,而引起後面層輸入數據分佈的變化。這個時候我們可能就會想,如果在每一層輸入的時候,再加個預處理操作那該有多好啊,比如網絡第三層輸入數據X3(X3表示網絡第三層的輸入數據)把它歸一化至:均值0、方差爲1,然後再輸入第三層計算,這樣我們就可以解決前面所提到的“Internal Covariate Shift”的問題了。


而事實上,paper的算法本質原理就是這樣:在網絡的每一層輸入的時候,又插入了一個歸一化層,也就是先做一個歸一化處理,然後再進入網絡的下一層。不過文獻歸一化層,可不像我們想象的那麼簡單,它是一個可學習、有參數的網絡層。既然說到數據預處理,下面就先來複習一下最強的預處理方法:白化


BN算法概述

經過前面簡單介紹,這個時候可能我們會想當然的以爲:好像很簡單的樣子,不就是在網絡中間層數據做一個歸一化處理嘛,這麼簡單的想法,爲什麼之前沒人用呢?然而其實實現起來並不是那麼簡單的。其實如果是僅僅使用上面的歸一化公式,對網絡某一層A的輸出數據做歸一化,然後送入網絡下一層B,這樣是會影響到本層網絡A所學習到的特徵的。打個比方,比如我網絡中間某一層學習到特徵數據本身就分佈在S型激活函數的兩側,你強制把它給我歸一化處理、標準差也限制在了1,把數據變換成分佈於s函數的中間部分,這樣就相當於我這一層網絡所學習到的特徵分佈被你搞壞了,這可怎麼辦?於是文獻使出了一招驚天地泣鬼神的招式:變換重構,引入了可學習參數γ、β,這就是算法關鍵之處:

                                

每一個神經元xk都會有一對這樣的參數γ、β。這樣其實當:

                                    

是可以恢復出原始的某一層所學到的特徵的。因此我們引入了這個可學習重構參數γ、β,讓我們的網絡可以學習恢復出原始網絡所要學習的特徵分佈。最後Batch Normalization網絡層的前向傳導過程公式就是:


上面的公式中m指的是mini-batch size。


Batch Normalization在CNN中的使用

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

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

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