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