前言
Batch Normalization是由google提出的一種訓練優化方法。參考論文:Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift
個人覺得BN層的作用是加快網絡學習速率,論文中提及其它的優點都是這個優點的副産品。
網上對BN解釋詳細的不多,大多從原理上解釋,沒有說出實際使用的過程,這裡從what, why, how三個角度去解釋BN。
What is BN
Normalization是資料标準化(歸一化,規範化),Batch 可以了解為批量,加起來就是批量标準化。
先說Batch是怎麼确定的。在CNN中,Batch就是訓練網絡所設定的圖檔數量batch_size。
Normalization過程,引用論文中的解釋:
輸入:輸入資料x1..xm(這些資料是準備進入激活函數的資料)
計算過程中可以看到,
1.求資料均值;
2.求資料方差;
3.資料進行标準化(個人認為稱作正态化也可以)
4.訓練參數γ,β
5.輸出y通過γ與β的線性變換得到新的值
在正向傳播的時候,通過可學習的γ與β參數求出新的分布值
在反向傳播的時候,通過鍊式求導方式,求出γ與β以及相關權值
Why is BN
解決的問題是梯度消失與梯度爆炸。
關于梯度消失,以sigmoid函數為例子,sigmoid函數使得輸出在[0,1]之間。
事實上x到了一定大小,經過sigmoid函數的輸出範圍就很小了,參考下圖
如果輸入很大,其對應的斜率就很小,我們知道,其斜率(梯度)在反向傳播中是權值學習速率。是以就會出現如下的問題,
在深度網絡中,如果網絡的激活輸出很大,其梯度就很小,學習速率就很慢。假設每層學習梯度都小于最大值0.25,網絡有n層,因為鍊式求導的原因,第一層的梯度小于0.25的n次方,是以學習速率就慢,對于最後一層隻需對自身求導1次,梯度就大,學習速率就快。
這會造成的影響是在一個很大的深度網絡中,淺層基本不學習,權值變化小,後面幾層一直在學習,結果就是,後面幾層基本可以表示整個網絡,失去了深度的意義。
關于梯度爆炸,根據鍊式求導法,
第一層偏移量的梯度=激活層斜率1x權值1x激活層斜率2x…激活層斜率(n-1)x權值(n-1)x激活層斜率n
假如激活層斜率均為最大值0.25,所有層的權值為100,這樣梯度就會指數增加。
How to use BN
先解釋一下對于圖檔卷積是如何使用BN層。
這是文章卷積神經網絡CNN(1)中5x5的圖檔通過valid卷積得到的3x3特征圖(粉紅色)。特征圖裡的值,作為BN的輸入,也就是這9個數值通過BN計算并儲存γ與β,通過γ與β使得輸出與輸入不變。假設輸入的batch_size為m,那就有m*9個數值,計算這m*9個資料的γ與β并儲存。正向傳播過程如上述,對于反向傳播就是根據求得的γ與β計算梯度。
這裡需要着重說明2個細節:
1.網絡訓練中以batch_size為最小機關不斷疊代,很顯然,新的batch_size進入網絡,機會有新的γ與β,是以,在BN層中,有總圖檔數/batch_size組γ與β被儲存下來。
2.圖像卷積的過程中,通常是使用多個卷積核,得到多張特征圖,對于多個的卷積核需要儲存多個的γ與β。
結合論文中給出的使用過程進行解釋
輸入:待進入激活函數的變量
輸出:
1.對于K維的輸入,假設每一維包含m個變量,是以需要K個循環。每個循環中按照上面所介紹的方法計算γ與β。這裡的K維,在卷積網絡中可以看作是卷積核個數,如網絡中第n層有64個卷積核,就需要計算64次。
需要注意,在正向傳播時,會使用γ與β使得BN層輸出與輸入一樣。
2.在反向傳播時利用γ與β求得梯度進而改變訓練權值(變量)。
3.通過不斷疊代直到訓練結束,求得關于不同層的γ與β。如網絡有n個BN層,每層根據batch_size決定有多少個變量,設定為m,這裡的mini-batcherB指的是特征圖大小*batch_size,即m=特征圖大小*batch_size,是以,對于batch_size為1,這裡的m就是每層特征圖的大小。
4.不斷周遊訓練集中的圖檔,取出每個batch_size中的γ與β,最後統計每層BN的γ與β各自的和除以圖檔數量得到平均直,并對其做無偏估計直作為每一層的E[x]與Var[x]。
5.在預測的正向傳播時,對測試資料求取γ與β,并使用該層的E[x]與Var[x],通過圖中11:所表示的公式計算BN層輸出。
注意,在預測時,BN層的輸出已經被改變,是以BN層在預測的作用展現在此處
轉自:https://blog.csdn.net/Fate_fjh/article/details/53375881