A. BN和Dropout在訓練和測試時的差別
From: https://zhuanlan.hu.com/p/61725100
BN,Batch Normalization,就是在深度神經網路訓練過程中使得每一層神經網路的輸入保持相近的分布。
BN訓練和測試時的參數是一樣的嘛?
對於BN,在訓練時,是對每一批的訓練數據進行歸一化,也即用每一批數據的均值和方差。
而在測試時,比如進行一個樣本的預測,就並沒有batch的概念,因此,這個時候用的均值和方差是全量訓練數據的均值和方差,這個可以通過移動平均法求得。
對於BN,當一個模型訓練完成之後,它的所有參數都確定了,包括均值和方差,gamma和bata。
BN訓練時為什麼不用全量訓練集的均值和方差呢?
因為在訓練的第一個完整epoch過程中是無法得到輸入層之外其他層全量訓練集的均值和方差,只能在前向傳播過程中獲取已訓練batch的均值和方差。那在一個完整epoch之後可以使用全量數據集的均值和方差嘛?
對於BN,是對每一批數據進行歸一化到一個相同的分布,而每一批數據的均值和方差會有一定的差別,而不是用固定的值,這個差別實際上也能夠增加模型的魯棒性,也會在一定程度上減少過擬合。
但是一批數據和全量數據的均值和方差相差太多,又無法較好地代表訓練集的分布,因此,BN一般要求將訓練集完全打亂,並用一個較大的batch值,去縮小與全量數據的差別。
Dropout 是在訓練過程中以一定的概率的使神經元失活,即輸出為0,以提高模型的泛化能力,減少過擬合。
Dropout 在訓練和測試時都需要嘛?
Dropout 在訓練時採用,是為了減少神經元對部分上層神經元的依賴,類似將多個不同網路結構的模型集成起來,減少過擬合的風險。
而在測試時,應該用整個訓練好的模型,因此不需要dropout。
Dropout 如何平衡訓練和測試時的差異呢?
Dropout ,在訓練時以一定的概率使神經元失活,實際上就是讓對應神經元的輸出為0
假設失活概率為 p ,就是這一層中的每個神經元都有p的概率失活,如下圖的三層網路結構中,如果失活概率為0.5,則平均每一次訓練有3個神經元失活,所以輸出層每個神經元只有3個輸入,而實際測試時是不會有dropout的,輸出層每個神經元都有6個輸入,這樣在訓練和測試時,輸出層每個神經元的輸入和的期望會有量級上的差異。
因此在訓練時還要對第二層的輸出數據除以(1-p)之後再傳給輸出層神經元,作為神經元失活的補償,以使得在訓練時和測試時每一層輸入有大致相同的期望。
dropout部分參考: https://blog.csdn.net/program_developer/article/details/80737724
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」)對方差的偏移的敏感度降低了,總得來說就是整體方差偏地沒有那麼厲害了。