深度學習基礎之 Dropout
作 者 | Irfan Danish
翻 譯 | 天字一號、尼古拉斯趙四
審 校 | 鳶尾、唐裡、Pita
編輯:小小挖掘機
在少量訓練資料情況下,深度學習的神經網路模型很容易出現過擬合。
我們知道,將具有不同配置的卷積神經網路模型組合可以減少過擬合,但代價是需要額外的訓練和維護多個模型。
單個模型可以模擬具有大量不同網路體系結構,在訓練期間隨機刪除節點。這稱為"dropout",它提供了一種非常廉價且有效的正則化方法,以減少過擬合併改進各種深度神經網路中的泛化誤差。
在這篇文章中,你會發現使用dropout正則化可以減少過擬合,並能夠改進深度神經網路的泛化性。
閱讀本文後,您將知道:
神經網路中的大權重是複雜網路過擬合訓練資料的一個標誌。
在網路中刪除節點是一種簡單而有效的正則化方法。
使用dropout時,建議建立一個多次訓練和使用權重約束的大型網路。
概述
本教程分為五個部分。它們是:
過擬合問題
隨機丟失節點
如何使用dropout
使用dropout的示例
使用降序正則化的方法
過擬合問題
在相對較小的資料集上訓練大型神經網路可能過擬合訓練資料。
這是模型在訓練資料中學習到了統計噪聲的結果,當新資料(例如測試資料集)評估模型時,會出現效能不佳。由於過擬合,泛化性的錯誤增加。
減少過擬合的一種方法是在同一資料集上訓練所有可能的不同神經網路,並採用對每個模型的預測結果取平均的方法。這在實踐中是不可行的,單可以使用不同模型的小集合進行近似。
無限計算的條件下,對固定的模型進行"規範化"的最佳方法是對引數的所有可能設定的預測進行平均,在給定訓練資料的情況下按概率對每個設定進行加權。
—— Dropout :防止神經網路過擬合的簡單方法
(Link:)
整體近似的一個問題是,它需要多個模型訓練和儲存,這可能是一個挑戰,因為如果模型很大,會需要幾天或幾周來訓練和調整。
隨機丟失節點
Dropout策略是一種近似同時訓練許多不同的卷積神經網路的正則化方法。
在訓練過程中,一些層的輸出被隨機忽略或“丟棄”,這種效果使原本的圖層看起來像具有不同節點數,並且與前一個圖層的連線關係也發生了變化。實際上,在訓練期間對圖層的每次更新都會對設定圖層的不同“檢視”執行。
通過丟棄一個單元,意味著暫時將其從網路中刪除,以及其所有傳入和傳出連線。
—— Dropout :防止神經網路過擬合的簡單方法
Dropout 會使訓練過程變得嘈雜,迫使圖層中的節點對輸入承擔或多或少的責任。
這種概念表明,網路層會共同自適應糾正以前層的錯誤,進而使模型更加健壯。
……節點單元可能會改變,以彌補其他節點單元的錯誤。這可能導致複雜的相互適應。這反過來又會導致過擬合,因為這些相互適應並沒有泛化到看不見的資料。[…]
—— Dropout :防止神經網路過擬合的簡單方法
Dropout模擬來自給定層的稀疏啟用,有趣的是,這反過來又鼓勵網路實際學習稀疏表示作為副作用。因此,它可以用作輸出正則化的替代,以鼓勵自動編碼器模型中的稀疏表示。
我們發現作為退出的副作用,隱藏單元的啟用變得稀疏,即使不存在誘導稀疏的正則化。
—— Dropout :防止神經網路過擬合的簡單方法
因為Dropout的下一層的輸出是隨機取樣的,因此在訓練過程中,它具有減小網路容量或細化網路的效果。因此,當使用Dropout時,可能需要更寬的網路,例如更多的節點。
如何進行Dropout?
隨機失活是在神經網路中每層中實現。
它可以與大多數型別的層一起使用,例如密集完連線層、卷積層和迴圈層(如長短期記憶體網路層)。
隨機失活可以在網路中的任何或這所有的隱藏圖層,以及可見層或輸入層上都可以實現,但它不在輸出層中使用。
術語"dropout"是指在神經網路中丟棄節點單元(隱藏和可見的圖層)。
—— Dropout :防止神經網路過擬合的簡單方法
隨機失活作為引入的一個新的超引數,指定圖層輸出單元被丟棄的概率
或者相反地,指定了圖層輸出所保留單元的概率。這個詳細解釋可能不同論文和程式中有所不同。
一個大家公共使用的值是隱藏層節點的輸出保留的概率為 0.5,可見層輸出保留的概率接近 1.0(如 0.8)。
在最簡單的情況下,每個單元都保留一個獨立於其他單元的固定概率 p,其中 p 可以使用驗證集,也可以簡單地設定為 0.5,這似乎接近於各種網路和任務的最佳值。但是,對於輸入單元,最佳保留概率通常接近 1 而不是 0.5。
—— Dropout :防止神經網路過擬合的簡單方法
隨機失活在訓練過後的測試階段並不使用。
由於隨機失活的使用,網路的權重會比正常的網路權重大。因此在,最終在網路模型權重儲存之前,權重首先根據隨機失活的比例進行了縮放。然後,儲存的網路可以用於正常的測試。
如果在訓練期間一個單元節點的保留概率p ,則該單元的傳出權重在測試時乘以 p。
—— Dropout :防止神經網路過擬合的簡單方法
這種權重的重新縮放也可以在訓練時間進行,在小批次結束時的權重更新之後執行。這有時被稱為"反向dropout",不需要在訓練期間修改權重。Keras 和 PyTorch 深度學習庫都以這種方式實現dropout的。
在測試時,我們通過隨機失活的比例縮減輸出結果。[...]請注意,此過程可以通過在訓練時執行操作並在測試時使輸出保持不變來實現,這通常是在實踐中實現的過程。
— 第109頁, Deep Learning With Python(https://amzn.to/2wVqZDq)
隨機失活在實踐中的效果很好,或許可以取代權重正則化(如權重衰減)和活動正則化(例如表示稀疏性)的需要。
...與其他標準、計算成本低廉的正則器(如權重衰減、濾波器規範約束和稀疏活動正則化)相比,隨機失活更有效。隨機失活也可與其他形式的正則化方法相結合,以便進一步改善模型。
— 第265頁, 深度學習(https://amzn.to/2NJW3gE)
使用隨機失活的示例
本節總結了最近研究論文中使用隨機失活的一些例子,就如何以及在哪裡使用隨機失活提供了建議。
Geoffrey Hinton等人在其2012年的論文中首次引入了"通過防止特徵檢測器共同適應來改善神經網路"的隨機失活,將該方法應用於一系列不同的神經網路,用於不同問題型別。改進的結果,包括手寫數字識別 (MNIST)、照片分類 (CIFAR-10) 和語音識別 (TIMIT)。
我們使用相同的隨機失活率 – 所有隱藏單元的 50% 隨機失活率和可見單元的 20% 隨機失活率
Nitish Srivastava等人在其 2014 年期刊論文中介紹了名為" 隨機失活 :防止神經網路過度擬合的簡單方法",這些論文用於各種計算機視覺、語音識別和文字分類任務,並發現它始終能夠改善每個問題的效能。
我們針對不同域的資料集上的分類問題對神經網路隨機失活進行了訓練。我們發現,與不使用隨機失活的神經網路相比,隨機失活提高了所有資料集的泛化效能。
在計算機視覺問題上,通過網路的各個層,結合最大標準權重約束,使用不同的隨機失活率。
對於網路的不同層(從輸入到卷積層到全連線層),將單元保留為 p = (0.9、 0.75、 0.5、 0.5、 0.5) 的概率應用於網路的所有層。此外,c = 4 的最大規範約束用於所有權重。[...]
文字分類任務使用了更簡單的配置。
我們在輸入層中使用了保留 p = 0.8 的概率,在隱藏層中使用了 0.5 的概率。所有圖層都使用了 c = 4 的最大規範約束。
Alex Krizhevsky等人在其著名的2012年論文《影像分類與深層卷積神經網路》中,利用卷積神經網路和隨機失活取得了(當時)在ImageNet資料集上使用深度卷積神經的圖片分類的最先進的結果。
我們在前兩個全連線的層(模型)中使用隨機失活。在沒有隨機失活的情況下,我們的網路表現出很大的過擬合。使用隨機失活大約使收斂所需的迭代次數翻倍。
George Dahl 等人在 2013 年題為"使用校正的線性單位和隨機失活改進 LVCSR 的深度神經網路"的論文中,使用具有修正線性啟用函式和隨機失活的深層神經網路,實現了(當時)最先進的結果。標準語音識別任務。他們使用貝葉斯優化過程來配置啟用功能的選擇和隨機失活概率。
...貝葉斯優化過程可知,隨機失活對於我們訓練的sigmoid網沒有幫助。一般來說,ReLUs 和隨機失活似乎一起使用效果更好。
使用隨機失活正則化的步驟
本節提供了一些有關在神經網路中使用隨機失活正則的提示。
與所有網路型別一起使用
隨機失活正則化是一種通用方法。它可以與大多數,也許所有型別的神經網路模型一起使用,尤其是最常見的網路型別的多層感知器、卷積神經網路和長期短期記憶迴圈神經網路。
對於 LSTM,最好對輸入和迴圈連線使用不同的失活率。
隨機失活率
隨機失活超引數的預設解釋是在圖層中訓練給定節點的概率,其中 1.0 表示沒有丟棄節點,0.0 表示圖層沒有輸出。
隱藏層中隨機失活的良好值介於 0.5 和 0.8 之間。輸入圖層使用較大的隨機失活率,例如 0.8。
使用更大的網路
較大的網路(更多層或更多節點)更容易使訓練資料過擬合,這是很常見的。
使用隨機失活正則化時,可以使用較大的網路,而過擬合的風險較小。事實上,可能需要一個大型網路(每層更多的節點),因為隨機失活會可能降低網路的容量。
一條好的經驗法則是,在使用隨機失活前,將圖層中的節點數除以建議的隨機失活率,並將其用作新網路中使用隨機失活的節點數。例如,具有 100 個節點且建議的隨機失活率為 0.5 的網路在使用隨機失活時將需要 200 個節點 (100 / 0.5)。
如果 n 是任何層中的隱藏單位數,p 是保留單位的概率 [...] 良好的隨機失活網路應至少具有 n/p 單位。
—— Dropout :防止神經網路過擬合的簡單方法
網格搜尋引數
與其猜測合適的網路dropout 率,不如系統地測試不同的dropout 率。
例如,測試1.0到0.1之間的值,增量為0.1。
這將幫助您發現什麼最適合您的特定模型和資料集,以及模型對輟學率的敏感程度。一個更敏感的模型可能是不穩定的,並可能受益於規模的增加。
使用權重約束
網路權重將隨著層啟用的概率移除而增大。
較大的權重大小可能表示網路不穩定。
為了抵消這種影響,可以施加權重約束,以強制層中所有權重的範數(大小)低於指定值。例如,建議最大範數約束值在3到4之間。
[…]我們可以使用最大範數正則化。這將限制每個隱藏單元的傳入權重向量的範數受常數c的約束。c的典型值範圍為3到4。
—— Dropout :防止神經網路過擬合的簡單方法
這確實引入了一個額外的超引數,可能需要對模型進行優化。
使用較小的資料集
與其他規範化方法一樣,對於訓練資料量有限且模型可能過擬合訓練資料的問題,隨機失活更為有效。
問題在於,如果存在大量的訓練資料,則使用隨機失活可能受益較少。
對於非常大的資料集,正則化方法很少會減少一般性誤差。在這些情況下,使用隨機失活和較大模型的計算成本可能超過正則化的好處。
— 第265頁, 深度學習(https://amzn.to/2NJW3gE)
進一步閱讀
如果你希望更深入,本節將提供有關該主題的更多資源。
書
第7.12節:Dropout,深度學習(https://amzn.to/2NJW3gE)
第4.4.3節:新增Dropout,Python深度學習(https://amzn.to/2wVqZDq)
論文
通過防止特徵檢測器的協同適應來改進神經網路(https://arxiv.org/abs/1207.0580)
Dropout:防止神經網路過度擬合的簡單方法(http://jmlr.org/papers/v15/srivastava14a.html)
使用校正線性單元和Dropout改進LVCSR的深層神經網路(https://ieeexplore.ieee.org/document/6639346/)
作為適應性正規化的Dropout訓練(https://arxiv.org/abs/1307.1493)
帖子
基於keras的深度學習模型中的Dropout正則化(https://machinelearningmastery.com/dropout-regularization-deep-learning-models-keras/)
如何利用lstm網路進行時間序列預測(https://machinelearningmastery.com/use-dropout-lstm-networks-time-series-forecasting/)
文章
Dropout(神經網路),維基百科(https://en.wikipedia.org/wiki/Dropout_(neural_networks))
正則化,cs231n用於視覺識別的卷積神經網路(http://cs231n.github.io/neural-networks-2/#reg)
“Dropout”是怎麼產生的?有“啊哈”的時候嗎?(https://www.reddit.com/r/MachineLearning/comments/4w6tsv/ama_we_are_the_google_brain_team_wed_love_to/d64yyas)
總結
在這篇文章中,你發現了使用Dropout正則化來減少過擬合,並改進深度神經網路的泛化。
具體來說,你學到了:
神經網路中的權值是一個更復雜的網路過擬合訓練資料的跡象。
使用概率剔除網路中的節點是一種簡單有效的正則化方法。
在使用Dropout時,建議使用一個具有更多訓練和使用權重約束的大型網路。
via https://medium.com/towards-artificial-intelligence/an-introduction-to-dropout-for-regularizing-deep-neural-networks-4e0826c10395
- END -
如果看到這裡,說明你喜歡這篇文章,請轉發、點贊。掃描下方二維碼或者微信搜尋「perfect_iscas」,新增好友後即可獲得10套程式設計師全棧課程+1000套PPT和簡歷模板,向我私聊「進群」二字即可進入高質量交流群。
↓掃描二維碼進群↓
喜歡文章,點個在看
相關文章
- 深度學習中的Dropout深度學習
- 深度學習基礎深度學習
- 深度學習--RNN基礎深度學習RNN
- python程式設計基礎:深度學習基礎:繪相簿之matplotlib(1)Python程式設計深度學習
- DL-深度學習基礎深度學習
- 深度學習及pytorch基礎深度學習PyTorch
- 【機器學習基礎】神經網路/深度學習基礎機器學習神經網路深度學習
- opencv學習之基礎OpenCV
- 【機器學習基礎】關於深度學習的Tips機器學習深度學習
- 深度學習機器學習基礎-基本原理深度學習機器學習
- 【Elasticsearch學習】之基礎概念Elasticsearch
- pandas學習之Python基礎Python
- java基礎學習:JavaWeb之JSPJavaWebJS
- java基礎學習:JavaWeb之ServletJavaWebServlet
- python基礎學習之 特徵工程Python特徵工程
- JAVA基礎學習篇之反射Java反射
- Python基礎學習之迴圈Python
- Java學習之基礎語法Java
- 使用 C# 入門深度學習:Pytorch 基礎C#深度學習PyTorch
- Java學習之基礎語法練習Java
- 第一次作業:深度學習基礎深度學習
- 麻省理工深度學習基礎公開課.ppt深度學習
- 動手學深度學習需要這些數學基礎知識深度學習
- 零基礎學習 Python 之字串Python字串
- 大資料學習之Linux基礎大資料Linux
- java基礎學習_io流之FileInputStreamJava
- Flutter學習之認知基礎元件Flutter元件
- JVM學習之JVM基礎知識JVM
- 資源 | Intel釋出AI免費系列課程3部曲:機器學習基礎、深度學習基礎以及TensorFlow基礎IntelAI機器學習深度學習
- 【深度學習基礎-13】非線性迴歸 logistic regression深度學習
- 【深度學習基礎-10】簡單線性迴歸(上)深度學習
- 深度學習基礎-最佳化演算法詳解深度學習演算法
- Pytorch 手寫數字識別 深度學習基礎分享PyTorch深度學習
- Go基礎學習六之併發concurrencyGo
- Python爬蟲之Scrapy學習(基礎篇)Python爬蟲
- 零基礎學習 Python 之閉包Python
- 零基礎學習 Python 之函式Python函式
- 零基礎學習 Python 之檔案Python