論文筆記:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

ICML, 2015
S. Ioffe and C. Szegedyhtml

解決什麼問題(What)網絡

  1. 分佈不一致致使訓練慢:每一層的分佈會受到前層的影響,當前層分佈發生變化時,後層網絡須要去適應這個分佈,訓練時參數的變化會致使各層分佈的不斷變化,這個問題被定義爲「internal covariate shift」,因爲每一層的分佈不同,就會致使訓練很慢
  2. 梯度消失和梯度爆炸:深度網絡中微小的參數變更引發梯度上的劇變,致使訓練陷入sigmoid的飽和區
  3. 須要使用較小的學習率:大的學習率可能會致使參數的scale變大,致使bp時梯度放大,引發梯度爆炸。另外因爲分佈不一致,大的學習率容易致使分佈變化不穩定
  4. 須要當心翼翼地設置權重初始化:設置合理的初始化權重能夠減少陷入sigmoid飽和區致使的梯度消失或梯度爆炸
  5. 須要正則:防止過擬合,提升泛化能力

爲何能解決(Why)函數

  1. 加速收斂:在每一層的輸入對數據進行規範化,使每層的分佈不會出現很大的差別,能夠加快訓練。BN由於對數據分佈作了規範,能減少前層對後層的影響,後層更容易適應前層的更新。
  2. 減少梯度消失和梯度爆炸:對於sigmoid來講,數據規範化後大部分落在sigmoid的中間區域,能夠避免優化的時候陷入「saturated regime」(sigmoid的兩邊),可以減少梯度消失的出現。通常化地說(不只考慮sigmoid),BN規範化後,對於較大的權重會有較小的梯度,對於較小的權重會有較大的梯度(以下面公式所示),不容易出現梯度消失或梯度爆炸)。
    \[ BN(Wu) =BN((aW)u) \]
    \[ \frac{\partial BN((aW)u))}{\partial u}=\frac{\partial BN((W)u))}{\partial u} \]
    \[ \frac{\partial BN((aW)u))}{\partial (aW)} = \frac{1}{a} \frac{\partial BN(Wu))}{\partial W} \]
  3. 容許使用較大的學習率:BN使訓練更適應參數的scale,大權重有小梯度,這就不怕大的學習率致使bp的梯度放大引發梯度爆炸。另外分佈較爲一致,較大的學習率也不會致使不穩定的學習
  4. 能夠不須要當心翼翼地設置權重初始化:初始化對學習的影響減少了,能夠不那麼當心地設置初始權重。舉例來講,對於一個單元的輸入值,無論權重w,仍是放縮後的權重kw,BN事後的值都是同樣的,這個k被消掉了,對於學習來講,激活值是同樣的。
  5. 減少對正則的須要: 對於一個給定的訓練樣本,網絡不產生一個肯定的值,它會依賴於mini-batch中的其它樣本。論文的實驗發現這種效應有利於網絡的泛化,能夠減少或者不用dropout。

BN是怎麼作的(How)學習

  1. 對於一個神經元的一個mini-batch上的一批數據,作一次BN,假設batch size爲m
  2. 先求mini-batch的均值: \[\mu\leftarrow \frac{1}{m}\sum_{m}^{i=1}x_{i}\]
  3. 而後求mini-batch的方差:\[\sigma ^{2}\leftarrow \frac{1}{m}\sum_{m}^{i=1}(x_{i}-\mu)^{2}\]
  4. 而後把每一個數據歸一化:\[\hat{x_i}\leftarrow \frac{x_i - \mu}{\sqrt {\sigma ^{2} + \varepsilon }}\]
  5. 這樣就獲得了均值爲0,方差爲1的一批數據。咱們可能不但願全部的數據老是均值爲0,方差爲1。這可能會改變原來的網絡層能表示的東西,好比把sgmoid限制在了0附近的線性區域。全部咱們使用另外兩個參數來轉換一下,使得網絡能學到更多的分佈。它既能夠保持原輸入,也能夠改變,提高了模型的容納能力。\[y_i\leftarrow \gamma \hat{x_i}+\beta \equiv BN_{\gamma, \beta}(x_i)\]
  6. 對每一個神經元的每一個mini-batch數據作這樣的BN轉換,而後訓練,每一個BN的參數\(\gamma, \beta\)不一樣
  7. 在測試階段,因爲咱們不適用mini-batch,那麼如何使用均值和方差來歸一化呢,論文中給出的方法是使用全部mini-batch 的均值和方差來估計出兩個統計量(用移動平均的計算方法來平均,指數加權平均是經常使用的一種移動平均的方法)來做爲每一個測試樣本BN時的均值和方差。指數加權平均在ng的深度學習課程中有學習過,我有記錄相應的課程筆記
    \[E[x]\leftarrow E_B[\mu_B]\]
    \[Var[x]\leftarrow \frac{m}{m-1}E_B[\sigma ^{2}_B]\]
    \[y = \frac{x-E(x)}{\sqrt{Var[x]+\varepsilon }}\gamma+\beta\]

激活前仍是激活後作BN(Where)測試

  • 對於一個神經元的運算$ x = Wu+b $ 和 $ z = g(x) $,g爲激活函數
  • 能夠對u作BN,也能夠對x作BN
  • 可是u多是另外一個非線性函數的輸出,它的分佈容易受到訓練的影響而改變
  • \(Wu+b\)更可能有一致的,非稀疏的分佈,對它歸一化更可能產生穩定的分佈

實驗小結優化

  • mnist:用了BN後,收斂更快,準確率更高,隨着訓練的進行,分佈更加平穩
    ui

  • ImageNet單網絡分類:
    • Inception:學習率爲0.0015,對Inceptionv1作了一些結構修改(好比2個3x3卷積替代5x5卷積)。
    • BN:在上面的基礎上加入了BN,提高了Inception的收斂速度和準確率
    • BNx5:作了一些加速BN的策略變更,其中學習率擴大爲原BN的5倍,即0.0075,相比於BN,收斂更快,準確率更高
    • BNx30:在BNx5的基礎上,學習率擴大爲原BN的30倍,即0.045,相比於BNX5,準確率更高
    • BNx5-sigmoid:雖然不如以上結果好,可是相比於不用BN,準確率更高
  • ImageNet集成網絡分類:使用帶BN的集成的Inception,在ImageNet的validation上達到了最好的表現spa

其它:CNN中的BN3d

  • 在CNN中對一個mini-batch中的一個feature map的全部單元作BN
  • 假設原來一個mini-batch中的大小爲m,作BN時,一批數據的大小爲m
  • 如今在CNN中,假設一個feature map中大小爲p*q,則作BN時一批數據的大小爲m*p*q

其它:Internal Covariate shift(ICS)
統計學習基於這樣一個假設,但願源空間和目標空間的分佈是一致的,covariate shift是分佈不一致假設之下的一個分支問題,指的是條件機率一致,可是邊緣機率不一樣,以下公式所示
\[P_{source}(Y|X=x)=P_{target}(Y|X=x)\]
\[P_{source}(X)\neq P_{target}(X)\]
神經網絡各層的分佈是不一樣的,可是同同樣本的label是一致,這就是符合了covariate shift的定義,由於不止對於輸入,而對於中間層的輸入都有這個問題,全部在前面加個「internal covariate shift」,定義這個各層之間分佈不一致的問題。BN能夠減少ICS帶來的影響,可是不是解決ICS的辦法,由於這並無保證各層的分佈一致,只是規範化了均值和方差。htm

一點點小感覺

  • 一般來講BN和dropout都是頗有用的trick,值得多多嘗試
  • 可是以前作實驗的時候,發現加了BN效果反而降低了,還有dropout也是,加了後沒提高
  • 一些trick在你的數據和任務上並不必定老是work的,仍是實踐至上,要多跑實驗,嘗試各類配置
相關文章
相關標籤/搜索