思考
YJango的前饋神經網絡--代碼LV3的數據預處理中提到過:在數據預處理階段,數據會被標准化(減掉平均值、除以標准差),以降低不同樣本間的差異性,使建模變得相對簡單。
我們又知道神經網絡中的每一層都是一次變換,而上一層的輸出又會作為下一層的輸入繼續變換。如下圖中, 經過第一層
的變換后,所得到的
; 而
經過第二層
的變換后,得到
。
在第二層所扮演的角色就是
在第一層所扮演的角色。 我們將
進行了標准化,那么,為什么不對
也進行標准化呢?

Batch Normalization論文便首次提出了這樣的做法。
Batch Normalization(BN)就是將每個隱藏層的輸出結果(如 )在batch上也進行標准化后再送入下一層(就像我們在數據預處理中將
進行標准化后送入神經網絡的第一層一樣)。
優點
那么Batch Normalization(BN)有什么優點?BN的優點是多個並存,但這里只提一個最容易理解的優點。
訓練時的問題
盡管在講解神經網絡概念的時候,神經網絡的輸入指的是一個向量 。
但在實際訓練中有:
- 隨機梯度下降法(Stochastic Gradient Descent):用一個樣本的梯度來更新權重。
- 批量梯度下降法(Batch Gradient Descent):用多個樣本梯度的平均值來更新權重。
如下圖所示,綠、藍、黑的箭頭表示三個樣本的梯度更新網絡權重后loss的下降方向。
若用多個梯度的均值來更新權重的批量梯度下降法可以用相對少的訓練次數遍歷完整個訓練集,其次可以使更新的方向更加貼合整個訓練集,避免單個噪音樣本使網絡更新到錯誤方向。

然而也正是因為平均了多個樣本的梯度,許多樣本對神經網絡的貢獻就被其他樣本平均掉了,相當於在每個epoch中,訓練集的樣本數被縮小了。batch中每個樣本的差異性越大,這種弊端就越嚴重。
一般的解決方法就是在每次訓練完一個epoch后,將訓練集中樣本的順序打亂再訓練另一個epoch,不斷反復。這樣重新組成的batch中的樣本梯度的平均值就會與上一個epoch的不同。而這顯然增加了訓練的時間。
同時因為沒辦法保證每次更新的方向都貼合整個訓練集的大方向,只能使用較小的學習速率。這意味着訓練過程中,一部分steps對網絡最終的更新起到了促進,一部分steps對網絡最終的更新造成了干擾,這樣“磕磕碰碰”無數個epoch后才能達到較為滿意的結果。
注:一個epoch是指訓練集中的所有樣本都被訓練完。一個step或iteration是指神經網絡的權重更新一次。
為了解決這種“不效率”的訓練,BN首先是把所有的samples的統計分布標准化,降低了batch內不同樣本的差異性,然后又允許batch內的各個samples有各自的統計分布。所以,
BN的優點自然也就是允許網絡使用較大的學習速率進行訓練,加快網絡的訓練速度(減少epoch次數),提升效果。
做法
設,每個batch輸入是 (其中每個
都是一個樣本,
是batch size) 假如在第一層后加入Batch normalization layer后,
的計算就倍替換為下圖所示的那樣。

- 矩陣
先經過
的線性變換后得到
- 注:因為減去batch的平均值
后,
的作用會被抵消掉,所以沒必要加入
(紅色刪除線)。
- 將
再減去batch的平均值
,並除以batch的標准差
得到
。
是為了避免除數為0的情況所使用的微小正數。
- 注:但
基本會被限制在正態分布下,使得網絡的表達能力下降。為解決該問題,引入兩個新的parameters:
和
。
和
是在訓練時網絡自己學習得到的。
- 將
乘以
調整數值大小,再加上
增加偏移后得到
。
- 為加入非線性能力,
也會跟隨着ReLU等激活函數。
- 最終得到的
會被送到下一層作為輸入。
需要注意的是,上述的計算方法用於在訓練。因為測試時常會只預測一個新樣本,也就是說batch size為1。若還用相同的方法計算 ,
就會是這個新樣本自身,
就會成為0。
所以在測試時,所使用的 和
是整個訓練集的均值
和方差
。
而整個訓練集的均值和方差
的值通常也是在訓練的同時用移動平均法來計算,會在下一篇代碼演示中介紹。
附帶一提,反向傳播公式如下: