日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

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

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

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)

下面我引用kerasdropout實(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
  • #dropout函數(shù)的實(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ù)就像拋硬幣一樣,我們可以把每個(gè)神經(jīng)元當(dāng)做拋硬幣一樣??
  • ????#硬幣?正面的概率為p,n表示每個(gè)神經(jīng)元試驗(yàn)的次數(shù)??
  • ????#因?yàn)槲覀兠總€(gè)神經(jīng)元只需要拋一次就可以了所以n=1,size參數(shù)是我們有多少個(gè)硬幣。??
  • ????sample=np.random.binomial(n=1,p=retain_prob,size=x.shape)#即將生成一個(gè)0、1分布的向量,0表示這個(gè)神經(jīng)元被屏蔽,不工作了,也就是dropout了??
  • ????print?sample??
  • ????x?*=sample#0、1與x相乘,我們就可以屏蔽某些神經(jīng)元,讓它們的值變?yōu)???
  • ????print?x??
  • ????x?/=?retain_prob??
  • ??
  • ????return?x??
  • #對(duì)dropout的測(cè)試,大家可以跑一下上面的函數(shù),了解一個(gè)輸入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就是每個(gè)神經(jīng)元要被丟棄的概率。不過對(duì)于dropout后,為什么需要進(jìn)行rescale:

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

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