工作原理:
所謂的dropout,從字面意思理解,就是“拋棄”。
拋棄什么呢?拋棄的是網絡中隱藏層的節點(輸入層和輸出層是由數據類型和問題類型決定的,當然不能動啦!)。
怎么拋棄呢?dropout有一個參數p,p的取值介於0和1,含義是每個節點有p概率被拋棄。
被拋棄對這個節點有什么影響呢?dropout對於節點的影響表現在,一旦某個節點被選定為拋棄的節點,那么對於神經網絡的forward過程這個節點的輸出就被置為0;對於backward過程,這個節點的權重和偏置不參與更新。也就是說,在某次迭代中,網絡中有部分節點不參與這一次的訓練,整個網絡結構等效於下圖右側(左側是dropout前的)。
為什么管用?
回歸到最重要的問題:為什么dropout效果這么好。Hinton大神的解釋是dropout減少了節點之間的共適應。共適應這個詞說起來好專業,我舉個例子來說一下我的理解:
假設一個網絡中有10個節點,有一個perfect節點,它的取值剛剛好,另外9個節點的取值還需要調整,也就是所謂的一神帶9坑!這個時候網絡的輸出層往回傳遞誤差,這10個節點都不知道自己現在的取值是不是合適的啊,畢竟咱們開了上帝視角,而它們沒有。所以它們就根據傳回來的誤差更新自己的取值,雖然其他9個節點可能有更合適的取值,但是這個perfect的值就破壞了啊。而且,在更新取值的時候,其他9個坑逼節點心想“這個誤差是咱們10個共同造成的,嗯,我只要把我那份誤差更新掉就行”,而實際上最終的誤差是9個節點造成的,也就是說這些個坑逼節點對自己的錯誤認識還不夠充分!不行,不能這么寵着它們!一個很簡單的想法,就是讓perfect不工作,得了,您歇着吧!這個時候9個節點就可以更好的更新自己權值,直到出現下一個perfect節點。
但是,問題是咱們也不知道哪個節點是perfect節點啊,咱們訓練的時候別說上帝視角了,有時候就連哪些個節點是dead node都看不穿啊。那怎么辦呢?就讓部分節點先不工作吧,先富帶后富。假設不工作的節點全是坑壁節點,那對於perfect節點就是好事啊,畢竟最后的誤差就小了。如果不工作的節點恰好有perfect節點,那對於那些個正在工作的菜雞節點就是好事,讓他們能正確認識到自己的錯誤!這樣網絡就能訓練得更好了。
當節點之間的共適應性減少了,除了能讓網絡取得更好的參數外,還能具有模型融合的優勢。做過數據挖掘比賽的都知道,即使是幾個弱雞模型ensemble一下,也能有非常亮眼的表現。這就是dropout帶來的另外一個好處。
Dropout 解決 overfitting
建立 dropout 層
本次內容需要使用一下 sklearn 數據庫當中的數據, 沒有安裝 sklearn 的同學可以參考一下這個教程 安裝一下. 然后 import
以下模塊.
這里的keep_prob
是保留概率,即我們要保留的結果所占比例,它作為一個placeholder
,在run
時傳入, 當keep_prob=1
的時候,相當於100%保留,也就是dropout沒有起作用。 下面我們分析一下程序結構,首先准備數據,
可視化結果
訓練中keep_prob=1
時,就可以暴露出overfitting問題。keep_prob=0.5
時,dropout
就發揮了作用。 我們可以兩種參數分別運行程序,對比一下結果。
當keep_prob=1
時,模型對訓練數據的適應性優於測試數據,存在overfitting,輸出如下: 紅線是 train
的誤差, 藍線是 test
的誤差.
當keep_prob=0.5
時效果好了很多,輸出如下: