Batch Normalization和Dropout如何搭配使用?

Batch Normalization和Dropout如何搭配使用?

背景

衆所周知,在Batch Normalization(BN)出來之前,dropout是訓練神經網絡時的標配,如果你的數據不夠多,那麼模型很容易過擬合,導致模型的性能下降。Dropout在很多任務上證明了自己的有效性,比如圖片分類,語音識別,目標檢索等等。但是在BN提出之後,dropout突然失寵了,原因是作者將BN和dropout搭配使用時,模型的性能不升反降。之後各大流行網絡ResNet,PreResNet,ResNeXt,DenseNet相繼提出,大家也心照不宣地都默認缺省了Dropout。比較有意思的是Wide ResNet(WRN)的作者多了一個「心眼」:他發現在很寬的WRN網絡裏面,在每一個bottleneck的兩個conv層之間加上那麼一個Dropout,竟然能得到穩定的提升。這就顯得很奇怪,也是這篇文章想要通過一些推導想搞清楚的。在這裏參考大神李翔的論文博客,我用自己的理解整理了一下,如有不對之處請大家指正。

分析

究竟是什麼原因導致BN和dropout一起使用時導致1+1<1呢?下面將一一介紹。

  1. dropout
    dropout在訓練時,以一定的概率p來drop掉相應的神經網絡節點,以(1-p)的概率來retain相應的神經網絡節點,這相當於每一次訓練時模型的網絡結構都不一樣,也可以理解爲訓練時添加了噪聲,所以能夠有效減少過擬合。
    問題呢,是出在測試時,因爲訓練的時候以概率p drop了一些節點,比如dropout設置爲0.5,隱藏層共有6個節點,那訓練的時候有3個節點的值被丟棄,而測試的時候這6個節點都被保留下來,這就導致了訓練和測試的時候以該層節點爲輸入的下一層的神經網絡節點獲取的期望會有量級上的差異。爲了解決這個問題,在訓練時對當前dropout層的輸出數據除以(1-p),之後再輸入到下一層的神經元節點,以作爲失活神經元的補償,以使得在訓練時和測試時每一層的輸入有大致相同的期望。
  2. Batch Normalization
    首先來看下BN的公式:
    在這裏插入圖片描述
    BN就是在深度神經網絡訓練時通過對每一個batch的數據採用均值和方差進行歸一化,使得每一層神經網絡的輸入保持相同的分佈,這樣能夠加快訓練的速度。此外,因爲在訓練時,爲每一次迭代求全局的均值和方差是不現實的,因此借鑑moment的方式對均值和方差進行更新,使得每一層歸一化的均值和方差都不一樣,也相當於引入了噪聲,能夠增加模型的魯棒性,有效減少過擬合。
  3. 方差偏移
    在這裏插入圖片描述
    首先,先明確dropout和BN結合使用使模型性能下降的連接方式,用通俗的話講,就是你先在網絡的內部使用dropout,隨後再跟上一個BN層,而且這個BN層還不止一個。那麼問題出在哪呢?原因有二。首先,如上圖所示,因爲訓練時採用了dropout,雖然通過除以(1-p)的方式來使得訓練和測試時,每個神經元輸入的期望大致相同,但是他們的方差卻不一樣。第二,BN是採用訓練時得到的均值和方差對數據進行歸一化的,現在dropout層的方差都不一樣了,那還搞毛,一步錯步步錯,最終導致輸出不準確,影響最後的性能。

解決方案

針對方差偏移,論文給出了兩種解決方案:

  1. 拒絕方差偏移,只在所有BN層的後面採用dropout層,現在大部分開源的模型,都在網絡的中間加了BN,你也就只能在softmax的前一層加加dropout了,我親自試過,效果還行,至少不會比不加dropout差。還有另外一種方法是模型訓練完後,固定參數,以測試模式對訓練數據求BN的均值和方差,再對測試數據進行歸一化,論文證明這種方法優於baseline。
  2. dropout原文提出了一種高斯dropout,論文再進一步對高斯dropout進行擴展,提出了一個均勻分佈Dropout,這樣做帶來了一個好處就是這個形式的Dropout(又稱爲「Uout」)對方差的偏移的敏感度降低了,總得來說就是整體方差偏地沒有那麼厲害了。可以看得出來實驗性能整體上比第一個方案好,這個方法顯得更加穩定。

參考資料

[1] https://zhuanlan.zhihu.com/p/33101420 [2] https://arxiv.org/pdf/1801.05134.pdf [3] https://zhuanlan.zhihu.com/p/61725100