深度学习(二十二)Dropout浅层理解
Dropout淺層理解
原文地址:http://blog.csdn.net/hjimce/article/details/50413257
作者:hjimce
一、相關(guān)工作
? ? 本來今天是要搞《Maxout Networks》和《Network In Network》的,結(jié)果發(fā)現(xiàn)maxout和dropout有點類似,所以就對dropout做一下相關(guān)的總結(jié),了解一下其代碼層面的實現(xiàn)。
? ? Dropout是2012年深度學(xué)習(xí)視覺領(lǐng)域的開山之作paper:《ImageNet?Classification?with?Deep?Convolutional》所提到的算法,用于防止過擬合。在我剛?cè)腴T深度學(xué)習(xí),搞視覺的時候,就有所耳聞,當時只知道它是為了防止過擬合。記得以前啥也不懂,看到《ImageNet?Classification?with?Deep?Convolutional》的思路,然后看到很多文獻都是采用了同樣的思路,于是就跟著模仿,也不知道為什么要這么設(shè)計,然后去kaggle競賽,感覺自己模仿設(shè)計出來的網(wǎng)絡(luò),感覺精度都好爛,然后也不會分析網(wǎng)絡(luò)設(shè)計哪些合理,哪些不合理。當時要么就是模仿別人,要么就是直接用別人的網(wǎng)絡(luò),被領(lǐng)導(dǎo)鄙視了一番……還是不啰嗦了,說多了都是淚。
? ? 網(wǎng)上都說dropout是讓某些神經(jīng)元以一定的概率不工作,但是具體代碼怎么實現(xiàn)?原理又是什么,還是有點迷糊,所以就大體掃描了文獻:《Improving neural networks by preventing?co-adaptation of feature detectors》、《Improving Neural Networks with Dropout》、《Dropout: A Simple Way to Prevent Neural Networks from?Overtting》,不過感覺看完以后,還是收獲不是很大。下面是我的學(xué)習(xí)筆記,因為看的不是很細,也沒有深入理解,有些地方可能有錯,如有錯誤還請指出。
二、算法概述
我們知道如果要訓(xùn)練一個大型的網(wǎng)絡(luò),訓(xùn)練數(shù)據(jù)很少的話,那么很容易引起過擬合(也就是在測試集上的精度很低),可能我們會想到用L2正則化、或者減小網(wǎng)絡(luò)規(guī)模。然而深度學(xué)習(xí)領(lǐng)域大神Hinton,在2012年文獻:《Improving neural networks by preventing?co-adaptation of feature detectors》提出了,在每次訓(xùn)練的時候,讓一半的特征檢測器停過工作,這樣可以提高網(wǎng)絡(luò)的泛化能力,Hinton又把它稱之為dropout。相關(guān)解釋如下:
1、Hinton認為過擬合,可以通過阻止某些特征的協(xié)同作用。在每次訓(xùn)練的時候,隱藏神經(jīng)元之間應(yīng)該是相互獨立的,就像RBM一樣。通過dropout我們可以發(fā)現(xiàn),每個隱藏層神經(jīng)元之間,可能不同時出現(xiàn),也可能同時出現(xiàn),也就是讓隱層神經(jīng)元之間相互獨立。
2、另外一種解釋是,可以把dropout理解為 模型平均。比如我們要實現(xiàn)預(yù)測分類,我們可以設(shè)計n多個網(wǎng)絡(luò),這n多個網(wǎng)絡(luò)各不相同,然后進行分別訓(xùn)練。預(yù)測的時候,就用這n個網(wǎng)絡(luò)模型進行預(yù)測,結(jié)果取它們的平均值,但是這樣當n很大的時候,計算量就非常大了。于是dropout可以這么理解:我們設(shè)計的這n個網(wǎng)絡(luò),權(quán)值共享,同時網(wǎng)絡(luò)層數(shù)相同。這樣可以大大減小計算量(如果采用dropout,訓(xùn)練時間大大延長,但是對測試階段沒影響)。
啰嗦了這么多,那么到底是怎么實現(xiàn)的?Dropout說的簡單一點就是我們讓在前向傳導(dǎo)的時候,讓某個神經(jīng)元的激活值以一定的概率p,讓其停止工作,示意圖如下:
?
左邊是原來的神經(jīng)網(wǎng)絡(luò),右邊是采用Dropout后的網(wǎng)絡(luò)。這個說是這么說,但是具體代碼層面是怎么實現(xiàn)的?怎么讓某個神經(jīng)元以一定的概率停止工作?這個我想很多人還不是很了解,代碼層面的實現(xiàn)方法,下面就講解一下其代碼層面的實現(xiàn)。以前我們網(wǎng)絡(luò)的計算公式是:
?
采用dropout后計算公式就變成了:
?
上面公式中Bernoulli函數(shù),是為了以概率p,隨機生成一個0、1的向量。
算法實現(xiàn)概述:
1、其實Dropout很容易實現(xiàn),源碼只需要幾句話就可以搞定了,讓某個神經(jīng)元以概率p,停止工作,其實就是讓它的激活值以概率p變?yōu)?。比如我們某一層網(wǎng)絡(luò)神經(jīng)元的個數(shù)為1000個,其激活值為x1,x2……x1000,我們dropout比率選擇0.4,那么這一層神經(jīng)元經(jīng)過drop后,x1……x1000神經(jīng)元其中會有大約400個的值被置為0。
2、經(jīng)過上面屏蔽掉某些神經(jīng)元,使其激活值為0以后,我們還需要對向量x1……x1000進行rescale,也就是乘以1/(1-p)。如果你在訓(xùn)練的時候,經(jīng)過置0后,沒有對x1……x1000進行rescale,那么你在測試的時候,就需要對權(quán)重進行rescale:
問題來了,上面為什么經(jīng)過dropout需要進行rescale?這個我也不是很理解,查找了相關(guān)的文獻,都沒找到比較合理的解釋,后面再說一下我對這個的見解。
? ? Dropout的工作原理,從我的觀點上看,其實是一種模型平均,就是假設(shè)我們要實現(xiàn)一個圖片分類任務(wù),我們設(shè)計出了10000個網(wǎng)絡(luò),這10000個網(wǎng)絡(luò),我們可以設(shè)計得各不相同,然后我們對這10000個網(wǎng)絡(luò)進行訓(xùn)練,訓(xùn)練完后我們采用平均的方法,進行預(yù)測,這樣肯定可以提高網(wǎng)絡(luò)的泛化能力,或者說可以防止過擬合,因為這10000個網(wǎng)絡(luò),它們各不相同,可以提高網(wǎng)絡(luò)的穩(wěn)定性。而所謂的dropout我們可以這么理解,這n個網(wǎng)絡(luò),它們部分權(quán)值共享,并且具有相同的網(wǎng)絡(luò)層數(shù),因為我們每次dropout后,都可以看成是整個網(wǎng)絡(luò)的子網(wǎng)絡(luò)。
? ? 所以在測試階段:如果你既不想在訓(xùn)練的時候,對x進行放大,也不愿意在測試的時候,對權(quán)重進行縮小(乘以概率p)。那么你可以測試n次,這n次都采用了dropout,然后對預(yù)測結(jié)果取平均值,這樣當n趨近于無窮大的時候,就是我們需要的結(jié)果了(也就是說你可以采用train階段一模一樣的代碼,包含了dropout在里面,然后前向傳導(dǎo)很多次,比如10000次,然后對著10000個結(jié)果取平均值)。
三、源碼實現(xiàn)
下面我引用keras的dropout實現(xiàn)源碼進行講解,keras開源項目github地址為:
https://github.com/fchollet/keras/tree/master/keras。其dropout所在的文件為:
https://github.com/fchollet/keras/blob/master/keras/backend/theano_backend.py,dropout實現(xiàn)函數(shù)如下:
[python]?view plaincopy
函數(shù)中,x是本層網(wǎng)絡(luò)的激活值。Level就是dropout就是每個神經(jīng)元要被丟棄的概率。不過對于dropout后,為什么需要進行rescale:
[python]?view plaincopy
有的人解釋有點像歸一化一樣,就是保證訓(xùn)練階段和測試階段的數(shù)值分布相同。我查找了很多文獻,都沒找到比較合理的解釋,除了在文獻《Regularization of Neural Networks using DropConnect》稍微解釋了一下,其它好像都沒看到相關(guān)的理論解釋。
我們前面說過,其實Dropout是類似于平均網(wǎng)絡(luò)模型。我們可以這么理解,我們在訓(xùn)練階段訓(xùn)練了1000個網(wǎng)絡(luò),每個網(wǎng)絡(luò)生成的概率為Pi,然后我們在測試階段的時候,我們肯定要把這1000個網(wǎng)絡(luò)的輸出結(jié)果都計算一遍,然后用這1000個輸出,乘以各自網(wǎng)絡(luò)的概率Pi,求得的期望值就是我們最后的平均結(jié)果。我們假設(shè),網(wǎng)絡(luò)模型的輸出如下:
M是Dropout中所有的mask集合。所以當我們在測試階段的時候,我們就是對M中所有的元素網(wǎng)絡(luò),最后所得到的輸出,做一個期望:
P(M)表示網(wǎng)絡(luò)各個子網(wǎng)絡(luò)出現(xiàn)的概率。因為dropout過程中,所有的子網(wǎng)絡(luò)出現(xiàn)的概率都是相同的,所以。
個人總結(jié):個人感覺除非是大型網(wǎng)絡(luò),才采用dropout,不然我感覺自己在一些小型網(wǎng)絡(luò)上,訓(xùn)練好像很是不爽。之前搞一個比較小的網(wǎng)絡(luò),搞人臉特征點定位的時候,因為訓(xùn)練數(shù)據(jù)不夠,怕過擬合,于是就采用dropout,最后感覺好像訓(xùn)練速度好慢,從此就對dropout有了偏見,感覺訓(xùn)練過程一直在波動,很是不爽。
參考文獻:
1、《Improving neural networks by preventing?co-adaptation of feature detectors》
2、《Improving Neural Networks with Dropout》
3、《Dropout: A Simple Way to Prevent Neural Networks from?Overtting》
4、《ImageNet?Classification?with?Deep?Convolutional》
**********************作者:hjimce ? 時間:2015.12.20 ?聯(lián)系QQ:1393852684 ? 地址:http://blog.csdn.net/hjimce? ?原創(chuàng)文章,版權(quán)所有,轉(zhuǎn)載請保留本行信息(不允許刪除)
總結(jié)
以上是生活随笔為你收集整理的深度学习(二十二)Dropout浅层理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习(二十一)基于FCN的图像语义分
- 下一篇: 深度学习(二十三)Maxout网络学习-