dropout理解~簡易理解


工作原理:

         所謂的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 以下模塊.

import tensorflow as tf
from sklearn.datasets import load_digits
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import LabelBinarizer
keep_prob = tf.placeholder(tf.float32)
...
...
Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob)

這里的keep_prob是保留概率,即我們要保留的結果所占比例,它作為一個placeholder,在run時傳入, 當keep_prob=1的時候,相當於100%保留,也就是dropout沒有起作用。 下面我們分析一下程序結構,首先准備數據,

digits = load_digits()

可視化結果 

訓練中keep_prob=1時,就可以暴露出overfitting問題。keep_prob=0.5時,dropout就發揮了作用。 我們可以兩種參數分別運行程序,對比一下結果。

keep_prob=1時,模型對訓練數據的適應性優於測試數據,存在overfitting,輸出如下: 紅線是 train 的誤差, 藍線是 test 的誤差.

Dropout 解決 overfitting

keep_prob=0.5時效果好了很多,輸出如下:

Dropout 解決 overfitting

 


免責聲明!

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



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