對 CNN 中 dropout layer 的理解

dropout layer的目的是爲了防止CNN 過擬合。那麼爲什麼可以有效的防止過擬合呢?

首先,想象我們現在只訓練一個特定的網絡,當迭代次數增多的時候,可能出現網絡對訓練集擬合的很好(在訓練集上loss很小),但是對驗證集的擬合程度很差的情況。所以,我們有了這樣的想法:可不可以讓每次跌代隨機的去更新網絡參數(weights),引入這樣的隨機性就可以增加網絡generalize 的能力。所以就有了dropout 。


在訓練的時候,我們只需要按一定的概率(retaining probability)p 來對weight layer 的參數進行隨機採樣,將這個子網絡作爲此次更新的目標網絡。可以想象,如果整個網絡有n個參數,那麼我們可用的子網絡個數爲 2^n 。 並且,當n很大時,每次迭代更新 使用的子網絡基本上不會重複,從而避免了某一個網絡被過分的擬合到訓練集上。


那麼測試的時候怎麼辦呢? 一種最naive的方法是,我們把 2^n 個子網絡都用來做測試,然後以某種 voting 機制將所有結果結合一下(比如說平均一下下),然後得到最終的結果。但是,由於n實在是太大了,這種方法實際中完全不可行! 


所以有人提出,那我做一個大致的估計不就得了,我從2^n個網絡中隨機選取 m 個網絡做測試,最後在用某種voting 機制得到最終的預測結果。這種想法當然可行,當m很大時但又遠小於2^n時,能夠很好的逼近原2^n個網絡結合起來的預測結果。但是,有沒有更好的辦法呢? of course!那就是dropout 自帶的功能,能夠通過一次測試得到逼近於原2^n個網絡組合起來的預測能力! 


雖然訓練的時候我們使用了dropout, 但是在測試時,我們不使用dropout (不對網絡的參數做任何丟棄,這時dropout layer相當於進來什麼就輸出什麼)。然後,把測試時dropout layer的輸出乘以訓練時使用的retaining probability  p (這時dropout layer相當於把進來的東東乘以p)。仔細想想這裏面的意義在哪裏呢??? 事實上,由於我們在測試時不做任何的參數丟棄,如上面所說,dropout layer 把進來的東西原樣輸出,導致在統計意義下,測試時 每層 dropout layer的輸出比訓練時的輸出多加了【(1 - p)*100】%  units 的輸出。 即 【p*100】% 個units 的和  是同訓練時隨機採樣得到的子網絡的輸出一致,另【(1 - p)*100】%  的units的和  是本來應該扔掉但是又在測試階段被保留下來的。所以,爲了使得dropout layer 下一層的輸入和訓練時具有相同的“意義”和“數量級”,我們要對測試時的僞dropout layer的輸出(即下層的輸入)做 rescale: 乘以一個p,表示最後的sum中只有這麼大的概率,或者這麼多的部分被保留。這樣以來,只要一次測試,將原2^n個子網絡的參數全部考慮進來了,並且最後的 rescale 保證了後面一層的輸入仍然符合相應的物理意義和數量級。


假設x是dropout layer的輸入,y是dropout layer的輸出,W是上一層的所有weight parameters, 是以retaining probability 爲p 採樣得到的weight parameter子集。把上面的東西用公式表示(忽略bias):

train:  

test:

但是一般寫程序的時候,我們想直接在test時用   , 這種表達式。(where  ) 

因此我們就在訓練的時候就直接訓練  。 所以訓練時,第一個公式修正爲    。 即把dropout的輸入乘以p 再進行訓練,這樣得到的訓練得到的weight 參數就是  ,測試的時候除了不使用dropout外,不需要再做任何rescale。Caffe 和Lasagne 裏面的代碼就是這樣寫的。


參考文獻: Improving Neural Networks with Dropout, Hinton學生的一片thesis

       Dropout: A Simple Way to Prevent Neural Networks from Overfitting

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章