日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

深度学习(二十二)Dropout浅层理解

發(fā)布時間:2025/3/21 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习(二十二)Dropout浅层理解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)

下面我引用kerasdropout實現(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
  • #dropout函數(shù)的實現(xiàn)??
  • def?dropout(x,?level):??
  • ????if?level?<?0.?or?level?>=?1:#level是概率值,必須在0~1之間??
  • ????????raise?Exception('Dropout?level?must?be?in?interval?[0,?1[.')??
  • ????retain_prob?=?1.?-?level??
  • ????#我們通過binomial函數(shù),生成與x一樣的維數(shù)向量。binomial函數(shù)就像拋硬幣一樣,我們可以把每個神經(jīng)元當做拋硬幣一樣??
  • ????#硬幣?正面的概率為p,n表示每個神經(jīng)元試驗的次數(shù)??
  • ????#因為我們每個神經(jīng)元只需要拋一次就可以了所以n=1,size參數(shù)是我們有多少個硬幣。??
  • ????sample=np.random.binomial(n=1,p=retain_prob,size=x.shape)#即將生成一個0、1分布的向量,0表示這個神經(jīng)元被屏蔽,不工作了,也就是dropout了??
  • ????print?sample??
  • ????x?*=sample#0、1與x相乘,我們就可以屏蔽某些神經(jīng)元,讓它們的值變?yōu)???
  • ????print?x??
  • ????x?/=?retain_prob??
  • ??
  • ????return?x??
  • #對dropout的測試,大家可以跑一下上面的函數(shù),了解一個輸入x向量,經(jīng)過dropout的結(jié)果??
  • x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)??
  • dropout(x,0.4)</span>??
  • 函數(shù)中,x是本層網(wǎng)絡(luò)的激活值。Level就是dropout就是每個神經(jīng)元要被丟棄的概率。不過對于dropout后,為什么需要進行rescale:

    [python]?view plaincopy
  • x?/=?retain_prob??
  • 有的人解釋有點像歸一化一樣,就是保證訓(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。