1. 程式人生 > >批歸一化Batch Normalization

批歸一化Batch Normalization

“ 真正牛逼的,不是那些可以隨口拿來誇耀的事蹟,而是那些在困境中依然保持微笑的凡人。”

 

說一說BN層吧

最近狂補基礎,還是學得不夠~

加油,

送給所有心存堅持的人。

 

一、BN提出的背景意義

《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》,Batch Normalization演算法目前已經被大量的應用,最新的文獻演算法很多都會引用這個演算法,進行網路訓練,可見其強大之處。

隨機梯度下降法是訓練深度網路的首選。儘管隨機梯度下降法對於訓練深度網路簡單高效,但是需要我們人為的去選擇引數,比如學習速率、初始化引數、權重衰減係數、Drop out比例,等等。這些引數的選擇對訓練結果至關重要,以至於我們很多時間都浪費在這些的調參上。BN演算法(Batch Normalization)其好處如下:

  • 可以選擇比較大的初始學習率,極大的提高訓練速度。Batch Gradient Descent使用多個梯度的均值來更新權重,用相對少的訓練次數遍歷完整個訓練集,也正是因為平均了多個樣本的梯度,許多樣本對神經網路的貢獻就被其他樣本平均掉了,相當於在每個epoch中,訓練集的樣本數被縮小了。batch中每個樣本的差異性越大,這種弊端就越嚴重。BN首先是把所有的samples的統計分佈標準化,降低了batch內不同樣本的差異性,然後又允許batch內的各個samples有各自的統計分佈。所以,BN的優點自然也就是允許網路使用較大的學習速率進行訓練,加快網路的訓練速度(減少epoch次數),提升效果。
  • 省去引數選擇的問題。省去過擬閤中drop out、L2正則項引數的選擇問題,採用BN演算法後,可以移除這兩項了引數,或者可以選擇更小的L2正則約束引數了,因為BN具有提高網路泛化能力的特性;

那為什麼需要歸一化?

神經網路學習過程本質就是為了學習資料分佈,一旦訓練資料與測試資料的分佈不同,那麼網路的泛化能力也大大降低。

輸入層的資料,已經人為的的歸一化,後面網路每一層的輸入資料分佈是一直在發生變化的,前面層訓練引數的更新將導致後面層輸入資料分佈的變化,因此必然會引起後面每一層輸入資料分佈的改變。而且,網路的前面幾層發生微小的改變,那麼後面幾層就會被累積放大下去。我們把網路中間層在訓練過程中,資料分佈的改變稱之為:"Internal Covariate Shift"。BN的提出,就是要解決在訓練過程中,中間層資料分佈發生改變的情況。

 

二、BN演算法原理

1、BN層及使用位置

就像啟用函式層、卷積層、全連線層、池化層一樣,BN(Batch Normalization)也屬於網路的一層。歸一化也是網路的一層。

在網路的每一層輸入的時候,又插入了一個歸一化層,也就是先做一個歸一化處理,然後再進入網路的下一層。如果在每一層輸入的時候,再加個預處理操作那該有多好啊,比如網路第三層輸入資料X3(X3表示網路第三層的輸入資料)把它歸一化至:均值0、方差為1,然後再輸入第三層計算,這樣我們就可以解決前面所提到的"Internal Covariate Shift"的問題了。

關於BN的使用位置,在CNN中一般應作用與非線性啟用函式之前,s型函式s(x)的自變數x是經過BN處理後的結果。因此前向傳導的計算公式就應該是:

批歸一化Batch Normalization的原理及演算法

 

其實因為偏置引數b經過BN層後其實是沒有用的,最後也會被均值歸一化,當然BN層後面還有個β引數作為偏置項,所以b這個引數就可以不用了。因此最後把BN層+啟用函式層就變成了:

批歸一化Batch Normalization的原理及演算法

 

2、預處理操作選擇

說到神經網路輸入資料預處理,最好的演算法莫過於白化預處理。白化其實跟PCA演算法還是挺相似的。舉例來說,假設訓練資料是影象,由於影象中相鄰畫素之間具有很強的相關性,所以用於訓練時輸入是冗餘的。白化的目的就是降低輸入的冗餘性。

經過白化預處理後,資料滿足條件:

1.特徵之間相關性較低 2.所有特徵具有相同的方差

由於計算量非常大,忽略了第1個要求,僅僅使用了下面的公式進行預處理,也就是近似白化預處理:

批歸一化Batch Normalization的原理及演算法

 

3.縮放和移位

減均值除方差得到的分佈是正態分佈,我們能否認為正態分佈就是最好或最能體現我們訓練樣本的特徵分佈呢?

非也,如果啟用函式在方差為1的資料上,沒有表現最好的效果,比如Sigmoid啟用函式。這個函式在-1~1之間的梯度變化不大。假如某一層學習到特徵資料本身就分佈在S型啟用函式的兩側,把它歸一化處理、標準差也限制在了1,把資料變換成分佈於s函式的中間部分,就沒有達到非線性變換的目的,換言之,減均值除方差操作後可能會削弱網路的效能。

批歸一化Batch Normalization的原理及演算法

 

批歸一化Batch Normalization的原理及演算法

 

不光是Sigmoid啟用函式,Tanh函式在零附近也變成線性

批歸一化Batch Normalization的原理及演算法

 

而Relu activation函式,則將一半的輸入清零。

批歸一化Batch Normalization的原理及演算法

 

因此,必須進行一些轉換才能將分佈從0移開。使用縮放因子γ和移位因子β來執行此操作。

隨著訓練的進行,這些γ和β也通過反向傳播學習以提高準確性。這就要求為每一層學習2個額外的引數來提高訓練速度。

這個最終轉換因此完成了批歸一演算法的定義。縮放和移位是演算法比較關鍵,因為它提供了更多的靈活性。假設如果我們決定不使用BatchNorm,我們可以設定γ=σ和β= mean,從而返回原始值。

 

三、BN演算法過程

批歸一化Batch Normalization的原理及演算法

 

採用Normalization方法網路的訓練速度快到驚人啊,感覺訓練速度是以前的十倍以上。

BN在深層神經網路的作用非常明顯:若神經網路訓練時遇到收斂速度較慢,或者“梯度爆炸”等無法訓練的情況發生時都可以嘗試用BN來解決。同時,常規使用情況下同樣可以加入BN來加速模型訓練,甚至提升模型精度。

ok,~

best