Batch Normalization(批標準化,BN)通過標準化數據的操作,使得損失函數的優化地形(optimization landscape)更加平滑,從而達到更好地訓練效果。BN常用于卷積神經網絡(CNN)等。
1.原理
一般的gradient descend局限很大,RMSProp、small Batch、momentum等方法都是通過改變參數更新的策略實現優化,而Batch Normalization直接改變error surface。
使各個feature處于同一范圍的方法有很多,統稱Feature Normalization,以下呈現的只是其中一種。
2.實現
術語
standard deviation:標準差,variance:方差,tilde:波浪符號,converge:收斂
不僅是feature要標準化,中間的每層都需要標準化。標準化放在激活函數之前和之后效果相差不大。但是如果選擇sigmoid,最好在sigmoid前標準化,因為sigmoid為s型,標準化后數據都在0附近,計算的gradient會更大,收斂會更快;否則收斂非常慢。
?
注意:下面標準化涉及的運算都是element-wise,對每個元素分別操作,而不是對向量處理。(比如求μ和σ)
一個有趣的事情是標準化后,Z1和后面所有的中間值關聯起來了(圖中標注了三角形的量)。但實際上不會選擇full batch,把所有data一起丟進去訓練,而是采用mini batch,所以這個方法叫做Batch Normalization。注意:batch size必須較大,因為只有batch里面的data足以表示整個訓練集的分布時,才能用batch的Normalization近似代替訓練集的Normalization。?
?這一步表示γ和
作element-wise的乘法再加上β,目的:標準化強制數據均值為0、方差為1,但這種分布可能不符合實際任務的需求(例如,某些特征可能需要非線性的分布),通過?γγ?和?ββ?重新縮放和平移,模型能夠自適應地學習適合當前任務的分布,避免標準化對特征的過度約束。
開始時一般γ設為全1的向量,而β設為零向量。
3.實際運行的處理
上述方法中都是對batch標準化,但在inference(即testing)階段,很可能沒有batch,而是一個個單獨的數據,所以必須調整策略。
事實上在testing時并不需要自己處理,pytorch內部已經處理好了:使用moving average代替average。moving average即移動平均:一種通過使用過去若干時間段的平均值計算得出的平均值。移動平均值會定期變化,最早的數值會被基于最新數據的數值所替代。
?
4.實驗結果?
藍色的點表示相同的錯誤率,從圖中可以看出Batch Normalization確實加快了訓練速度。
粉色的線表示先進行Batch Normalization后sigmoid的結果,至于為什么沒有先sigmoid,后Batch Normalization,作者說收斂速度太慢,訓練不起來。
5. 有效性的解釋
??
6.拓展:其他Normalization方法
BN不是唯一的Feature Normalization的方法,方法非常多: