1. 程式人生 > >理解Batch Normalization

理解Batch Normalization

Batch Normalization是在GoogleNet的系列文章第二篇《Batch Normalization: Accelerating Deep Network Training by  Reducing Internal Covariate Shift》中提出來的。

字面意思,Batch Normalizatio(BN)是“批規範化”

論文的演算法本質:在每層網路輸入時,插入一個歸一化層,經過了歸一化處理之後再進入到下一層網路。那麼難點或者突破點就是,怎麼在完成對一層輸入資料歸一化操作以後,不影響本層網路學到的特徵。

從文章切入。

訓練深度神經網路的很複雜,原因在於:在訓練中,當一個神經網路層的前面層引數發生變化時,每一層輸入資料的分佈會發生變化。這就要求更低的學習速率以及更謹慎地初始化使訓練速度慢下來,這使得訓練一個具有非線性飽和性的網路模型很複雜。這種現象稱為“ internal covariate shift”(ICS,即在神經網路的訓練過程中,由於引數改變,而引起的神經網路啟用值分佈的改變),並通過對輸入歸一化來解決。

作者團隊通過將規範化作為網路模型結構的一部分,併為每個訓練小批量執行歸一化操作。BN允許使用更高的學習率,並且不需要過多注重引數初始化的問題。它與正則化類似,在某些情況下消除了dropout的需要。

從文章中總結出BN的幾個優勢:

  1. 快速訓練收斂。可以使用較大的學習速率,加快訓練速度;
  2. 提高網路泛化能力。可以不考慮dropout引數的選擇問題;
  3. 不需要使用Alexnet使用的區域性響應歸一化,BN本身就是一個歸一化網路層;
  4. 可以把訓練資料徹底打亂

文章第二部分介紹了輸入白化(參見參考部落格,不詳細展開),發現對每一層進行白化會帶來過高的計算代價和運算時間,並且不是處處可微。所以在第三部分介紹了兩種簡化方法。

簡化一:直接對輸入訊號的每個維度做規範化

簡化二:在每一個mini-batch中計算得到這個mini-batch均值和方差,用其代替整個訓練樣本集的均值和方差

在隨機梯度下降(SGD)中採用mini-batch方式,通過每個mini-batch來對每個啟用值(activation)做規範化操作。

在訓練中學習和計算BN的引數,通過比較熟悉的鏈式法則。

還有訓練一個BN網路的演算法

暫時先寫到這裡(打公式真的是一件很麻煩的事)

後面待續……

參考資料:

  1. 深度學習(二十九)Batch Normalization 學習筆記 https://blog.csdn.net/hjimce/article/details/50866313
  2. 深度學習【2】Batch Normalization論文翻譯 https://blog.csdn.net/linmingan/article/details/50780761