1. 程式人生 > >關於深度網路中的Normalization:BN/RBN/WN/LN的記錄

關於深度網路中的Normalization:BN/RBN/WN/LN的記錄

        深度前饋網路中前層輸入的變化往往會引起後面層的變化,後面的層需要不斷地調整自己的引數去適應前層的輸入變化,這被稱為internal covariance shift。這不僅會使網路訓練變得緩慢,同時會讓一些非線性啟用函式如sigmoid更容易進入飽和區。

        傳統的方法通過採用白化對樣本進行預處理,讓樣本的特徵之間獨立同分布,來解決這個問題。如何對深度網路進行歸一化?計算全部樣本某個特徵的均值與方差,對特徵進行標準化。然而,這種做法往往計算量較大。有人提出了bacth normalization。首先,將每個batch的樣本特徵進行標準化。然而,通過簡單的標準化,會導致改變原有引數的分佈:網路後面的層努力調整自己的分佈去適應前層的輸入,標準化卻讓它丟失了自己的分佈。因此,作者在標準化的基礎上又提出了通過scale與bias兩個引數將標準化後的資料還原成原來的分佈。經過batch normalization,網路更加穩定。同時,batch normalization對每個batch樣本進行相同的操作,使得網路不依賴於單個樣本,因此也達到了一種正則化的效果。具體過程如下:

        Batch normalization可以應用於卷積網路中。由於卷積網路中的每個feature map表示相同的特徵,為了不改變卷積網路的原有性質,因此,在卷積網路中,每個feature map都有獨立的scale與bias引數。

        是否可以將batch normalization應用於rnn等迴圈神經網路呢。將rnn的每個時間步看成深度網路的每一層,即可以轉化成前饋神經網路。那麼,batch normalization也可以套用到rnn中了。然而,通過實驗發現不同時間步之間共享均值與方差,效果並不是很好。在此基礎上,有人提出了recurrent batch normalization。首先,既然時間步共享效果不好,那就不共享了,對每個時間步分別進行歸一化。然而,測試時,萬一訓練集的最大時間步小於測試集的訓練步呢。作者的方法也很簡單,確定一個Tmax最大時間步,對超過最大時間步的測試集進行截斷就可以了。同時,作者發現之前實驗效果不行還存在另外一個原因,就是一般會將scale係數初始化為1。對於tanh啟用函式,當輸入的標準差越小,tanh的導數將會越接近於1。隨著標準差增大,導數將會趨近於0,進入飽和區。因此,採用較小的scale引數,效果會更好。

        深度網路往往是一個基於梯度下降的優化過程,優化的難易程度取決於海森矩陣的條件數,它反映了誤差的曲面特徵,如區域性極小值、鞍點等,這樣的網路往往受引數的影響較大。如何通過調整引數讓網路更易訓練?傳統的做法在網路訓練之前進行precondition,將梯度乘以一個fisher資訊矩陣的逆,來模擬自然梯度,自然梯度可以讓引數在變化相同的情況下,讓目標值變化較大。類似的,batch normalization也是如此,它沒有進行preondition,但它的過程可以類似於將fisher資訊矩陣變為單位對角陣的過程。受到batch normalization的啟發,同時為了解決batch normalization計算記憶體較大以及在rnn中不太適用的問題,有人提出了weight normalization。

        Weight normalization也是一個將fisher資訊矩陣對角化的重引數化的過程。Weight normalization將權重的更新分解為方向的更新與大小的更新,見公式2。它完成了兩件事:1、對梯度的更新進行縮放,2、將梯度向量投影到權重向量之外。這樣不僅可以使梯度的大小變化與權重的大小變化直接相關,同時由於投影,可以減少權重向量的噪聲對梯度的影響。由於batch normalization能夠固定每層網路輸入特徵的方差與均值,而weight normalization不可以,因此可以在初始化時將scale與bias引數初始為關於樣本的方差與均值的函式。

(1)
公式 2

        同樣為了解決rnn的正規化問題,有人提出了layer normalization。與之前的recurrent normalization對每個time step進行歸一化不同的是,層歸一化是對rnn縱向的歸一化。與之前batch normalization或weight normalization不同的是,層歸一化不是一個重新引數化的過程。 層歸一化對每一層的輸入的隱層單元進行標準化:同一層隱層單元採用相同的標準化,對於同一層的每個時間步採用相同的scale與bias引數,不同樣本的隱層單元輸入不同,因此進行不同的標準化,這樣單個樣本也可以進行標準化。

公式 3

        以上幾種normalization,其實是互相聯絡的,它們都是對輸入進行標準化,並進行scale與偏移,詳見公式4。對於weight normalization,也是相同的形式,只是它的均值為0,方差為||V||。這幾種normalization都有一定伸縮不變性,如權重伸縮不變性以及資料伸縮不變性,使網路訓練更加迅速與穩定,減少對學習率的要求。

公式 4

        從引數空間的角度也可以理解這些normalization。模型學習到的引數可以形成一個光滑的流形空間,可以反映各種輸入與輸出的關係。如何衡量引數的變化引起輸出分佈的變化呢?將輸出概率看作黎曼流形,通過引數變化前後輸出概率的kl散度可以反映輸出分佈的變化。通過近似的泰勒展開式,可以得到當引數變化時,輸出概率的分佈變化近似於與fisher資訊矩陣相關的引數變化。通過分析不同的normalization的fisher資訊矩陣,其中normalize後的fisher資訊矩陣由scale引數和方差變化控制。因此,當引數變化較大時,其輸出的分佈變化不會很大,訓練會更加更穩定。同時,通過normalize,引數的變化主要由預測誤差決定,而不經過normalize的網路訓練主要由引數的範數決定。因此經過normalize後訓練更加魯棒。

[1] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

[2] RECURRENT BATCH NORMALIZATION

[3] Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks

[4] Layer Normalization