深度學習(二十二)Dropout淺層理解與實現

2021-02-21 機器學習算法與自然語言處理

來自 | csdn

地址 | https://blog.csdn.net/hjimce/article/details/50413257

作者 | hjimce

編輯 | 機器學習算法與自然語言處理公眾號

本文僅作學術分享,若侵權,請聯繫後臺刪文處理

一、相關工作

    本來今天是要搞《Maxout Networks》和《Network In Network》的,結果發現maxout和dropout有點類似,所以就對dropout做一下相關的總結,了解一下其代碼層面的實現。

    Dropout是2012年深度學習視覺領域的開山之作paper:《ImageNet Classification with Deep Convolutional》所提到的算法,用於防止過擬合。在我剛入門深度學習,搞視覺的時候,就有所耳聞,當時只知道它是為了防止過擬合。記得以前啥也不懂,看到《ImageNet Classification with Deep Convolutional》的思路,然後看到很多文獻都是採用了同樣的思路,於是就跟著模仿,也不知道為什麼要這麼設計,然後去kaggle競賽,感覺自己模仿設計出來的網絡,感覺精度都好爛,然後也不會分析網絡設計哪些合理,哪些不合理。當時要麼就是模仿別人,要麼就是直接用別人的網絡,被領導鄙視了一番……還是不囉嗦了,說多了都是淚。

    網上都說dropout是讓某些神經元以一定的概率不工作,但是具體代碼怎麼實現?原理又是什麼,還是有點迷糊,所以就大體掃描了文獻:《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》,不過感覺看完以後,還是收穫不是很大。下面是我的學習筆記,因為看的不是很細,也沒有深入理解,有些地方可能有錯,如有錯誤還請指出。

二、算法概述

我們知道如果要訓練一個大型的網絡,訓練數據很少的話,那麼很容易引起過擬合(也就是在測試集上的精度很低),可能我們會想到用L2正則化、或者減小網絡規模。然而深度學習領域大神Hinton,在2012年文獻:《Improving neural networks by preventing co-adaptation of feature detectors》提出了,在每次訓練的時候,讓一半的特徵檢測器停過工作,這樣可以提高網絡的泛化能力,Hinton又把它稱之為dropout。

Hinton認為過擬合,可以通過阻止某些特徵的協同作用來緩解。在每次訓練的時候,每個神經元有百分之50的機率被移除,這樣可以讓一個神經元的出現不應該依賴於另外一個神經元。

另外,我們可以把dropout理解為 模型平均。假設我們要實現一個圖片分類任務,我們設計出了100000個網絡,這100000個網絡,我們可以設計得各不相同,然後我們對這100000個網絡進行訓練,訓練完後我們採用平均的方法,進行預測,這樣肯定可以提高網絡的泛化能力,或者說可以防止過擬合,因為這100000個網絡,它們各不相同,可以提高網絡的穩定性。而所謂的dropout我們可以這麼理解,這n個網絡,它們權值共享,並且具有相同的網絡層數(這樣可以大大減小計算量)。我們每次dropout後,網絡模型都可以看成是整個網絡的子網絡。(需要注意的是如果採用dropout,訓練時間大大延長,但是對測試階段沒影響)。

囉嗦了這麼多,那麼到底是怎麼實現的?Dropout說的簡單一點就是我們讓在前向傳導的時候,讓某個神經元的激活值以一定的概率p,讓其停止工作,示意圖如下:

 

左邊是原來的神經網絡,右邊是採用Dropout後的網絡。這個說是這麼說,但是具體代碼層面是怎麼實現的?怎麼讓某個神經元以一定的概率停止工作?這個我想很多人還不是很了解,代碼層面的實現方法,下面就講解一下其代碼層面的實現。以前我們網絡的計算公式是:

 

採用dropout後計算公式就變成了:

 

上面公式中Bernoulli函數,是為了以概率p,隨機生成一個0、1的向量。

算法實現概述:

1、其實Dropout很容易實現,源碼只需要幾句話就可以搞定了,讓某個神經元以概率p,停止工作,其實就是讓它的激活值以概率p變為0。比如我們某一層網絡神經元的個數為1000個,其激活值為x1,x2……x1000,我們dropout比率選擇0.4,那麼這一層神經元經過drop後,x1……x1000神經元其中會有大約400個的值被置為0。

2、經過上面屏蔽掉某些神經元,使其激活值為0以後,我們還需要對向量x1……x1000進行rescale,也就是乘以1/(1-p)。如果你在訓練的時候,經過置0後,沒有對x1……x1000進行rescale,那麼你在測試的時候,就需要對權重進行rescale:

問題來了,上面為什麼經過dropout需要進行rescale?查找了相關的文獻,都沒找到比較合理的解釋,後面再結合源碼說一下我對這個的見解。

    所以在測試階段:如果你既不想在訓練的時候,對x進行放大,也不願意在測試的時候,對權重進行縮小(乘以概率p)。那麼你可以測試n次,這n次都採用了dropout,然後對預測結果取平均值,這樣當n趨近於無窮大的時候,就是我們需要的結果了(也就是說你可以採用train階段一模一樣的代碼,包含了dropout在裡面,然後前向傳導很多次,比如1000000次,然後對著1000000個結果取平均值)。

三、源碼實現

下面我引用keras的dropout實現源碼進行講解,keras開源項目github地址為:

https://github.com/fchollet/keras/tree/master/keras。其dropout所在的文件為:

https://github.com/fchollet/keras/blob/master/keras/backend/theano_backend.py,dropout實現函數如下:

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  sample=np.random.binomial(n=1,p=retain_prob,size=x.shape)#即將生成一個0、1分布的向量,0表示這個神經元被屏蔽,不工作了,也就是dropout了  print sample  x *=sample#0、1與x相乘,我們就可以屏蔽某些神經元,讓它們的值變為0  print x  x /= retain_prob   return xx=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)dropout(x,0.4)</span>

函數中,x是本層網絡的激活值。Level就是dropout就是每個神經元要被丟棄的概率。不過對於dropout後,為什麼需要進行rescale:

有的人解釋有點像歸一化一樣,就是保證網絡的每一層在訓練階段和測試階段數據分布相同。我查找了很多文獻,都沒找到比較合理的解釋,除了在文獻《Regularization of Neural Networks using DropConnect》稍微解釋了一下,其它好像都沒看到相關的理論解釋。

我們前面說過,其實Dropout是類似於平均網絡模型。我們可以這麼理解,我們在訓練階段訓練了1000個網絡,每個網絡生成的概率為Pi,然後我們在測試階段的時候,我們肯定要把這1000個網絡的輸出結果都計算一遍,然後用這1000個輸出,乘以各自網絡的概率Pi,求得的期望值就是我們最後的平均結果。我們假設,網絡模型的輸出如下:

M是Dropout中所有的mask集合。所以當我們在測試階段的時候,我們就是對M中所有的元素網絡,最後所得到的輸出,做一個期望:

P(M)表示網絡各個子網絡出現的概率。因為dropout過程中,所有的子網絡出現的概率都是相同的,所以。

個人總結:個人感覺除非是大型網絡,才採用dropout,不然我感覺自己在一些小型網絡上,訓練好像很是不爽。之前搞一個比較小的網絡,搞人臉特徵點定位的時候,因為訓練數據不夠,怕過擬合,於是就採用dropout,最後感覺好像訓練速度好慢,從此就對dropout有了偏見,感覺訓練過程一直在波動,很是不爽。

參考文獻:

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》

————————————————

版權聲明:本文為CSDN博主「hjimce」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/hjimce/java/article/details/50413257

重磅!憶臻自然語言處理-學術微信交流群已成立

可以掃描下方二維碼,小助手將會邀請您入群交流,

注意:請大家添加時修改備註為 [學校/公司 + 姓名 + 方向]

例如 —— 哈工大+張三+對話系統。

號主,微商請自覺繞道。謝謝!

推薦閱讀:

【長文詳解】從Transformer到BERT模型

賽爾譯文 | 從頭開始了解Transformer

百聞不如一碼!手把手教你用Python搭一個Transformer

相關焦點

  • 深度學習中Dropout原理解析
    從上面的論文中,我們能感受到Dropout在深度學習中的重要性。那麼,到底什麼是Dropout呢?Dropout可以作為訓練深度神經網絡的一種trick供選擇。在每個訓練批次中,通過忽略一半的特徵檢測器(讓一半的隱層節點值為0),可以明顯地減少過擬合現象。這種方式可以減少特徵檢測器(隱層節點)間的相互作用,檢測器相互作用是指某些檢測器依賴其他檢測器才能發揮作用。
  • 理解神經網絡中的Dropout
    dropout是指在深度學習網絡的訓練過程中,對於神經網絡單元,按照一定的概率將其暫時從網絡中丟棄。注意是暫時,對於隨機梯度下降來說,由於是隨機丟棄,故而每一個mini-batch都在訓練不同的網絡。
  • 深度學習筆記5:正則化與dropout
    在筆記 4 中,詳細闡述了機器學習中利用正則化防止過擬合的基本方法,對 L1 和 L2 範數進行了通俗的解釋。為了防止深度神經網絡出現過擬合,除了給損失函數加上 L2 正則化項之外,還有一個很著名的方法——dropout.       廢話少說,咱們單刀直入正題。究竟啥是 dropout ?
  • 基於Keras/Python的深度學習模型Dropout正則項
    dropout技術是神經網絡和深度學習模型的一種簡單而有效的正則化方式。
  • 筆記(乾貨):dropout原理總結
    深度學習架構現在變得越來越深,dropout作為一個防過擬合的手段,使用也越來越普遍。圖1為:稠密網絡2012年,Dropout的想法被首次提出,它的出現徹底改變了深度學習進度,之後深度學習方向(反饋模型)開始展現優勢,傳統的機器學習慢慢的消聲。
  • Dropout也能自動化了,谷歌Quoc Le等人利用強化學習自動找尋模型專用Dropout
    Le 提出了一種自動學習 Dropout 的方法。研究者稱,通過強化學習來學習 Dropout 的規律,AutoDropout 可以提高圖像識別、語言理解和機器翻譯的性能。該研究已被人工智慧頂會 AAAI-2021 接收。現代神經網絡常常過參數化,因而需要適當的正則化來避免過擬合現象。Dropout 是一種常見的正則化方法,該方法從網絡的一些中間層中隨機選擇神經元,並將這些神經元的值替換為零。
  • 【深度學習系列4】深度學習及並行化實現概述
    訓練深層模型是長期以來的難題,近年來以層次化、逐層初始化為代表的一系列方法的提出給訓練深層模型帶來了希望,並在多個應用領域獲得了成功。深層模型的並行化框架和訓練加速方法是深度學習走向實用的重要基石,已有多個針對不同深度模型的開源實現,Google、Facebook、百度、騰訊等公司也實現了各自的並行化框架。
  • 深度| 為什麼隨機性對於深度學習如此重要?
    在一個怡人的午後,我開始嘗試著用通俗易懂的語言向我媽媽解釋隨機性對於深度學習的重要性。儘管我媽媽還是對於深度學習一知半解,但是我認為我的努力部分成功了,我迷上了這種方式並將它應用在了我的實際工作中。我想將這篇稍具技術性的小文章送給在深度學習領域的實踐者,希望大家能夠對神經網絡內部的運行過程有更好的理解。
  • 語文如何實現深度學習
    美國教育心理學家布魯姆把認知領域教學目標從低到高分成識記、理解、應用、分析、綜合、評價六個層次,一層和二層為「淺層學習」,四至六層為「深度學習」。要實現淺層學習向深度學習的轉變,必須由傳承知識的學習走向創新知識的學習,學生要從知識的傳承者、消費者轉變為知識的創造者、貢獻者。
  • 用Keras進行深度學習模式的正則化方法:Dropout
    Dropout是神經網絡和深度學習模型的簡單而有效的正則化技術。在這篇文章中,你將發現Dropout正則化技術,以及如何使用Keras將其應用於Python中的模型。看完這篇文章後,你會知道:Dropout正則化的原理。如何在輸入層上使用Dropout。如何在隱藏的層上使用Dropout。
  • 通過授權實現「晶片國產化」敲響警鐘;IBM提出「新版Dropout」
    但同時再次為 企圖通過授權實現「晶片國產化」的路子敲響了警鐘。2.【新聞 | 大幅減少訓練迭代次數,提高泛化能力:IBM提出「新版Dropout」】來源:機器之心Dropout 可以提高深度神經網絡的泛化能力,因此被廣泛應用於各種 DNN 任務中。訓練時,dropout 會通過隨機忽略一部分神經元來防止過擬合。
  • 神經網絡中的損失函數正則化和 Dropout 並手寫代碼實現
    在深度神經網絡中最常用的方法是Regularization和dropout。 在本文中,我們將一起理解這兩種方法並在python中實現它們Regularization 正則化正則化通過在損失函數的末尾添加額外的懲罰項來幫助防止模型過度擬合。
  • 揭秘深度學習成功的數學原因:從全局最優性到學習表徵不變性
    本文的目的正是要揭示深度學習成功的奧秘。通過圍繞著深度學習的三個核心要素——架構、正則化技術和優化算法,並回顧近期研究,作者為深層網絡的若干屬性,如全局最優性、幾何穩定性、學習表徵不變性,提供了一個數學證明。
  • 郭元祥:深度學習 本質與理念
    理解深度學習理論對深化我國的教學改革具有重要的意義。  一、深度學習概念的提出  深度學習的概念,源於30多年來計算機科學、人工神經網絡和人工智慧的研究。  30多年來,加拿大多倫多大學計算機系辛頓教授(Hinton,G.)一直從事機器學習模型、神經網絡與人工智慧等問題的相關研究,並在機器學習模型特別是突破淺層學習模型,實現計算機抽象認知方面取得了突破性的進展。
  • 理論提點||「深度學習」內涵及策略
    研究者認為,深度學習是一種高水平認知加工、基於理解的、主動的學習方式,與之對應的是低水平認知加工、機械記憶、被動的淺層學習,如馬頓、薩爾約、比格斯(J.Biggs)等。米裡斯(BarbaraJ.Millis)認為,為了實現學生深度學習,教師要明確教學內容的重點、設計能夠促進學生深度理解和參與的活動,給予學生高質量的反饋和作業。安富海強調深度學習的實現需要教師確立高階思維發展的教學目標、整合意義聯接的學習內容、創設促進深度學習的真實情景、選擇持續關注的評價方式進行積極引導。深度學習研究對我國課堂教學改革實踐提供了新的思路。
  • 從貝葉斯角度,看深度學習的屬性和改進方法 - 機器之心Pro
    貝葉斯正則化(Bayesian regularization)是尋找最優網絡和提供最優偏差-方差權衡框架以實現良好樣本性能的核心。我們還討論了高維中構建良好的貝葉斯預測因子。為了證明我們的方法,我們對 Airbnb 首次國際預訂的樣本進行了分析。最後,我們討論了該研究未來的方向。1 引言深度學習(DL)是一種使用分層隱含變量的機器學習方法。
  • 深度學習筆記16:CNN經典論文研讀之AlexNet及其Tensorflow實現
    這一成績引起了學界和業界的極大關注,計算機視覺也開始逐漸進入深度學習主導的時代。操作def dropout(x, keep_prob):      return tf.nn.dropout(x,keep_prob)      以上關於搭建 AlexNet 的各個組件我們都已準備好,下面我們利用這些組建創建一個 AlexNet  類來實現  AlexNet。
  • 走出「課堂深度學習」認識的三大誤區
    研究者認為,深度學習是一種高水平認知加工、基於理解的、主動的學習方式,與之對應的是低水平認知加工、機械記憶、被動的淺層學習,如馬頓、薩爾約、比格斯等。不少研究者逐漸認識到,深度學習離不開教師有深度的「教」。米裡斯認為,為了實現學生深度學習,教師要明確教學內容的重點、設計能夠促進學生深度理解和參與的活動,給予學生高質量的反饋和作業。安富海強調深度學習的實現需要教師確立高階思維發展的教學目標、整合意義聯接的學習內容、創設促進深度學習的真實情景、選擇持續關注的評價方式進行積極引導。
  • 走出「課堂深度學習」認識的三大誤區!
    研究者認為,深度學習是一種高水平認知加工、基於理解的、主動的學習方式,與之對應的是低水平認知加工、機械記憶、被動的淺層學習,如馬頓、薩爾約、比格斯等。不少研究者逐漸認識到,深度學習離不開教師有深度的「教」。米裡斯認為,為了實現學生深度學習,教師要明確教學內容的重點、設計能夠促進學生深度理解和參與的活動,給予學生高質量的反饋和作業。安富海強調深度學習的實現需要教師確立高階思維發展的教學目標、整合意義聯接的學習內容、創設促進深度學習的真實情景、選擇持續關注的評價方式進行積極引導。
  • 深度學習力001:重新定義學習
    淺層學習就是機械記憶、死記硬背,最後只能記住一些淺顯的信息和簡單操作,比如記住乘法表、字母表、人名、地名、簡單的數學計算和使用電腦等,不斷地重複數十次來記憶一個數學公式就是淺層學習。淺層學習常常把從一本書中看到的、課上聽到的信息作為孤立且不相關的事實來被動接受和記憶,為了通過考試、應付工作對學習內容進行粗略記憶,很少花心思去理解,更提不上通過練習讓記憶長期保持。