ICML, 2015
S. Ioffe and C. Szegedy
解決什么問題(What)
- 分布不一致導致訓練慢:每一層的分布會受到前層的影響,當前層分布發生變化時,后層網絡需要去適應這個分布,訓練時參數的變化會導致各層分布的不斷變化,這個問題被定義為“internal covariate shift”,由於每一層的分布不一樣,就會導致訓練很慢
- 梯度消失和梯度爆炸:深度網絡中微小的參數變動引起梯度上的劇變,導致訓練陷入sigmoid的飽和區
- 需要使用較小的學習率:大的學習率可能會導致參數的scale變大,導致bp時梯度放大,引起梯度爆炸。另外由於分布不一致,大的學習率容易導致分布變化不穩定
- 需要小心翼翼地設置權重初始化:設置合理的初始化權重可以減小陷入sigmoid飽和區導致的梯度消失或梯度爆炸
- 需要正則:防止過擬合,提高泛化能力
為什么能解決(Why)
- 加速收斂:在每一層的輸入對數據進行規范化,使每層的分布不會出現很大的差異,可以加快訓練。BN因為對數據分布做了規范,能減小前層對后層的影響,后層更容易適應前層的更新。
- 減小梯度消失和梯度爆炸:對於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} \]
- 允許使用較大的學習率:BN使訓練更適應參數的scale,大權重有小梯度,這就不怕大的學習率導致bp的梯度放大引起梯度爆炸。另外分布較為一致,較大的學習率也不會導致不穩定的學習
- 可以不需要小心翼翼地設置權重初始化:初始化對學習的影響減小了,可以不那么小心地設置初始權重。舉例來說,對於一個單元的輸入值,不管權重w,還是放縮后的權重kw,BN過后的值都是一樣的,這個k被消掉了,對於學習來說,激活值是一樣的。
- 減小對正則的需要: 對於一個給定的訓練樣本,網絡不產生一個確定的值,它會依賴於mini-batch中的其它樣本。論文的實驗發現這種效應有利於網絡的泛化,可以減小或者不用dropout。
BN是怎么做的(How)
- 對於一個神經元的一個mini-batch上的一批數據,做一次BN,假設batch size為m
- 先求mini-batch的均值: $$\mu\leftarrow \frac{1}{m}\sum_{m}^{i=1}x_{i}$$
- 然后求mini-batch的方差:$$\sigma ^{2}\leftarrow \frac{1}{m}\sum_{m}^{i=1}(x_{i}-\mu)^{2}$$
- 然后把每個數據歸一化:$$\hat{x_i}\leftarrow \frac{x_i - \mu}{\sqrt {\sigma ^{2} + \varepsilon }}$$
- 這樣就得到了均值為0,方差為1的一批數據。我們可能不希望所有的數據總是均值為0,方差為1。這可能會改變原來的網絡層能表示的東西,比如把sgmoid限制在了0附近的線性區域。所有我們使用另外兩個參數來轉換一下,使得網絡能學到更多的分布。它既可以保持原輸入,也可以改變,提升了模型的容納能力。$$y_i\leftarrow \gamma \hat{x_i}+\beta \equiv BN_{\gamma, \beta}(x_i)$$
- 對每個神經元的每個mini-batch數據做這樣的BN轉換,然后訓練,每個BN的參數\(\gamma, \beta\)不同
- 在測試階段,由於我們不適用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后,收斂更快,准確率更高,隨着訓練的進行,分布更加平穩
-
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上達到了最好的表現
其它:CNN中的BN
- 在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的辦法,因為這並沒有保證各層的分布一致,只是規范化了均值和方差。
一點點小感受
- 通常來說BN和dropout都是很有用的trick,值得多多嘗試
- 但是之前做實驗的時候,發現加了BN效果反而下降了,還有dropout也是,加了后沒提升
- 一些trick在你的數據和任務上並不一定總是work的,還是實踐至上,要多跑實驗,嘗試各種配置