BN和Dropout在訓練和測試時的差別

Batch Normalization

BN,Batch Normalization,就是在深度神經網絡訓練過程中使得每一層神經網絡的輸入保持相近的分佈。

BN訓練和測試時的參數是一樣的嘛?

對於BN,在訓練時,是對每一批的訓練數據進行歸一化,也即用每一批數據的均值和方差。

而在測試時,比如進行一個樣本的預測,就並沒有batch的概念,因此,這個時候用的均值和方差是全量訓練數據的均值和方差,這個可以通過移動平均法求得。

對於BN,當一個模型訓練完成之後,它的所有參數都確定了,包括均值和方差,gamma和bata。

BN訓練時爲什麼不用全量訓練集的均值和方差呢?

因爲用全量訓練集的均值和方差容易過擬合,對於BN,其實就是對每一批數據進行歸一化到一個相同的分佈,而每一批數據的均值和方差會有一定的差別,而不是用固定的值,這個差別實際上能夠增加模型的魯棒性,也會在一定程度上減少過擬合。

也正是因此,BN一般要求將訓練集完全打亂,並用一個較大的batch值,否則,一個batch的數據無法較好得代表訓練集的分佈,會影響模型訓練的效果。

Dropout

Dropout 是在訓練過程中以一定的概率的使神經元失活,即輸出爲0,以提高模型的泛化能力,減少過擬合。

Dropout 在訓練和測試時都需要嘛?

Dropout 在訓練時採用,是爲了減少神經元對部分上層神經元的依賴,類似將多個不同網絡結構的模型集成起來,減少過擬合的風險。

而在測試時,應該用整個訓練好的模型,因此不需要dropout。

Dropout 如何平衡訓練和測試時的差異呢?

Dropout ,在訓練時以一定的概率使神經元失活,實際上就是讓對應神經元的輸出爲0

假設失活概率爲 p ,就是這一層中的每個神經元都有p的概率失活,如下圖的三層網絡結構中,如果失活概率爲0.5,則平均每一次訓練有3個神經元失活,所以輸出層每個神經元只有3個輸入,而實際測試時是不會有dropout的,輸出層每個神經元都有6個輸入,這樣在訓練和測試時,輸出層每個神經元的輸入和的期望會有量級上的差異。

因此在訓練時還要對第二層的輸出數據除以(1-p)之後再傳給輸出層神經元,作爲神經元失活的補償,以使得在訓練時和測試時每一層輸入有大致相同的期望。

dropout部分參考:http://www.noobyard.com/article/p-nbwyaszq-nd.html

BN和Dropout共同使用時會出現的問題

BN和Dropout單獨使用都能減少過擬合併加速訓練速度,但如果一起使用的話並不會產生1+1>2的效果,相反可能會得到比單獨使用更差的效果。

相關的研究參考論文:Understanding the Disharmony between Dropout and Batch Normalization by Variance Shift

本論文作者發現理解 Dropout 與 BN 之間衝突的關鍵是網絡狀態切換過程中存在神經方差的(neural variance)不一致行爲。試想若有圖一中的神經響應 X,當網絡從訓練轉爲測試時,Dropout 可以通過其隨機失活保留率(即 p)來縮放響應,並在學習中改變神經元的方差,而 BN 仍然維持 X 的統計滑動方差。這種方差不匹配可能導致數值不穩定(見下圖中的紅色曲線)。而隨着網絡越來越深,最終預測的數值偏差可能會累計,從而降低系統的性能。簡單起見,作者們將這一現象命名爲「方差偏移」。事實上,如果沒有 Dropout,那麼實際前饋中的神經元方差將與 BN 所累計的滑動方差非常接近(見下圖中的藍色曲線),這也保證了其較高的測試準確率。

在這裏插入圖片描述

作者採用了兩種策略來探索如何打破這種侷限。一個是在所有 BN 層後使用 Dropout,另一個就是修改 Dropout 的公式讓它對方差並不那麼敏感,就是高斯Dropout。

第一個方案比較簡單,把Dropout放在所有BN層的後面就可以了,這樣就不會產生方差偏移的問題,但實則有逃避問題的感覺。

第二個方案來自Dropout原文裏提到的一種高斯Dropout,是對Dropout形式的一種拓展。作者進一步拓展了高斯Dropout,提出了一個均勻分佈Dropout,這樣做帶來了一個好處就是這個形式的Dropout(又稱爲「Uout」)對方差的偏移的敏感度降低了,總得來說就是整體方差偏地沒有那麼厲害了。

該部分參考:

https://www.jiqizhixin.com/articles/2018-01-23-4

https://zhuanlan.zhihu.com/p/33101420