吳恩達深度學習筆記(33)-帶你進一步瞭解Dropout

理解 dropout(Understanding Dropout)

Dropout可以隨機刪除網絡中的神經單元,他為什麼可以通過正則化發揮如此大的作用呢?

直觀上理解:不要依賴於任何一個特徵,因為該單元的輸入可能隨時被清除,因此該單元通過這種方式傳播下去,併為單元的四個輸入增加一點權重,通過傳播所有權重,dropout將產生收縮權重的平方範數的效果,和之前講的L2正則化類似

實施dropout的結果實它會壓縮權重,並完成一些預防過擬合的外層正則化;L2對不同權重的衰減是不同的,它取決於激活函數倍增的大小。

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

吳恩達深度學習筆記(33)-帶你進一步瞭解Dropout

第二個直觀認識是,我們從單個神經元入手,如圖,這個單元的工作就是輸入並生成一些有意義的輸出。

通過dropout,該單元的輸入幾乎被消除,有時這兩個單元會被刪除,有時會刪除其它單元,就是說,用紫色圈起來的這個單元,它不能依靠任何特徵,因為特徵都有可能被隨機清除,或者說該單元的輸入也都可能被隨機清除。

但我不願意把所有賭注都放在一個節點上,不願意給任何一個輸入加上太多權重,因為它可能會被刪除,因此該單元將通過這種方式積極地傳播開,併為單元的四個輸入增加一點權重,通過傳播所有權重,dropout將產生收縮權重的平方範數的效果,和我們之前講過的L2正則化類似,實施dropout的結果是它會壓縮權重,並完成一些預防過擬合的外層正則化。

事實證明,dropout被正式地作為一種正則化的替代形式,L2對不同權重的衰減是不同的,它取決於倍增的激活函數的大小。

總結一下,dropout的功能類似於L2正則化,與L2正則化不同的是,被應用的方式不同,dropout也會有所不同,甚至更適用於不同的輸入範圍。

吳恩達深度學習筆記(33)-帶你進一步瞭解Dropout

實施dropout的另一個細節是,這是一個擁有三個輸入特徵的網絡,其中一個要選擇的參數是keep-prob,它代表每一層上保留單元的概率。

所以不同層的keep-prob也可以變化。第一層,矩陣W^([1])是7×3,第二個權重矩陣W^([2])是7×7,第三個權重矩陣W^([3])是3×7,以此類推,W^([2])是最大的權重矩陣,因為W^([2])擁有最大參數集,即7×7,為了預防矩陣的過擬合,對於這一層,我認為這是第二層,它的keep-prob值應該相對較低,假設是0.5。對於其它層,過擬合的程度可能沒那麼嚴重,它們的keep-prob值可能高一些,可能是0.7,這裡是0.7。如果在某一層,我們不必擔心其過擬合的問題,那麼keep-prob可以為1,為了表達清除,我用紫色線筆把它們圈出來,每層keep-prob的值可能不同。

吳恩達深度學習筆記(33)-帶你進一步瞭解Dropout

注意keep-prob的值是1,意味著保留所有單元,並且不在這一層使用dropout,對於有可能出現過擬合,且含有諸多參數的層,我們可以把keep-prob設置成比較小的值,以便應用更強大的dropout,有點像在處理L2正則化的正則化參數λ,我們嘗試對某些層施行更多正則化,從技術上講,我們也可以對輸入層應用dropout,我們有機會刪除一個或多個輸入特徵,雖然現實中我們通常不這麼做,keep-prob的值為1,是非常常用的輸入值,也可以用更大的值,或許是0.9。但是消除一半的輸入特徵是不太可能的,如果我們遵守這個準則,keep-prob會接近於1,即使你對輸入層應用dropout。

總結一下,如果你擔心某些層比其它層更容易發生過擬合,可以把某些層的keep-prob值設置得比其它層更低,缺點是為了使用交叉驗證,你要搜索更多的超級參數,

另一種方案是在一些層上應用dropout,而有些層不用dropout,應用dropout的層只含有一個超級參數,就是keep-prob。

結束前分享兩個實施過程中的技巧,實施dropout,在計算機視覺領域有很多成功的第一次。計算視覺中的輸入量非常大,輸入太多像素,以至於沒有足夠的數據,所以dropout在計算機視覺中應用得比較頻繁,有些計算機視覺研究人員非常喜歡用它,幾乎成了默認的選擇,但要牢記一點,dropout是一種正則化方法,它有助於預防過擬合,因此除非算法過擬合,不然我是不會使用dropout的,所以它在其它領域應用得比較少,主要存在於計算機視覺領域,因為我們通常沒有足夠的數據,所以一直存在過擬合,這就是有些計算機視覺研究人員如此鍾情於dropout函數的原因。直觀上我認為不能概括其它學科。

吳恩達深度學習筆記(33)-帶你進一步瞭解Dropout

dropout一大缺點就是代價函數J不再被明確定義,每次迭代,都會隨機移除一些節點

如果再三檢查梯度下降的性能,實際上是很難進行復查的。定義明確的代價函數J每次迭代後都會下降,因為我們所優化的代價函數J實際上並沒有明確定義,或者說在某種程度上很難計算,所以我們失去了調試工具來繪製這樣的圖片。

我通常會關閉dropout函數,將keep-prob的值設為1,運行代碼,確保J函數單調遞減。然後打開dropout函數,希望在dropout過程中,代碼並未引入bug。我覺得你也可以嘗試其它方法,雖然我們並沒有關於這些方法性能的數據統計,但你可以把它們與dropout方法一起使用。


分享到:


相關文章: