1.batch normalization的原理
在神經網絡訓練過程中,由於網絡參數根據梯度下降在不斷的變化,每經過一個網絡層數據的分佈都會發生不同的改變。我們將這種由於網絡參數更新造成的數據分佈變化稱爲Internal Covariate Shift。Internal Covariate Shift會導致輸入數據分佈向某一個方向偏移,從而造成網絡數據訓練緩慢。以sigmoid激活函數構建的網絡爲例,sigmoid函數的導數如圖,由圖可知,當輸入分佈集中在0左右時,導數值最大,梯度下降最快。假如分佈偏移到6以上,則大部分數據落入飽和區,梯度下降會非常緩慢。
我們在模型訓練時有很重要的一點就是在喂入數據之前需要將數據進行歸一化處理。歸一化就是將數據區間壓縮到0-1,避免了數據量級差異導致的模型收斂問題。在圖像處理領域,我們還會使用白化操作。白化就是將圖像的像素分佈調整爲平均像素值爲0,方差爲單位方差的正太分佈。白化的優點在於降低了圖像信息的冗餘,提高了特徵的獨立性,促進模型的快速收斂。收到白化方法的啓發,我們是否能夠在模型的每一層都進行類似白化的操作呢?答案是肯定的。通過對每一層輸入數據分佈的改變來得到較優的梯度是batch normalization的最終目的。batch normalization的算法流程如圖:
我們通過對數據進行normalize處理,將數據分佈集中在梯度較大的範圍,加快了模型的收斂。但是這樣改變了非線性處理後的數據分佈,爲了保持非線性,batch normalization 中加入了和兩個需要訓練的參數,對normalize之後的數據分佈做一個微調,增強網絡表達。
2.batch normalization在卷積神經網絡中的使用
我們知道在普通的全連接網絡中每一層之間的batch normalization就作用於該層的輸出,那麼在卷積網絡中每一層的輸出實際上是多維的feature map,這個時候應該如何使用batch normalization呢?假設在某一層卷積網絡中,輸入batch size爲n,該層共有m個filter,輸出的feature map大小爲a*b。那麼對於每一個訓練實例來說,輸出的feature map 維度爲m*a*b,對於n個實例輸出結果爲n*m*a*b。這裏我們把所有實例在一個filter上的輸出結果作爲我們batch normalization的作用範圍,對於一個filter來說n個實例就會有size爲n*a*b的feature map輸出,這裏的每一個激活值都會進行normalize。
3.batch normalization如何進行推理
前面介紹了一下batch normalization在訓練過程中如何工作,但是應用模型進行推理時很多時候我們一次輸入就只有一個樣本,這是沒有辦法計算均值和方差的,那麼這種情況下如何獲得batch normalization的參數呢?實際上我們在推理過程中是使用了訓練集的均值和方差來近似推理過程中的均值和方差。前面說到了訓練過程中每輸出一個batch,我們會計算出這個batch的均值和方差,在整個訓練過程中我們會記錄下每個batch的均值和方差,訓練集的均值和方差即是所有batch均值和方差的期望。
同樣我們使用訓練的到的參數和對normalize之後的結果進行微調。
4.batch normalization優缺點總結:
優點:
1.對模型初始化和超參不敏感,減少模型超參數調整,允許使用更大的學習率。
2.可以加快模型收斂速度。
3.提高模型泛化能力,抑制模型過擬合。
缺點:
1.對於batch size的大小有要求,如果一個batch太小可能造成方差和均值計算不準,導致訓練效果不佳。
2.在RNN上謹慎使用,目前效果存在爭議。