Batch Normalization批標準化:概率在神經網絡中的重要地位

在學YOLO的時候,正好看到YOLOv2上使用了BN,而自己雖然一直用但卻不清楚其中的原理。因此膜拜一下別人的博客,將內容記錄於此。

首先,郭耀華的博客裏講的真的很詳細。下面的所有引文都是該博客中的原話,中間我覺的不太重要的部分進行了概括。

首先整段引用一下BN的作用:

機器學習領域有個很重要的假設:IID獨立同分布假設,就是假設訓練數據和測試數據是滿足相同分佈的,這是通過訓練數據獲得的模型能夠在測試集獲得好的效果的一個基本保障。那BatchNorm的作用是什麼呢?BatchNorm就是在深度神經網絡訓練過程中使得每一層神經網絡的輸入保持相同分佈的。

也即,我們不僅需要考慮網絡級的獨立同分布,同樣也得考慮每一層自身的獨立同分布。而這對於訓練中一直在改變參數的層至關重要。舉例來說,假設一個訓好的網絡滿足獨立同分布,然後你遷移學習的過程中,前面層的輸出隨着訓練進行變得和之前不一樣了,那我基於之前輸出訓的後面的層豈不是一直受你之前的偏差影響。

而之前的研究表明,輸入圖像進行白化(Whiten)操作的話——所謂白化就是對輸入數據分佈變換到0均值,單位方差的正態分佈——那麼神經網絡會較快收斂。那如果對每一個隱含層都做白化不是就能抑制這種問題了嗎?這就是BN思想的雛形。

BN的基本思想其實相當直觀:因爲深層神經網絡在做非線性變換前的激活輸入值(就是那個x=WU+B,U是輸入)隨着網絡深度加深或者在訓練過程中,其分佈逐漸發生偏移或者變動,之所以訓練收斂慢,一般是整體分佈逐漸往非線性函數的取值區間的上下限兩端靠近(對於Sigmoid函數來說,意味着激活輸入值WU+B是大的負值或正值),所以這導致反向傳播時低層神經網絡的梯度消失,這是訓練深層神經網絡收斂越來越慢的本質原因,而BN就是通過一定的規範化手段,把每層神經網絡任意神經元這個輸入值的分佈強行拉回到均值爲0方差爲1的標準正態分佈,其實就是把越來越偏的分佈強制拉回比較標準的分佈,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域,這樣輸入的小變化就會導致損失函數較大的變化,意思是這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味着學習收斂速度快,能大大加快訓練速度。

不過這樣做也會有個問題,即把非線性部分的輸入移動到線性部分,自然會使得網絡整體的非線性減少,降低網絡的表達空間。因此爲了解決這個問題,BN對變換後的滿足均值爲0方差爲1的x又進行了scale加上shift操作(y=scale*x+shift)。其中這兩個參數scale和shift都是可以學習的。也即,這個參數又使輸入的分佈變胖/變瘦了一點並左右移動了一點。

上面的部分都是對BN的抽象分析,那具體怎麼做呢?

 假設對於一個深層神經網絡來說,其中兩層結構如下:

  圖5  DNN其中兩層

  要對每個隱層神經元的激活值做BN,可以想象成每個隱層又加上了一層BN操作層,它位於X=WU+B激活值獲得之後,非線性函數變換之前,其圖示如下:

再具體一點,假設一個Batch的訓練樣本在BN層前的輸入分別是x^{(k)},k=1,...,n則其經過BN層後的輸出分別爲

也即,總的看整個Batch的BN層輸出數據,符合標準正態分佈。(這裏看不懂需要補一下概率論知識)當然,接着還會經過上文中提到的scale和shift操作。

雖然BN在訓練階段大顯神威,但對於測試階段只有一個樣本的情況,BN明細難以求batch內的均值和方差,怎麼辦呢?

測試實際上使用了訓練實例的全局均值和方差

最後,貼一個BN的好處:

BatchNorm爲什麼NB呢,關鍵還是效果好。

  1. 不僅僅極大提升了訓練速度,收斂過程大大加快;
  2. 能增加分類效果,一種解釋是這是類似於Dropout的一種防止過擬合的正則化表達方式,所以不用Dropout也能達到相當的效果;
  3. 調參過程也簡單多了,對於初始化要求沒那麼高,而且可以使用大的學習率等。

總而言之,經過這麼簡單的變換,帶來的好處多得很,這也是爲何現在BN這麼快流行起來的原因。

 

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