自己在實現 dropout 的時候遇到的一些問題,遇到到過擬合的情況,想通過 dropout 減少過擬合,提高識別成功率。


本文首發於卷積神經網路(CNN)入門講解

最近有個新聞鬧得沸沸揚揚,那就是dropout這個演算法竟然被谷歌申請了專利真是神奇了,加減乘除還能被申請專利?

不過大家不用擔心,dropout肯定用還是可以用的,谷歌只是想特定時刻,利用專利保護或者對抗某些競爭對手或者不良企業

那麼今天我們就來看看,這個dropout到底是如何一頓操作猛如虎,讓谷歌能花費3年時間就為了一個簡單的演算法申請專利-----------------------------------------dropout 從字面意思就是『丟掉』丟掉?丟掉什麼?別急,我們來看看?

上圖特徵清晰明瞭,相必大家一眼就能認出是誰了把

根據這些特徵,神經網路也能認出來,so easy

ok, 那我們增加難度,丟掉一些特徵,如下圖

你是不是立馬就認出來了?同樣的對模型也這麼做,我們把提取衣服特徵的神經元去掉,模型魯棒性就更強,為什麼?因為模型學到認人,看臉就行,衣服什麼的,無所謂但這樣模型非得看到左右臉纔行,神經元提取的特徵耦合度太高,我必須左右臉同時出現,模型才能作出判斷,神經網路的魯棒性仍然不夠,怎麼辦?我再隨機抽取一半的神經元,讓他們不參與任何計算,也不參與到權重的更新,比如這樣

(打紅叉表示不參與計算,不是被刪掉的意思)或者這樣

當然,還有這種:

一般人光看xiong是認不出這是大冪冪的這種情況就是dropout rate 設置太大,我們這是0.5,在訓練的時候不幸丟掉了重點特徵,造成模型overfitting了當然有些同學說,老師老師,更據我多年閱人無數的經驗,我認得出來

所以控制好dropout rate也是調參的關鍵,調好了就是加大模型魯棒性,調不好就是overfitting一般情況,dropout rate 設為0.3-0.5即可

所以你看,每次訓練都隨機讓一定神經元停止參與運算,簡單的操作讓我們由一個模型演變成四個模型:

一個模型的作用效果,也轉變成4個模型的效果和,更像一個多模型投票所以,雖然第四個模型overfitting了,但是前三個也模型參與投票判斷,第四個模型overfitting就被弱化了所以,dropout的出現,使得模型穩定性和魯棒性被大大提高了到這,你應該是理解dropout 的原理和作用了,但是還有關鍵的一步那就是訓練的時候會停止訓練一些神經元,但是測試的時候,整個模型是完整,可不會dropout 任何神經元啊

這樣就出現了一個問題,就好比

平時訓練200米跑步,突然比賽是400米

所以,在訓練的時候,我們會對沒有被dropout的神經元權值做一個rescalerescale rate = 1 / (1 - dropout rate)我們這dropout rate = 0.5,為了方便理解,我畫了一個大概的過程如下圖:

用數學語言就是:沒用dropout的神經網路前向傳播計算公式:

用了dropout 的神經網路前向傳播計算公式:

因此我在訓練的時候就做好rescale, 至少可以一定程度上『彌補』測試中沒有使用dropout所帶來的副作用OK,如果有小夥伴們還有不清楚的,可以看看谷歌官方專利上的解釋:https://patentimages.storage.googleapis.com/e2/28/32/25cb6a0912d49d/US9406017.pdf

我覺得都可以,反正這個東西的思想是保證魯棒性,擾動可以用多種方式實現,可以丟通路,可以丟輸出,可以加雜訊,只要擾動了就行。


我們都知道Dropout可以隨機刪除網路中的神經單元,它為什麼可以通過正則化發揮如此大的作用呢? 直觀上理解:神經網路不依賴於任何一個具體的輸入特徵,因為該單元的輸入可能隨時被清除,因此該單元通過這種方式傳播下去,並為單元的輸入增加一點權重,通過傳播所有權重, dropout將產生收縮權重的平方範數的效果,和$L2$正則化類似;實施 dropout的結果使它會壓縮權重,並完成一些預防過擬合的外層正則化; $L2$對不同權重的衰減是不同的,它取決於激活函數倍增的大小。

dropout的功能類似於 $L2$正則化,與 $L2$正則化不同的是應用方式不同會帶來一點點小變化,甚至更適用於不同的輸入範圍。

dropout實施的另一個細節是,要為神經網路中的每一層選擇一個keep_prob,即該層節點保留的概率。不同層的keep_prob可以變化。對於網路中前面的層,它的keep_prob應該相對較低。對於其它層,過擬合可能沒那麼嚴重,它們的keep_prob可能高一些。如果在某一層,我們不必擔心過擬合問題,可以將keep_prob設置成1。

對於有可能出現過擬合,且含有諸多參數的層,我們可以把 keep_prob設置成比較小的值,以便應用更強大的 dropout,有點像在處理 $L2$正則化的正則化參數$lambda$。

總結一下,dropout大致有如下作用:

  • ==求平均==:在沒有dropout的模型裏,我們用相同的訓練數據去訓練5個不同的神經網路,一般會得到5個不同的結果。此時我們可以採用 「5個結果取均值」或者「多數取勝的投票策略」去決定最終結果。(例如 3個網路判斷結果為數字9,那麼很有可能真正的結果就是數字9,其它兩個網路給出了錯誤結果)。這種「綜合起來取平均」的策略通常可以有效防止過擬合問題。因為不同的網路可能產生不同的過擬合,取平均則有可能讓一些「相反的」擬合互相抵消。dropout掉不同的隱藏神經元就類似在訓練不同的網路(隨機刪掉一半隱藏神經元導致網路結構已經不同),整個dropout過程就相當於 對很多個不同的神經網路取平均。而不同的網路產生不同的過擬合,一些互為「反向」的擬合相互抵消就可以達到整體上減少過擬合。
  • ==減少神經元之間複雜的共適應關係==: 因為dropout的隨機失活,兩個神經元不一定每次都在一個dropout網路中出現。(這樣權值的更新不再依賴於有固定關係的隱含節點的共同作用,阻止了某些特徵僅僅在其它特定特徵下才有效果的情況)。 迫使網路去學習更加魯棒的特徵 (這些特徵在其它的神經元的隨機子集中也存在)。換句話說假如我們的神經網路是在做出某種預測,它不應該對一些特定的線索片段太過敏感,即使丟失特定的線索,它也應該可以從眾多其它線索中學習一些共同的模式。這個角度看 dropout 就有點像L1,L2正則,減少權重使得網路對丟失特定神經元連接的魯棒性提高。

我們知道,在每一層使用dropout後,都會對沒有被dropout掉的神經元進行rescale。即$rescale = 1/(1-keep_prob)$。此步驟是為了彌補因為隨即刪除節點而造成的輸出減少的副作用。

==所以dropout時,權重並沒有被丟棄,只是後面需要對未丟棄神經元做一個rescale來保持期望輸出大小不變。實際丟棄的是就是神經元的輸出。==

參考:

Dropout解決過擬合問題

吳恩達,改善深層神經網路:超參數調試、正則化以及優化


使用dropout丟棄輸出(激活值),使用dropconnect[Wan2013]丟棄權重。

When training with Dropout, a randomly selected subset of activations are set to zero within each layer. DropConnect instead sets a randomly selected subset of weights within the network to zero.

[Wan2013]: Wan, L., Zeiler, M., Zhang, S., Le Cun, Y., Fergus, R. (2013, February). Regularization of neural networks using dropconnect. In International conference on machine learning (ICML 2013) (pp. 1058-1066).


丟的是輸出,樓上說丟權重的應該是deep compression的剪枝吧,pruning。


輸出


丟棄輸出,丟棄權重那個忘記叫什麼名字了,好像不叫drop out?建議看一下cs231n


推薦閱讀:
相關文章