批量歸一化(Batch Normalization)

對輸入數據進行標準化處理的原因?

使輸入數據各個特徵的分佈相近:

  1. 神經網絡學習的本質就是學習數據的分佈,如果訓練數據與測試數據的分佈不同,那麼網絡的泛化能力也大大降低;
  2. 在使用小批量數據對神經網絡進行訓練時,若每批訓練數據的分佈各不相同,網絡在每次迭代都去學習適應不同的分佈,這會大大降低網絡的訓練速度;

爲什麼要使用批量歸一化?

使用淺層模型時,隨着模型訓練的進行,當每層中參數更新時,靠近輸出層的輸出較難出現劇烈變化。對深層神經網絡來說,隨着網絡訓練的進行,前一層參數的調整使得後一層輸入數據的分佈發生變化,各層在訓練的過程中就需要不斷的改變以適應學習這種新的數據分佈。所以即使輸入數據已做標準化,訓練中模型參數的更新依然很容易導致後面層輸入數據分佈的變化,只要網絡的前面幾層發生微小的改變,那麼後面幾層就會被累積放大下去。最終造成靠近輸出層輸出的劇烈變化。這種計算數值的不穩定性通常令我們難以訓練出有效的深度模型。如果訓練過程中,訓練數據的分佈一直在發生變化,那麼將不僅會增大訓練的複雜度,影響網絡的訓練速度而且增加了過擬合的風險。

在模型訓練時,在應用激活函數之前,先對一個層的輸出進行歸一化,將所有批數據強制在統一的數據分佈下,然後再將其輸入到下一層,使整個神經網絡在各層的中間輸出的數值更穩定。從而使深層神經網絡更容易收斂而且降低模型過擬合的風險。

批量歸一化的優勢:

  1. 不加批量歸一化的網絡需要慢慢的調整學習率時,網絡中加入批量歸一化時,可以採用初始化很大的學習率,然後學習率衰減速度也很大,因此這個算法收斂很快。
  2. BN可以大大提高模型訓練速度,提高網絡泛化性能。
  3. 數據批量歸一化後相當於只使用了S型激活函數的線性部分,可以緩解S型激活函數反向傳播中的梯度消失的問題。

深層神經網絡在做非線性變換前的激活輸入值,隨着網絡深度加深或者在訓練過程中,其分佈逐漸發生偏移或者變動,整體分佈逐漸往非線性函數的取值區間的上下限兩端靠近,這會導致反向傳播時低層神經網絡的梯度消失,BN就是通過一定的規範化手段,把每層神經網絡任意神經元這個輸入值的分佈強行拉回到均值爲0方差爲1的標準正態分佈,使得激活輸入值落在非線性函數對輸入比較敏感的線性區域,其對應的導數遠離導數飽和區 ,這樣輸入的小變化就會導致損失函數較大的變化,避免梯度消失問題產生,學習收斂速度快,能大大加快訓練速度。

全連接層如何使用批量歸一化?

將批量歸一化層置於全連接層中的仿射變換和激活函數之間。設全連接層的輸入爲u,權重參數和偏差參數分別爲W和b,激活函數爲ϕ,批量歸一化的運算符爲BN。那麼,使用批量歸一化的全連接層輸出爲

訓練階段:對每一層,BN的計算過程如下:

其中,ϵ>0是一個很小的常數,保證分母大於0。批量歸一化在標準化的基礎上增加了變換重構,引入了兩個可以學習拉伸(scale)參數γ和偏移(shift)參數β,如果批量歸一化沒有起到優化作用,可以通過這兩個參數進行抵消,此時只需學出

批量歸一化可以看作在每一層輸入和上一層輸出之間加入了一個新的計算層,對數據的分佈進行額外的約束,從而增強模型的泛化能力。但是批量歸一化同時也降低了模型的擬合能力,歸一化之後的輸入分佈被強制拉到均值爲0和標準差爲1的正態分佈上來。以Sigmoid激活函數爲例,批量歸一化之後數據整體處於函數的非飽和區域,只包含線性變換(多層的線性函數跟一層線性網絡是等價的,網絡的表達能力下降),破壞了之前學習到的特徵分佈。爲了恢復原始數據分佈,保證非線性的獲得,引入了變換重構以及可學習參數γ和β,其對應於輸入數據分佈的方差和偏差。對於一般的網絡,不採用批量歸一化操作時,這兩個參數高度依賴前面網絡學習到的連接權重(對應複雜的非線性)。而在批量歸一化操作中,γ和β變成了該層的學習參數,僅用兩個參數就可以恢復最優的輸入數據分佈,與之前網絡層的參數解耦,從而更加有利於優化的過程,提高模型的泛化能力。

將數據從標準正態分佈左移或者右移一點並長胖一點或者變瘦一點,每個實例挪動的程度不一樣,這樣等價於非線性函數的值從正中心周圍的線性區往非線性區動了動。核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網絡收斂速度太慢。

首先,BN 算法在每一次 iteration 中的每一層輸入都進行了歸一化,將輸入數據的分佈歸一化爲均值爲 0,方差爲 1 的分佈。最後在全體訓練集上求取均值和方差(無偏估計),去取代模型 BN 變換層的對應均值和方差。訓練完成後的均值方差還只是最後一個 banch 的均值方差,我們最後的模型是基於訓練集的,所以最後還需要增加一步替換操作。

 

預測時的批量歸一化

使用批量歸一化訓練時,我們可以將批量大小設得大一點,從而使批量內樣本的均值和方差的計算都較爲準確。將訓練好的模型用於預測時,我們希望模型對於任意輸入都有確定的輸出。因此,單個樣本的輸出不應取決於批量歸一化所需要的隨機小批量中的均值和方差。一種常用的方法是通過移動平均估算整個訓練數據集的樣本均值和方差,並在預測時使用它們得到確定的輸出。可見,和丟棄層一樣,批量歸一化層在訓練模式和預測模式下的計算結果也是不一樣的。

預測階段

測試階段一般是輸入一個測試樣本,得到一個結果。因此測試樣本,前向傳導的時候,上面的均值u、標準差σ 要哪裏來?其實網絡一旦訓練完畢,參數都是固定的,這個時候即使是每批訓練樣本進入網絡,那麼BN層計算的均值u、和標準差都是固定不變的。
在預測階段,對於均值來說直接計算所有訓練batch u值的平均值;然後對於標準偏差採用訓練階段每個batch σB的無偏估計,過程如下:

卷積神經網絡中如何使用批量歸一化?

對卷積層來說,批量歸一化發生在卷積計算之後、應用激活函數之前。如果卷積計算輸出多個通道,我們需要對這些通道的輸出分別做批量歸一化,且每個通道都擁有獨立的拉伸和偏移參數,並均爲標量。設小批量中有mm個樣本。在單個通道上,假設卷積計算輸出的高和寬分別爲p和q。我們需要對該通道中m×p×q個元素同時做批量歸一化。對這些元素做標準化計算時,我們使用相同的均值和方差,即該通道中m×p×q個元素的均值和方差。

批量歸一化在卷積神經網絡中應用時,需要注意卷積神經網絡的參數共享機制。每一個卷積核的參數在不同位置的神經元當中是共享的,因此也應該被一起歸一化。具體實現中,假設網絡訓練中每一批包含b個樣本,由一個卷積核生成的特徵圖的寬高分別爲w和h,則每個特徵圖所對應的全部神經元個數爲b×w×h;利用這些神經元對應的所有輸入數據,我們根據一組待學習的參數γ和β對每個輸入數據進行批量歸一化操作。如果有f個卷積核,就對應f個特徵圖和f組不同的γ和β參數。

 

BN 層是對於每個神經元做歸一化處理,甚至只需要對某一個神經元進行歸一化,而不是對一整層網絡的神經元進行歸一化。既然 BN 是對單個神經元的運算,那麼在 CNN 中卷積層上要怎麼搞?假如某一層卷積層有 6 個特徵圖,每個特徵圖的大小是 100*100,這樣就相當
於這一層網絡有 6*100*100 個神經元,如果採用 BN,就會有 6*100*100 個參數 γ、β,這樣豈不是太恐怖了。因此卷積層上的 BN 使用,其實也是使用了類似權值共享的策略,把一整張特徵圖當做一個神經元進行處理。
卷積神經網絡經過卷積後得到的是一系列的特徵圖,如果 min-batch sizes 爲 m,那麼網絡某一層輸入數據可以表示爲四維矩陣(m,f,w,h),m 爲 min-batch sizes,f 爲特徵圖個數,w、h 分別爲特徵圖的寬高。在 CNN 中我們可以把每個特徵圖看成是一個特徵處理(一個神
經元),因此在使用 Batch Normalization,mini-batch size 的大小就是:m*w*h,於是對於每個特徵圖都只有一對可學習參數:γ、β。說白了吧,這就是相當於求取所有樣本所對應的一個特徵圖的所有神經元的平均值、方差,然後對這個特徵圖神經元做歸一化。

 

對比添加批量歸一化和不添加的網絡,激活函數的輸入分佈集中在敏感區域,對應激活函數的導數也比較大,非常有利於網絡的學習。

經過激活函數後,激活函數輸出分佈

經過batch normalization之後,激活函數的輸出比較平緩,在飽和階段和激活階段都有很多值。對於後面每一層都做這樣的操作,那麼每一層的輸出都會有這樣一個分佈,更有效的利用tanh的非線性變換,更有利於神經網絡的學習。沒有使用BN的話,激活函數的輸出基本上只有兩端最極端的值,都處於飽和階段,要麼爲+1,要麼爲-1,這樣的神經網絡基本上已經學不到東西了。

 

訓練階段是每個 batch 的平均值;測試階段是採用移動平均值,移動平均值是在訓練階段不斷更新的(移動平均值計算公式:mean = 0.1 * 當前 mean + 0.9 * 以前的 mean)

 BN  爲什麼能防止過擬合BN的歸一化取決 batch 中的數據,所以相當於做了數據增強。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章