李理:卷積神經網絡之Dropout

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

來自 | csdn

地址 | https://blog.csdn.net/qunnie_yi/article/details/80128463

作者 | csdn王藝

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

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

上文介紹了Batch Normalization技術。Batch Normalization是加速訓練收斂速度的非常簡單但又好用的一種實用技術,下面我們介紹可以提高模型的泛化能力的DropOut技術。

4. Dropout

4.1 Dropout簡介

dropout是一種防止模型過擬合的技術,這項技術也很簡單,但是很實用。它的基本思想是在訓練的時候隨機的dropout(丟棄)一些神經元的激活,這樣可以讓模型更魯棒,因為它不會太依賴某些局部的特徵(因為局部特徵有可能被丟棄)。

上圖a是標準的一個全連接的神經網絡,b是對a應用了dropout的結果,它會以一定的概率(dropout probability)隨機的丟棄掉一些神經元。

4.2 Dropout的實現

實現Dropout最直觀的思路就是按照dropout的定義來計算,比如上面的3層(2個隱藏層)的全連接網絡,我們可以這樣實現:

""" 最原始的dropout實現,不推薦使用 """

p = 0.5

def train_step(X):

H1 = np.maximum(0, np.dot(W1, X) + b1) U1 = np.random.rand(*H1.shape) < p H1 *= U1 H2 = np.maximum(0, np.dot(W2, H1) + b2) U2 = np.random.rand(*H2.shape) < p H2 *= U2 out = np.dot(W3, H2) + b3



def predict(X): H1 = np.maximum(0, np.dot(W1, X) + b1) * p H2 = np.maximum(0, np.dot(W2, H1) + b2) * p out = np.dot(W3, H2) + b3

我們看函數 train_step,正常計算第一層的激活H1之後,我們隨機的生成dropout mask數組U1。它生成一個0-1之間均勻分布的隨機數組,然後把小於p的變成1,大於p的變成0。極端的情況,p = 0,則所有數都不小於p,因此U1全是0;p=1,所有數都小於1,因此U1全是1。因此越大,U1中1越多,也就keep的越多,反之則dropout的越多。

然後我們用U1乘以H1,這樣U1中等於0的神經元的激活就是0,其餘的仍然是H1。

第二層也是一樣的道理。

predict函數我們需要注意一下。因為我們訓練的時候會隨機的丟棄一些神經元,但是預測的時候就沒辦法隨機丟棄了【我個人覺得也不是不能丟棄,但是這會帶來結果會不穩定的問題,也就是給定一個測試數據,有時候輸出a有時候輸出b,結果不穩定,這是實際系統不能接受的,用戶可能認為你的模型有」bug「】。那麼一種」補償「的方案就是每個神經元的輸出都乘以一個p,這樣在」總體上「使得測試數據和訓練數據是大致一樣的。比如一個神經元的輸出是x,那麼在訓練的時候它有p的概率keep,(1-0)的概率丟棄,那麼它輸出的期望是p x+(1-p) 0=px。因此測試的時候把這個神經元乘以p可以得到同樣的期望。

但是這樣測試的時候就需要多一次乘法,我們對於訓練的實時性要求沒有測試那麼高。所以更為常見的做法是如下面的代碼:

p = 0.5 # 保留一個神經元的概率,這個值越大,丟棄的概率就越小。

def train_step(X): H1 = np.maximum(0, np.dot(W1, X) + b1) U1 = (np.random.rand(*H1.shape) < p) / p # first dropout mask. Notice /p! H1 *= U1 # drop! H2 = np.maximum(0, np.dot(W2, H1) + b2) U2 = (np.random.rand(*H2.shape) < p) / p # second dropout mask. Notice /p! H2 *= U2 # drop! out = np.dot(W3, H2) + b3

def predict(X): H1 = np.maximum(0, np.dot(W1, X) + b1) # no scaling necessary H2 = np.maximum(0, np.dot(W2, H1) + b2) out = np.dot(W3, H2) + b3

上面的代碼在訓練的時候給U1的每個元素除以p,相當於給H1放大1/p倍,那麼預測的時候,那麼後面層的參數學到的就相當於沒有dropout的情況,因此預測的時候就不需要再乘以p了。比如第1層的輸出是100個神經元,假設每一個神經元的輸出都是0.5。如果沒有dropout,這100個神經元都會連接到第二層的第一個神經元,假設第二層的第一個神經元的參數都是1,那麼它的累加和是50。如果使用了0.5的概率保留,則第二層第一個神經元的累加和變成了25。但是上面的算法,我們對每個神經元的輸出都先除以0.5。也就是第一層每個輸出都是1,一個100個輸入給第二層的第一個神經元,然後又以0.5的概率丟棄,那麼最終累加的結果還是50。這樣就」相當於「補償」了第二層的「損失」。

4.3 實現

我們打開作業2的Dropout.ipynb。

4.3.1 cell1-2

和之前的一樣的代碼

4.3.2 cell3

打開layers.py,把dropout_forward裡缺失的代碼實現如下:

 

if mode == 'train':    [N,D] = x.shape    mask = (np.random.rand(N,D) < (1-p))/(1-p)    out = x * mask  elif mode == 'test':    out = x

代碼非常簡單,不過注意的是這裡的p是丟棄的概率,所以保留的概率是(1-p)。

運行這個cell的結果如下圖:

注意使用不同的dropout的結果是差不多的,因為我們實現的方法是「補償」,如果您使用第一種實現,那麼均值應該隨著p而變化

4.3.3 cell4

接下來是實現dropout_backward,這也非常簡單,只有一行代碼:

if mode == 『train』:

   

然後我們運行cell4進行gradient check

4.3.4 cell5

然後我們需要修改fc_net.py來增加dropout的支持,具體來說,如果dropout參數不是空,那麼每一個relu的輸出都需要增加一個dropout。

4.3.4.1 loss函數

init裡代碼已經處理好了,不需要任何修改,我們只需要修改loss的forward和backward部分。

首先是loss函數的forward部分:

   

dropout_cache = {}    for i in range(1, self.num_layers):      keyW = 'W' + str(i)      keyb = 'b' + str(i)

if not self.use_batchnorm: current_input, affine_relu_cache[i] = affine_relu_forward(current_input, self.params[keyW], self.params[keyb])

else: key_gamma = 'gamma' + str(i) key_beta = 'beta' + str(i) current_input, affine_bn_relu_cache[i] = affine_bn_relu_forward(current_input, self.params[keyW], self.params[keyb], self.params[key_gamma], self.params[key_beta], self.bn_params[i - 1])

if self.use_dropout: current_input, dropout_cache[i] = dropout_forward(current_input,self.dropout_param)

和之前的代碼比其實就增加了兩行,如果self.use_dropout。

當然還要記得在外面定義dropout_cache這個dict

然後是backward部分:

for i in range(self.num_layers - 1, 0, -1):      if self.use_dropout:        affine_dx = dropout_backward(affine_dx, dropout_cache[i])

if not self.use_batchnorm: affine_dx, affine_dw, affine_db = affine_relu_backward(affine_dx, affine_relu_cache[i])

else: affine_dx, affine_dw, affine_db, dgamma, dbeta = affine_bn_relu_backward(affine_dx, affine_bn_relu_cache[i]) grads['beta' + str(i)] = dbeta grads['gamma' + str(i)] = dgamma

在for循環的最上面增加 if self.use_dropout這兩行。

注意順序,我們是把dropout放到激活函數之後,因此反向求梯度是要最先計算affine_dx

完成代碼後我們執行這個cell堅持梯度是否正確計算:

4.3.5 cell6-7

As an experiment, we will train a pair of two-layer networks on 500 training examples: one will use no dropout, and one will use a dropout probability of 0.75. We will then visualize the training and validation accuracies of the two networks over time.

接下來我們做一個實驗,我們會用500個數據訓練一對2層的網絡:其中一個使用dropout(0.75的丟棄概率),一個不用。

訓練數據上的準確率

驗證數據上的準確率

從上面兩個圖可以看出:不使用dropout,訓練數據很少時會過擬合,在訓練數據上準確率100%,但是驗證數據上只有28%。而使用了dropout之後,訓練數據90%,但是驗證數據上能提高到30%以上。

這說明dropout確實能緩解過擬合的問題。

本篇文章介紹了Dropout技術,在下一篇文章中,我們將深入講解一個CNN網絡的具體實現。

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

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

原文連結:

https://blog.csdn.net/qunnie_yi/java/article/details/80128463

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

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

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

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

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

推薦閱讀:

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

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

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

相關焦點

  • 李理:詳解卷積神經網絡
    本系列文章面向深度學習研發者,希望通過Image Caption Generation,一個有意思的具體任務,深入淺出地介紹深度學習的知識。
  • 詳解卷積神經網絡
    接下來介紹一種非常重要的神經網絡——卷積神經網絡。這種神經網絡在計算機視覺領域取得了重大的成功,而且在自然語言處理等其它領域也有很好的應用。深度學習受到大家的關注很大一個原因就是Alex等人實現的AlexNet(一種深度卷積神經網絡)在LSVRC-2010 ImageNet這個比賽中取得了非常好的成績。此後,卷積神經網絡及其變種被廣泛應用於各種圖像相關任務。
  • 理解神經網絡中的Dropout
    dropout是指在深度學習網絡的訓練過程中,對於神經網絡單元,按照一定的概率將其暫時從網絡中丟棄。注意是暫時,對於隨機梯度下降來說,由於是隨機丟棄,故而每一個mini-batch都在訓練不同的網絡。
  • 深度學習之卷積神經網絡經典模型
    雖然層數只有7層,這在如今龐大的神經網絡中可是說是非常少的了,但是包含了卷積層,池化層,全連接層,可謂麻雀雖小五臟俱全了。為了方便,我們把卷積層稱為C層,下採樣層叫做下採樣層。首先,輸入層輸入原始圖像,原始圖像被處理成32×32個像素點的值。然後,後面的隱層計在卷積和子抽樣之間交替進行。C1層是卷積層,包含了六個特徵圖。每個映射也就是28x28個神經元。
  • 深度學習中Dropout原理解析
    (1)取平均的作用: 先回到標準的模型即沒有dropout,我們用相同的訓練數據去訓練5個不同的神經網絡,一般會得到5個不同的結果,此時我們可以採用 「5個結果取均值」或者「多數取勝的投票策略」去決定最終結果。例如3個網絡判斷結果為數字9,那麼很有可能真正的結果就是數字9,其它兩個網絡給出了錯誤結果。這種「綜合起來取平均」的策略通常可以有效防止過擬合問題。
  • 人工智慧之卷積神經網絡(CNN)
    人工智慧之機器學習主要有三大類:1)分類;2)回歸;3)聚類。今天我們重點探討一下卷積神經網絡(CNN)算法。^_^本文引用地址:http://www.eepw.com.cn/article/201806/381807.htm  20世紀60年代,Hubel和Wiesel在研究貓腦皮層中用於局部敏感和方向選擇的神經元時發現其獨特的網絡結構可以有效地降低反饋神經網絡的複雜性,繼而提出了卷積神經網絡CNN(Convolutional Neural Networks)。
  • NIPS 2018 | Quoc Le提出卷積網絡專屬正則化方法DropBlock
    深度神經網絡在具備大量參數、使用大量正則化和噪聲時效果很好,如權重衰減和 dropout [1]。儘管 dropout 的首次成功與卷積網絡相關,但近期的卷積架構很少使用 dropout [3–10]。
  • Dropout VS BN: 別在你的網絡中使用Dropout
    作者&編輯:李中梁前言Dropout是神經網絡中防止模型過擬合的重要正則化方式,而近來的網絡結構中卻少有見到Dropout的身影,我們真的不需要
  • AI入門:卷積神經網絡
    講到AI不得不講深度學習,而講到深度學習,又不能不講卷積神經網絡。如果把深度學習比作中國的網際網路界,那捲積神經網絡和循環神經網絡就是騰訊和阿里級別的地位。今天我們主要討論的卷積神經網絡,到底卷積神經網絡能解決什麼問題,它的結構是怎樣的?是怎麼學習的?應用在哪些具體的產品上?本文將為大家一一解答。
  • 10分鐘看懂全卷積神經網絡( FCN ):語義分割深度模型先驅
    這項技術在醫學上也同樣作用巨大,我們可以識別病灶並將其與正常組織分割,大腦神經系統內我們可以分離出同一組功能的神經結構,這些如何依賴人工去完成,所需的時間至少為數小時,而交給機器,那麼數秒鐘即可完成。2010年至今,神經網絡模型的崛起和深度學習的發展,主要涉及到幾種模型:
  • 圖解:卷積神經網絡數學原理解析
    介紹過去我們已經知道被稱為緊密連接的神經網絡。這些網絡的神經元被分成若干組,形成連續的層。每一個這樣的神經元都與相鄰層的每一個神經元相連。下圖顯示了這種體系結構的一個示例。圖1. 密集連接的神經網絡結構當我們根據一組有限的人工設計的特徵來解決分類問題時,這種方法很有效。
  • 圖解:卷積神經網絡的數學原理分析
    卷積神經網絡可能是取得巨大成功的最關鍵的基礎。這次,我們將加深對神經網絡如何在CNN上工作的理解。出於建議,本文將包含非常複雜的數學方程式。如果您不習慣線性代數和微分,請不要氣our。我的目標不是讓您記住這些公式,而是讓您直觀地了解下面發生的事情。 在過去,我們知道了稱為緊密連接的神經網絡。這些網絡的神經元被分為幾組以形成連續的層。每個這樣的神經元連接到相鄰層中的每個神經元。
  • 了解卷積神經網絡的原理與基本結構
    受Hubel和Wiesel對貓視覺皮層電生理研究啟發,有人提出卷積神經網絡(CNN),Yann Lecun 最早將CNN用於手寫數字識別並一直保持了其在該問題的霸主地位。近年來卷積神經網絡在多個方向持續發力,在語音識別、人臉識別、通用物體識別、運動分析、自然語言處理甚至腦電波分析方面均有突破。
  • 最全的DNN概述論文:詳解前饋、卷積和循環神經網絡技術
    且該文詳細介紹了每一種網絡的基本構建塊,其包括了基本架構、傳播方式、連接方式、激活函數、反向傳播的應用和各種優化算法的原理。本文不僅介紹了這三種神經網絡的基本原理與概念,同時還用數學表達式正式地定義了這些概念。這是一份十分全面的神經網絡綜述論文,機器之心簡要摘取了部分章節,更詳細和完整的論述請查看原論文。
  • 一文讓你了解卷積神經網絡
    卷積神經網絡(Convolutional Neural Network,CNN)是一種前饋神經網絡,它的人工神經元可以響應一部分覆蓋範圍內的周圍單元,對於大型圖像處理有出色表現。 它包括卷積層(convolutional layer)和池化層(pooling layer)。對比:卷積神經網絡、全連接神經網絡
  • 7大類卷積神經網絡(CNN)創新綜述
    參與:王淑婷、姜悅作者:Asifullah Khan 等深度卷積神經網絡(CNN)是一種特殊類型的神經網絡,在各種競賽基準上表現出了當前最優結果。為此,使用了不同類型的捷徑連接,如零填充、基於投影、dropout 和 1x1 連接等。激活函數是一種決策函數,有助於學習複雜的模式。選擇適當的激活函數可以加速學習過程。卷積特徵圖的激活函數定義為等式(3)。
  • 深度學習元老Yann Lecun詳解卷積神經網絡
    註:卷積神經網絡(Convolutional Neural Network)是一種前饋神經網絡,它的人工神經元可以響應一部分覆蓋範圍內的周圍單元,對於大型圖像處理有出色表現。早在20世紀80年代末,Yann LeCun就作為貝爾實驗室的研究員提出了卷積網絡技術,並展示如何使用它來大幅度提高手寫識別能力。上世紀末本世紀初,當神經網絡失寵時Yann LeCun是少數幾名一直堅持的科學家之一。他於2003年成為紐約大學教授,並從此引領了深度學習的發展,目前任職於Facebook FAIR實驗室。
  • 如何入手卷積神經網絡
    選自medium作者:Tirmidzi Faizal Aflahi參與:韓放、王淑婷卷積神經網絡可以算是深度神經網絡中很流行的網絡了本文從基礎入手,介紹了卷積網絡的基本原理以及相關的其它技術,並利用卷積網絡做了一個簡單項目作為示例參考。想入手 CNN 的朋友不可錯過~首先,我們先看看下面這張照片:
  • 乾貨| Excel圖解卷積神經網絡結構
    隨意地應用神經網絡是一回事,理解它是什麼以及背後的發生機制是另外一回事。今天,我將與你共享我的心得,展示我如何上手卷積神經網絡並最終弄明白了它。我將做一個通盤的展示,從而使你對 CNN 的工作機制有一個深入的了解。
  • Dropout也能自動化了,谷歌Quoc Le等人利用強化學習自動找尋模型專用Dropout
    本文由機器之心報導在機器學習領域裡,Dropout 是一個較為重要的方法,其可以暫時丟棄一部分神經元及其連接,進而防止過擬合,同時指數級、高效地連接不同網絡架構。現代神經網絡常常過參數化,因而需要適當的正則化來避免過擬合現象。Dropout 是一種常見的正則化方法,該方法從網絡的一些中間層中隨機選擇神經元,並將這些神經元的值替換為零。換言之,這些神經元被從當前訓練步中丟棄。近來更多的研究表明,為丟棄的神經元施加某些結構要比隨機均勻丟棄神經元帶來更顯著的性能提升。但在實踐中,dropout 模式為適應不同的應用需要進行調整變化。