CNN中dropout層的理解


  dropout是在訓練神經網絡模型時,樣本數據過少,防止過擬合而采用的trick。那它是怎么做到防止過擬合的呢?

  首先,想象我們現在只訓練一個特定的網絡,當迭代次數增多的時候,可能出現網絡對訓練集擬合的很好(在訓練集上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 里面的代碼就是這樣寫的。

轉自http://blog.csdn.net/u012702874/article/details/45030991


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM