dropout是在訓練神經網絡模型時,樣本數據過少,防止過擬合而採用的trick。那它是怎麼作到防止過擬合的呢?網絡
首先,想象咱們如今只訓練一個特定的網絡,當迭代次數增多的時候,可能出現網絡對訓練集擬合的很好(在訓練集上loss很小),可是對驗證集的擬合程度不好的狀況。因此,咱們有了這樣的想法:可不可讓每次跌代隨機的去更新網絡參數(weights),引入這樣的隨機性就能夠增長網絡generalize 的能力。因此就有了dropout 。測試
在訓練的時候,咱們只須要按必定的機率(retaining probability)p 來對weight layer 的參數進行隨機採樣,將這個子網絡做爲這次更新的目標網絡。能夠想象,若是整個網絡有n個參數,那麼咱們可用的子網絡個數爲 2^n 。 而且,當n很大時,每次迭代更新 使用的子網絡基本上不會重複,從而避免了某一個網絡被過度的擬合到訓練集上。.net
那麼測試的時候怎麼辦呢? 一種最naive的方法是,咱們把 2^n 個子網絡都用來作測試,而後以某種 voting 機制將全部結果結合一下(好比說平均一下下),而後獲得最終的結果。可是,因爲n實在是太大了,這種方法實際中徹底不可行!因此有人提出,那我作一個大體的估計不就得了,我從2^n個網絡中隨機選取 m 個網絡作測試,最後在用某種voting 機制獲得最終的預測結果。這種想法固然可行,當m很大時但又遠小於2^n時,可以很好的逼近原2^n個網絡結合起來的預測結果。可是,有沒有更好的辦法呢? of course!那就是dropout 自帶的功能,可以經過一次測試獲得逼近於原2^n個網絡組合起來的預測能力!3d
雖然訓練的時候咱們使用了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 保證了後面一層的輸入仍然符合相應的物理意義和數量級。blog
假設x是dropout layer的輸入,y是dropout layer的輸出,W是上一層的全部weight parameters, 是以retaining probability 爲p 採樣獲得的weight parameter子集。把上面的東西用公式表示(忽略bias):it
train: test
test: 神經網絡
可是通常寫程序的時候,咱們想直接在test時用 , 這種表達式。(where
) 所以咱們就在訓練的時候就直接訓練
。 因此訓練時,第一個公式修正爲
。 即把dropout的輸入乘以p 再進行訓練,這樣獲得的訓練獲得的weight 參數就是
,測試的時候除了不使用dropout外,不須要再作任何rescale。Caffe 和Lasagne 裏面的代碼就是這樣寫的。程序
轉自http://blog.csdn.net/u012702874/article/details/45030991方法