一、為什么對數據歸一化
我們知道在神經網絡訓練開始前,需要對輸入數據做歸一化處理,那么具體為什么需要歸一化呢?
原因在於:神經網絡學習過程本質就是為了學習數據特征以及數據的分布特征,一旦訓練數據與測試數據的分布不同,那么網絡的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分布各不相同(batch 梯度下降),那么網絡就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網絡的訓練速度,這也正是為什么我們需要對數據都要做一個歸一化預處理的原因。
同時也是在訓練前為什么要把訓練數據充分打亂的原因,充分打亂使得每個batch的樣本包含各類別的數據,這樣通過每個batch的樣本訓練時各個batch所包含的數據分布更接近,同時和整個訓練集的數據分布更接近,更有利於訓練出更泛化的模型,同時有利於模型的收斂。試想不充分打亂數據,若每個batch只包含一個類別的數據,不同的batch數據進行訓練時網絡就要在每次迭代都去學習適應不同的分布,會使得網絡收斂很慢。
二、數據進行歸一化標准化常用的方法
數據的標准化(正則化)以及歸一化之間的界限很模糊,現在都進行混用,常用的方法有,最小最大值歸一化以及z-score標准化
標准差是方差的算術平方根
來源於:https://blog.csdn.net/xiaotao_1/article/details/79077293
三、Batch Normalization
1.算法的誕生
上文提到神經網絡的本質是學習數據結構的特征以及數據的分布特征。對於深度網絡的訓練是一個復雜的過程,只要網絡的前面幾層發生微小的改變,那么后面幾層就會被累積放大下去。一旦網絡某一層的輸入數據的分布發生改變,那么這一層網絡就需要去適應學習這個新的數據分布,所以如果訓練過程中,訓練數據的分布一直在發生變化,那么將會影響網絡的訓練速度。
網絡的訓練是對可訓練參數不斷更新的過程,除了輸入層的數據外(因為輸入層數據,我們已經人為的為每個樣本歸一化),后面網絡每一層的輸入數據分布是一直在發生變化的,因為在訓練的時候,前面層訓練參數的更新將導致后面層輸入數據分布的變化。數據分布的改變稱之為:“Internal Covariate Shift”。為了解決在訓練過程中,中間層數據分布發生改變的情況,於是就有了Batch Normalization。
2.Batch Normalization概述
如其名Batch Normalization是以一個batch為基本單位,對每個神經元做歸一化處理,同時Batch Normalization(BN)和隱藏層、卷積層等一樣是網絡結構中的一層,一般應用在激活函數前。在沒有采用BN的時候,激活函數層是這樣的:
z=g(Wu+b)
也就是我們希望一個激活函數,比如s型函數s(x)的自變量x是經過BN處理后的結果。因此前向傳導的計算公式就應該是:
z=g(BN(Wu+b))
其實因為偏置參數b經過BN層后其實是沒有用的,最后也會被均值歸一化,當然BN層后面還有個β參數作為偏置項,所以b這個參數就可以不用了。因此最后把BN層+激活函數層就變成了:
z=g(BN(Wu))
3.Batch Normalization的計算
注意Batch Normalization的計算不是只簡單的通過歸一化公式事先對網絡某一層A的輸出數據做歸一化,然后送入網絡下一層B,這樣是會影響到本層網絡A所學習到的特征的。打個比方,比如我網絡中間某一層學習到特征數據本身就分布在S型激活函數的兩側,你強制把它給我歸一化處理、標准差也限制在了1,把數據變換成分布於s函數的中間部分,這樣就相當於我這一層網絡所學習到的特征分布被搞壞了,原文中提出了一種變換重構的方法,引入了可學習參數γ、β,這就是算法關鍵之處,讓我們的網絡可以學習恢復出原始網絡所要學習的特征分布。最后Batch Normalization網絡層的前向傳導過程公式如下,其中的ε是一個很小的數,用於防止除0。
4.Batch Normalization在測試數據上的使用
上面的算法是在訓練過程中的應用,測試階段假設我們想只輸入一個測試樣本,看看結果而已。因此測試樣本,前向傳導的時候,上面的均值u、標准差σ 要哪里來?其實網絡一旦訓練完畢,參數都是固定的,這個時候即使是每批訓練樣本進入網絡,那么BN層計算的均值u、和標准差都是固定不變的。我們可以采用這些數值來作為測試樣本所需要的均值、標准差。
對於測試集均值和方差已經不是針對某一個Batch了,而是針對整個數據集而言。因此,在訓練過程中除了正常的前向傳播和反向求導之外,我們還要記錄每一個Batch的均值和方差,以便訓練完成之后按照下式計算整體的均值和方差:
上面簡單理解就是:對於均值來說直接計算所有batch u值的平均值;然后對於標准偏差采用每個batch σB的無偏估計。最后測試階段,BN的使用公式就是:
5.Batch Normalization的作用
1)改善流經網絡的梯度
2)允許更大的學習率,大幅提高訓練速度:
你可以選擇比較大的初始學習率,讓你的訓練速度飆漲。以前還需要慢慢調整學習率,甚至在網絡訓練到一半的時候,還需要想着學習率進一步調小的比例選擇多少比較合適,現在我們可以采用初始很大的學習率,然后學習率的衰減速度也很大,因為這個算法收斂很快。當然這個算法即使你選擇了較小的學習率,也比以前的收斂速度快,因為它具有快速訓練收斂的特性;
3)減少對初始化的強烈依賴
4)改善正則化策略:作為正則化的一種形式,輕微減少了對dropout的需求
你再也不用去理會過擬合中drop out、L2正則項參數的選擇問題,采用BN算法后,你可以移除這兩項了參數,或者可以選擇更小的L2正則約束參數了,因為BN具有提高網絡泛化能力的特性;
5)再也不需要使用使用局部響應歸一化層了(局部響應歸一化是Alexnet網絡用到的方法,搞視覺的估計比較熟悉),因為BN本身就是一個歸一化網絡層;
6)可以把訓練數據徹底打亂(防止每批訓練的時候,某一個樣本都經常被挑選到,文獻說這個可以提高1%的精度)。
6.Batch Normalization的缺點
1)受batch_size大小的限制
BN是以batch為單位計算歸一化統計量的,當一個batch樣本數很少時,少量樣本的均值和方差無法反映全局的統計分布,所以基於少量樣本的BN的效果會變得很差。在一些場景中,比如說硬件資源受限,在線學習等場景,BN是非常不適用的。(在Transformer中使用的是Layer Normalization,受硬件的限制,Bert一般訓練的批次都不大)
2)無法很好的應用於RNN中
在一個batch中,通常各個樣本的長度都是不同的,當統計到比較靠后的時間片時,這時可能只有很少的樣本數據為非零值,基於這些仍有數據的少量樣本的統計信息不能反映全局分布,所以這時BN的效果並不好。
另外如果在測試時我們遇到了長度大於任何一個訓練樣本的測試樣本,我們無法找到保存的歸一化統計量,所以BN無法運行。
四、Layer Normalization
LN是一個獨立於batch size的算法,所以無論一個batch樣本數多少都不會影響參與LN計算的數據量,從而解決BN的兩個問題。LN的做法是根據樣本的特征數做歸一化。
設 H是一層中隱層節點的數量,l 是隱藏的層數,我們可以計算LN的歸一化統計量 (均值)和
(標准差):
五、Batch Normalization和Layer Normalization的對比分析
Batch Normalization 是對這批樣本的同一維度特征(每個神經元)做歸一化, Layer Normalization 是對這單個樣本的所有維度特征做歸一化。

實踐證明,LN用於RNN進行Normalization時,取得了比BN更好的效果。但用於CNN時,效果並不如BN明顯。
以上內容是對如下的總結
https://blog.csdn.net/qq_41853758/article/details/82930944
https://zhuanlan.zhihu.com/p/54530247
https://www.jianshu.com/p/367c456cc4cf
Layer Normalization論文地址:https://arxiv.org/pdf/1607.06450.pdf
Batch Normalization論文地址:https://arxiv.org/pdf/1502.03167.pdf