1. 批量歸一化(Batch Normalization):為了讓數據在訓練過程中保持同一分布,在每一個隱藏層進行批量歸一化。對於每一個batch,計算該batch的均值與方差,在將線性計算結果送入激活函數之前,先對計算結果進行批量歸一化處理,即減均值、除標准差,保證計算結果符合均值為0,方差為1的標准正態分布,然后再將計算結果作為激活函數的輸入值進行計算。
批量歸一化的本質:對於每個隱層神經元,把逐漸向非線性函數映射后向取值區間極限飽和區靠攏的輸入分布強制拉回到均值為0方差為1的標准正態分布,使得非線性變換函數的輸入值落入對輸入比較敏感的區域,以此避免梯度消失問題
公式:
均值與方差:是指在訓練過程中,每一個批次(batch)的對應位置的均值和方差。訓練過程中要分批次訓練,划分batch和batch_size。
在訓練過程中,計算一個批次中所有圖片的每一個位置的元素的均值與方差,一張圖片有多少個元素,就有多少個均值與方差。最后得到的均值和方差是用向量的形式表現的
例:一個batch有3個輸入,每個輸入是一個長度為4的向量
2. 批量歸一化的運行:(訓練過程中)
對於CNN,一般運算過程是:卷積 - 池化 - 批量歸一化 - 激活函數
①輸入:經過線性運算得到的數據,對於全連接層一般是W_i * x_i + b_i;對於卷積層一般是卷積+池化操作
②計算:減去該批次的均值除以該批次的標准差,學習兩個調節參數:scale(縮放)、shift(平移)
③輸出:將計算結果放入激活函數中進行計算
BN一般放在全連接或卷積池化之后,激活函數之前:
計算該批次的均值、方差,批量歸一化,學習scale、shift,必要時可進行縮放和平移
3. 為什么要進行批量歸一化?
①基於IID(獨立同分布)假設,訓練數據與測試數據滿足同一分布。訓練數據和測試數據滿足同一分布,那么基於訓練數據學習到的模型才可以更好的適用於測試數據,而批量歸一化可以使得神經網絡訓練過程中的每一次輸入服從同一分布。
(1)covariate shift(網絡協變量平移):對於輸入層,如果輸入值X的分布總是變化,不服從同一分布,就不符合IID假設,那么網絡模型很難穩定地學規律
(2)Internal Covariate Shift:對於隱藏層,在訓練過程中,隱藏層的輸入分布總是變化,不服從同一分布,每一個隱藏層都面臨着covariate shift的問題。對於深度學習這種包含很多隱層的網絡結構,在訓練過程中,因為各層參數不停在變化,很難保證每一層的輸入都服從同一分布,所以每個隱藏層都會面臨covariate shift的問題
(3)Whiten(白化):對輸入數據分布變換到0均值,單位方差的正態分布
(4)為了避免Internal Covariate Shift問題,讓每個隱層節點的激活輸入滿足同一分布,引入了批量歸一化。批量歸一化的思想來源於Whiten(白化),之前的研究表明如果在圖像處理中對輸入圖像進行白化(Whiten)操作的話,神經網絡的收斂速度就會變快。圖像是深度神經網絡的輸入層,做白化能加快收斂,那么其實對於深度網絡來說,其中某個隱層的神經元是下一層的輸入,意思是其實深度神經網絡的每一個隱層都是輸入層,不過是相對下一層來說而已,那么能不能對每個隱層都做白化呢?這就是啟發BN產生的原初想法,而BN也確實就是這么做的,可以理解為對深層神經網絡每個隱層神經元的激活值做簡化版本的白化操作。
②批量歸一化使得將激活函數的輸入值滿足標准正態分布,使得激活函數輸入值落在激活函數的敏感區域,避免梯度消失。
(1)神經網絡的激活輸入值(Wx+b)隨着網絡深度加深或者在訓練過程中,其分布逐漸發生偏移或者變動。整體分布逐漸往非線性函數的取值區間的上下限兩端靠近時,訓練收斂就會變慢,這導致反向傳播時低層神經網絡的梯度消失,這就是訓練深層神經網絡收斂越來越慢的本質原因。而BN就是通過一定的規范化手段,把每層神經網絡任意神經元這個輸入值的分布強行拉回到均值為0方差為1的標准正態分布,把越來越偏的分布強制拉回比較標准的分布,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域。對於每個隱層神經元,把逐漸向非線性函數映射后向取值區間極限飽和區靠攏的輸入分布強制拉回到均值為0方差為1的標准正態分布,使得非線性變換函數的輸入值落入對輸入比較敏感的區域,以此避免梯度消失問題。
4. 測試和訓練中的均值、方差的計算方法不一樣:
①訓練過程:訓練一般的分批次訓練,每一批次依次計算該bitch的均值和方差
②測試數據:測試過程的BN均值是訓練過程的所有批次的均值的算數平均值;測試過程的BN標准差是每個batch的標准差的無偏估計量
5. 批量歸一化的好處:
參考:https://www.cnblogs.com/guoyaohua/p/8724433.html (寫的特別好^)