深度学习- Dropout 稀疏化原理解析
搬運原文鏈接:https://zhuanlan.zhihu.com/p/38200980
深度學習中 Dropout 原理解析
文章目錄
- 深度學習中 Dropout 原理解析
- 1. Dropout 簡介
- 1.1 Dropout 出現(xiàn)的原因
- 1.2 什么是 Dropout
- 2. Dropout 工作流程及使用
- 2.1 Dropout 具體工作流程
- 2.2 Dropout 在神經網絡中的使用
- 3. 為什么說 Dropout 可以解決過擬合?
- 4. Dropout 在 Keras 中的源碼分析
- Reference:
1. Dropout 簡介
1.1 Dropout 出現(xiàn)的原因
在機器學習的模型中,如果模型的參數(shù)太多,而訓練樣本又太少,訓練出來的模型很容易產生過擬合的現(xiàn)象。在訓練神經網絡的時候經常會遇到過擬合的問題,過擬合具體表現(xiàn)在:模型在訓練數(shù)據上損失函數(shù)較小,預測準確率較高;但是在測試數(shù)據上損失函數(shù)比較大,預測準確率較低。
過擬合是很多機器學習的通病。如果模型過擬合,那么得到的模型幾乎不能用。為了解決過擬合問題,一般會采用模型集成的方法,即訓練多個模型進行組合。此時,訓練模型費時就成為一個很大的問題,不僅訓練多個模型費時,測試多個模型也是很費時。
綜上所述,訓練深度神經網絡的時候,總是會遇到兩大缺點:
Dropout可以比較有效的緩解過擬合的發(fā)生,在一定程度上達到正則化的效果。
1.2 什么是 Dropout
在2012年,Hinton在其論文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。當一個復雜的前饋神經網絡被訓練在小的數(shù)據集時,容易造成過擬合。為了防止過擬合,可以通過阻止特征檢測器的共同作用來提高神經網絡的性能。
在2012年,Alex、Hinton在其論文《ImageNet Classification with Deep Convolutional Neural Networks》中用到了Dropout算法,用于防止過擬合。并且,這篇論文提到的AlexNet網絡模型引爆了神經網絡應用熱潮,并贏得了2012年圖像識別大賽冠軍,使得CNN成為圖像分類上的核心算法模型。
隨后,又有一些關于Dropout的文章《Dropout:A Simple Way to Prevent Neural Networks from Overfitting》、《Improving Neural Networks with Dropout》、《Dropout as data augmentation》。
從上面的論文中,我們能感受到 Dropout 在深度學習中的重要性。那么,到底什么是 Dropout 呢?
Dropout 可以作為訓練深度神經網絡的一種 trick 供選擇。在每個訓練批次中,通過忽略一半的特征檢測器(讓一半的隱層節(jié)點值為0),可以明顯地減少過擬合現(xiàn)象。這種方式可以減少特征檢測器(隱層節(jié)點)間的相互作用,檢測器相互作用是指某些檢測器依賴其他檢測器才能發(fā)揮作用。
Dropout 說的簡單一點就是:我們在前向傳播的時候,讓某個神經元的激活值以一定的概率p停止工作,這樣可以使模型泛化性更強,因為它不會太依賴某些局部的特征,如圖1所示。
2. Dropout 工作流程及使用
2.1 Dropout 具體工作流程
假設我們要訓練這樣一個神經網絡,如圖2所示。
輸入是 xxx 輸出是 yyy,正常的流程是:我們首先把x通過網絡前向傳播,然后把誤差反向傳播以決定如何更新參數(shù)讓網絡進行學習。使用 Dropout 之后,過程變成如下:
- 恢復被刪掉的神經元(此時被刪除的神經元保持原樣,而沒有被刪除的神經元已經有所更新)
- 從隱藏層神經元中隨機選擇一個一半大小的子集臨時刪除掉(備份被刪除神經元的參數(shù))。
- 對一小批訓練樣本,先前向傳播然后反向傳播損失并根據隨機梯度下降法更新參數(shù) (w,b)(w,b)(w,b) (沒有被刪除的那一部分參數(shù)得到更新,刪除的神經元參數(shù)保持被刪除前的結果)。
不斷重復這一過程。
2.2 Dropout 在神經網絡中的使用
Dropout 的具體工作流程上面已經詳細的介紹過了,但是具體怎么讓某些神經元以一定的概率停止工作(就是被刪除掉)?代碼層面如何實現(xiàn)呢?
下面,我們具體講解一下 Dropout 代碼層面的一些公式推導及代碼實現(xiàn)思路。
無可避免的,在訓練網絡的每個單元都要添加一道概率流程。
對應的公式變化如下:
- 沒有Dropout的網絡計算公式:
zi(l+1)=wi(l+1)yl+bi(l+1)z_i^{(l+1)} = w_i^{(l+1)}y^l + b_i^{(l+1)} zi(l+1)?=wi(l+1)?yl+bi(l+1)?yi(l+1)=f(zi(l+1))y_i^{(l+1)} = f(z_i^{(l+1)}) yi(l+1)?=f(zi(l+1)?) - 采用Dropout的網絡計算公式:
rj(l+1)~Bernoulli(p)r_j^{(l+1)} \sim Bernoulli(p) rj(l+1)?~Bernoulli(p)y~(l)=r(l)?y(l)\widetilde{y}^{(l)} = r^{(l)}*y^{(l)}y?(l)=r(l)?y(l)zi(l+1)=wi(l+1)y~l+bi(l+1)z_i^{(l+1)} = w_i^{(l+1)}\widetilde{y}^l + b_i^{(l+1)}zi(l+1)?=wi(l+1)?y?l+bi(l+1)?yi(l+1)=f(zi(l+1))y_i^{(l+1)} = f(z_i^{(l+1)})yi(l+1)?=f(zi(l+1)?)
上面公式中 Bernoulli (伯努利 0-1 分布)函數(shù)是為了生成概率r向量,也就是隨機生成一個 0、1 的向量。
代碼層面實現(xiàn)讓某個神經元以概率 ppp 停止工作,其實就是讓它的激活函數(shù)值以概率 ppp 變?yōu)?0。比如我們某一層網絡神經元的個數(shù)為 1000 個,其激活函數(shù)輸出值為 y1、y2、y3、......、y1000y_1、y_2、y_3、......、y_{1000}y1?、y2?、y3?、......、y1000?,我們 Dropout 比率選擇 0.4,那么這一層神經元經過 Dropout 后,1000 個神經元中會有大約 400 個的值被置為 0。
注意: 經過上面屏蔽掉某些神經元,使其激活值為0以后,我們還需要對向量 y1……y1000y_1……y_{1000}y1?……y1000? 進行縮放,也就是乘以 1(1?p)\frac1{(1-p)}(1?p)1?。如果你在訓練的時候,經過置 0 后,沒有對 y1……y1000y_1……y_{1000}y1?……y1000? 進行縮放 (rescale) ,那么在測試的時候,就需要對權重進行縮放,操作如下。
預測模型的時候,每一個神經單元的權重參數(shù)要乘以概率 ppp。
測試階段 Dropout 公式:
wtest(l)=pW(l)w^{(l)}_{test} = pW^{(l)}wtest(l)?=pW(l)
3. 為什么說 Dropout 可以解決過擬合?
取平均的作用: 先回到標準的模型即沒有 dropout,我們用相同的訓練數(shù)據去訓練 5 個不同的神經網絡,一般會得到 5 個不同的結果,此時我們可以采用 “5 個結果取均值”或者“多數(shù)取勝的投票策略”去決定最終結果。例如 3 個網絡判斷結果為數(shù)字 9,那么很有可能真正的結果就是數(shù)字 9,其它兩個網絡給出了錯誤結果。這種“綜合起來取平均”的策略通??梢杂行Х乐惯^擬合問題。因為不同的網絡可能產生不同的過擬合,取平均則有可能讓一些“相反的”擬合互相抵消。dropout 掉不同的隱藏神經元就類似在訓練不同的網絡,隨機刪掉一半隱藏神經元導致網絡結構已經不同,整個 dropout 過程就相當于對很多個不同的神經網絡取平均。而不同的網絡產生不同的過擬合,一些互為“反向”的擬合相互抵消就可以達到整體上減少過擬合。
減少神經元之間復雜的共適應關系: 因為 dropout 程序導致兩個神經元不一定每次都在一個 dropout 網絡中出現(xiàn)。這樣權值的更新不再依賴于有固定關系的隱含節(jié)點的共同作用,阻止了某些特征僅僅在其它特定特征下才有效果的情況 。迫使網絡去學習更加魯棒的特征 ,這些特征在其它的神經元的隨機子集中也存在。換句話說假如我們的神經網絡是在做出某種預測,它不應該對一些特定的線索片段太過敏感,即使丟失特定的線索,它也應該可以從眾多其它線索中學習一些共同的特征。從這個角度看 dropout 就有點像 L1,L2 正則,減少權重使得網絡對丟失特定神經元連接的魯棒性提高。
Dropout 類似于性別在生物進化中的角色:物種為了生存往往會傾向于適應這種環(huán)境,環(huán)境突變則會導致物種難以做出及時反應,性別的出現(xiàn)可以繁衍出適應新環(huán)境的變種,有效的阻止過擬合,即避免環(huán)境改變時物種可能面臨的滅絕。
4. Dropout 在 Keras 中的源碼分析
下面,我們來分析 Keras 中 Dropout 實現(xiàn)源碼。
Keras 開源項目 GitHub 地址為:
https://github.com/fchollet/keras/tree/master/keras
其中 Dropout 函數(shù)代碼實現(xiàn)所在的文件地址:
https://github.com/fchollet/keras/blob/master/keras/backend/theano_backend.py
Dropout 實現(xiàn)函數(shù)如下:
我們對 keras 中 Dropout 實現(xiàn)函數(shù)做一些修改,讓 dropout 函數(shù)可以單獨運行。
函數(shù)中,xxx 是本層網絡的激活值。Level 就是 dropout 就是每個神經元要被丟棄的概率。
注意: Keras 中 Dropout 的實現(xiàn),是屏蔽掉某些神經元,使其激活值為 0 以后,對激活值向量 x1……x1000x_1……x_{1000}x1?……x1000? 進行放大,也就是乘以 1(1?p)\frac1{(1-p)}(1?p)1?。
思考:上面我們介紹了兩種方法進行 Dropout 的縮放,那么 Dropout 為什么需要進行縮放呢?
因為我們訓練的時候會隨機的丟棄一些神經元,但是預測的時候就沒辦法隨機丟棄了。如果丟棄一些神經元,這會帶來結果不穩(wěn)定的問題,也就是給定一個測試數(shù)據,有時候輸出 aaa 有時候輸出 bbb,結果不穩(wěn)定,這是實際系統(tǒng)不能接受的,用戶可能認為模型預測不準。那么一種”補償“的方案就是每個神經元的權重都乘以一個 ppp,這樣在“總體上”使得測試數(shù)據和訓練數(shù)據是大致一樣的。比如一個神經元的輸出是 xxx,那么在訓練的時候它有 ppp 的概率參與訓練,(1?p)(1-p)(1?p) 的概率丟棄,那么它輸出的期望是 px+(1?p)0=pxpx+(1-p)0=pxpx+(1?p)0=px。因此測試的時候把這個神經元的權重乘以 ppp 可以得到同樣的期望。
總結:
當前 Dropout 被大量利用于全連接網絡,而且一般認為設置為 0.5 或者 0.3 ,而在卷積網絡隱藏層中由于卷積自身的稀疏化以及稀疏化的 ReLu 函數(shù)的大量使用等原因,Dropout 策略在卷積網絡隱藏層中使用較少??傮w而言,Dropout 是一個超參,需要根據具體的網絡、具體的應用領域進行嘗試。
Reference:
Hinton G E, Srivastava N, Krizhevsky A, et al. Improving neural networks by preventing co-adaptation of feature detectors[J]. arXiv preprint arXiv:1207.0580, 2012.
Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.
Srivastava N, Hinton G, Krizhevsky A, et al. Dropout: A simple way to prevent neural networks from overfitting[J]. The Journal of Machine Learning Research, 2014, 15(1): 1929-1958.
Srivastava N. Improving neural networks with dropout[J]. University of Toronto, 2013, 182.
Bouthillier X, Konda K, Vincent P, et al. Dropout as data augmentation[J]. arXiv preprint arXiv:1506.08700, 2015.
深度學習(二十二)Dropout淺層理解與實現(xiàn)
理解dropout
Dropout解決過擬合問題 - 曉雷的文章 - 知乎
李理:卷積神經網絡之Dropout
Dropout原理,代碼淺析
Deep learning:四十一(Dropout簡單理解)
總結
以上是生活随笔為你收集整理的深度学习- Dropout 稀疏化原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4.9 总结-深度学习第一课《神经网络与
- 下一篇: 0.0 目录-深度学习第二课《改善神经网