神经网络中的 Dropout 以及变体方法
Dropout 的學(xué)習(xí)筆記,主要參考文章:
12種主要的Dropout方法:如何應(yīng)用于DNNs,CNNs,RNNs中的數(shù)學(xué)和可視化解釋
【科普】神經(jīng)網(wǎng)絡(luò)中的隨機(jī)失活方法
1. 簡介
深度學(xué)習(xí)訓(xùn)練模型的一個主要挑戰(zhàn)是協(xié)同適應(yīng),這意味著神經(jīng)元之間是相互依賴的,也就是相對于輸入它們還不夠獨立,而且經(jīng)常會有一些神經(jīng)元具有更重要的預(yù)測能力,這可能導(dǎo)致模型會過度依賴個別的神經(jīng)元的輸出。
但這種情況應(yīng)該要避免,權(quán)重必須具有一定的分布,從而防止過擬合。通常可以采用正則化的方法來避免過擬合,正則化能調(diào)節(jié)某些神經(jīng)元的協(xié)同適應(yīng)和高預(yù)測能力。最常用的一種正則化方法就是 Dropout。
Dropout,中文是隨機(jī)失活,是一個簡單又機(jī)器有效的正則化方法,可以和L1正則化、L2正則化和最大范數(shù)約束等方法互為補充。
接下來將介紹不同的 Dropout 方法,并且在不同深度網(wǎng)絡(luò)結(jié)構(gòu)上也會有區(qū)別,比如在 CNN,還是在 RNN 上:
-
標(biāo)準(zhǔn)的 Dropout 方法
-
標(biāo)準(zhǔn) Dropout 的變體
-
用在CNNs上的dropout方法:標(biāo)準(zhǔn)的 Dropout 對卷積層的效果并沒有很好,原因是因為每個特征圖的點都對應(yīng)一個感受野范圍,只是隨機(jī)丟棄某個像素不能降低特征圖學(xué)習(xí)的特征范圍,網(wǎng)絡(luò)還可以通過失活位置相鄰像素學(xué)習(xí)對應(yīng)的語義信息;
-
用在RNNs上的dropout方法
-
其他的dropout應(yīng)用(蒙特卡洛和壓縮)
2. 標(biāo)準(zhǔn)的 Dropout 方法
最常用的 dropout 方法是 Hinton 等人在 2012 年推出的Standard dropout。通常簡單地稱為“Dropout”,由于顯而易見的原因,在本文中我們將稱之為標(biāo)準(zhǔn)的Dropout。
標(biāo)準(zhǔn)的 Dropout 方法主要應(yīng)用在訓(xùn)練階段,避免該階段的過擬合問題,而且通常設(shè)置一個概率 p,表示每次迭代中,每個神經(jīng)元被去掉的概率,如上圖所示,設(shè)置的 p=0.5。在 Hinton 論文中建議輸入層的 p=0.2,隱藏層的 p=0.5,然后輸出層是不需要采用 Dropout,畢竟需要的就是輸出層的結(jié)果。
數(shù)學(xué)上表示如上所示,每個神經(jīng)元丟棄概率遵循概率為 p 的伯努利分布,所以用一個 mask 對神經(jīng)元向量進(jìn)行了一個元素級操作,其中每個元素都是遵循伯努利分布的隨機(jī)變量。
在訓(xùn)練過程中,Dropout會隨機(jī)失活,可以被認(rèn)為是對完整的神經(jīng)網(wǎng)絡(luò)的一些子集進(jìn)行訓(xùn)練,每次基于輸入數(shù)據(jù)只更新子網(wǎng)絡(luò)的參數(shù)。
在測試階段則是沒有采用 Dropout。所有的神經(jīng)元都是活躍的。為了補償與訓(xùn)練階段相比較的額外信息,用出現(xiàn)的概率來平衡加權(quán)權(quán)重。所以神經(jīng)元沒有被忽略的概率,是“1 - p”。
在論文中,作者通過實驗表明了 Dropout 的有效性原因是在兩方面:
Dropout 可以破壞神經(jīng)元之間的協(xié)同適應(yīng)性,使得在使用Dropout后的神經(jīng)網(wǎng)絡(luò)提取的特征更加明確,增加了模型的泛化能力;
從神經(jīng)元之間的關(guān)系來說,則是 Dropout 能夠隨機(jī)讓一些神經(jīng)元臨時不參與計算,這樣的條件下可以減少神經(jīng)元之間的依賴,權(quán)值的更新不再依賴固有關(guān)系的隱含節(jié)點的共同作用,這樣會迫使網(wǎng)絡(luò)去學(xué)習(xí)更加魯棒的特征。
在pytorch中對應(yīng)的Dropout實現(xiàn)如下:
>>> m = nn.Dropout(p=0.2) >>> input = torch.randn(20, 16) >>> output = m(input)torch.nn.Dropout(p=0.5, inplace=False)
-
p – probability of an element to be zeroed. Default: 0.5
-
inplace – If set to True, will do this operation in-place. Default: False
對input沒有任何要求,也就是說Linear可以,卷積層也可以。
3. Dropout 變體
3.1 DropConnect
L. Wan等人介紹的DropConnect沒有直接在神經(jīng)元上應(yīng)用dropout,而是應(yīng)用在連接這些神經(jīng)元的權(quán)重和偏置上。
DropConnect 和 Dropout 的區(qū)別主要在于使用的掩碼是用在權(quán)重和偏置,而非神經(jīng)元本身,此外就是 Dropout 可以用在卷積層和全連接層上,DropConnect 只能用在全連接層,其數(shù)學(xué)表示如下:
測試階段也是可以采用和 Dropout 相同的邏輯,即乘以出現(xiàn)的概率,不過在DropConnect 論文中采用的是一個有趣的隨機(jī)方法,使用 DropConnect的高斯近似。然后由從這個高斯表示中隨機(jī)采樣樣本。
3.2 Standout
L. J. Ba和B. Frey介紹的Standout是一個標(biāo)準(zhǔn)的Dropout方法,基于一個Bernoulli mask(這是根據(jù)它們遵循的分布來命名這些mask,這樣會更簡單)。不同點在于神經(jīng)元被遺漏的概率 p 在這一層中并不恒定。根據(jù)權(quán)重的值,它是自適應(yīng)的。
這里可以采用任何一個 g 激活函數(shù),或者是一個單獨的神經(jīng)網(wǎng)絡(luò)。類似地,對于 Ws ,也可以是一個 W 的函數(shù),然后在測試階段再根據(jù)存在的可能性進(jìn)行平衡。
一個例子如下:
如下圖所示,權(quán)重越大,神經(jīng)元被丟棄的概率也越大,這可以一定程度上限制某些神經(jīng)元具有的高預(yù)測能力。
3.3 Gaussian Dropout
舉幾個例子,Fast Dropout, 變分Dropout或Concrete Dropout是從貝葉斯角度解釋Dropout的方法。具體地說,我們沒有使用伯努利mask,而是使用了一個mask,它的元素是遵循高斯分布的隨機(jī)變量**(**正態(tài)分布)。
如上圖所示,采用高斯分布來進(jìn)行 dropout,實際上跟之前使用伯努利分布的區(qū)別在于它并不會改變神經(jīng)元的協(xié)同適應(yīng)與預(yù)測能力這兩種能力和過擬合的相關(guān)性,改變的主要是訓(xùn)練階段所需要的執(zhí)行時間。
邏輯上來說,對于在訓(xùn)練前向階段隨機(jī)丟棄部分神經(jīng)元,它們在反向傳播的時候就不會進(jìn)行更新,相當(dāng)于不存在了,所以訓(xùn)練階段是”放慢“了,而采用 Gaussian Dropout 方法,在每次迭代中,所有神經(jīng)元都會采用,也就不會減速了。
數(shù)學(xué)上的表示如上所示,有一個高斯mask的乘法(例如以1為中心的伯努利定律的標(biāo)準(zhǔn)差p(1-p))。通過在每次迭代中保持所有的神經(jīng)元都是活躍的,從而隨機(jī)地對其預(yù)測能力進(jìn)行加權(quán),從而模擬了dropout。這種方法的另一個實際優(yōu)勢集中在測試階段,與沒有dropout的模型相比,不需要進(jìn)行任何修改。
3.4 Pooling Dropout
圖像和特征圖的問題是像素非常依賴于它們的鄰居。簡單地說,在一張貓的圖片上,如果你取一個與它的外表相對應(yīng)的像素,那么所有鄰近的像素都將與同樣的外表相對應(yīng)。兩者幾乎沒有區(qū)別。
這就是標(biāo)準(zhǔn) Dropout 方法的限制,實際上如果隨機(jī)丟棄圖像上的像素,那么幾乎沒有信息被刪除,丟棄的像素幾乎和其鄰居相同,也就是說防止過擬合性能并不好,反而增加了額外的計算時間。
Max-Pooling Dropout是H. Wu和X. Gu提出的一種用于CNNs的Dropout方法。它在執(zhí)行池化操作之前,直接將伯努利mask應(yīng)用到最大池化層的內(nèi)核上。直觀地說,這允許對具有高激活的pooling結(jié)果最小化。這是一個限制某些神經(jīng)元的高預(yù)測能力的很好的觀點。在測試階段,你可以根據(jù)出現(xiàn)的概率來確定前面方法的權(quán)重。
3.5 Spatial Dropout
在 CNN 中可以利用池化層,但也可以采用 J. Tompson等人提出的Spatial Dropout方法。他們提出用經(jīng)典的dropout方法來解決這個問題,因為相鄰像素高度相關(guān),其思路是相比在單個像素上進(jìn)行 Dropout 的操作,可以考慮在特征圖上進(jìn)行 Dropout,如下所示,比如還是以貓作為例子,可以從圖像中移除紅色通道,并強(qiáng)迫它總結(jié)圖像中的藍(lán)色和綠色通道,然后在下一次迭代中隨機(jī)防止其他的特征圖。
一般很少用普通的Dropout來處理卷積層,這樣效果往往不會很理想,原因可能是卷積層的激活是空間上關(guān)聯(lián)的,使用Dropout以后信息仍然能夠通過卷積網(wǎng)絡(luò)傳輸。而 Spatial Dropout 直接隨機(jī)選取 feature map 中的 channel 進(jìn)行 dropout,可以讓 channel 之間減少互相的依賴關(guān)系。
在訓(xùn)練階段,對每個feature map應(yīng)用Bernoulli mask,其丟棄概率為p。然后在測試階段,沒有dropout,只有一個概率為1-p的加權(quán)。
在pytorch中對應(yīng)Spatial Dropout實現(xiàn)如下:
torch.nn.Dropout2d(*p=0.5*, *inplace=False*)
-
p (python:float*,* optional) – probability of an element to be zero-ed.
-
inplace (bool*,* optional) – If set to True, will do this operation in-place
對輸入輸出有一定要求:
-
input shape: (N, C, H, W)
-
output shape: (N, C, H, W)
此外對3D feature map中也有對應(yīng)的 torch.nn.Dropout3d 函數(shù),和以上使用方法除輸入輸出為(N, C, D, H, W)以外,其他均相同。
3.6 Cutout
T. DeVries和G. W. Taylor提出的Cutout方法選擇的是另一個做法,在不同區(qū)域中應(yīng)用伯努利 mask,如下所示:
還是以之前的貓圖像為例:該方法可以通過對圖像的隱藏區(qū)域進(jìn)行泛化從而限制過擬合。我們最后看到的是貓的頭丟棄掉的畫面。這迫使CNN了解到可以描述貓的不太明顯的屬性。
論文中的實驗結(jié)果表明在使用了Cutout后可以提高神經(jīng)網(wǎng)絡(luò)的魯棒性和整體性能,并且這種方法還可以和其他正則化方法配合使用。不過如何選取合適的Patch和數(shù)據(jù)集有非常強(qiáng)的相關(guān)關(guān)系,如果想用Cutout進(jìn)行實驗,需要針對Patch Length做一些實驗。
3.7 Max-Drop
S. Park和N. Kwak提出的Max-Drop方法是Pooling Dropout 和高斯 Dropout 的混合,dropout是在最大池化層上執(zhí)行的,但使用的是貝葉斯方法。
在他們的論文中,他們表明這種方法給出的結(jié)果與 Spatial Dropout一樣有效。除此之外,在每次迭代中,所有的神經(jīng)元都保持活躍,這限制了訓(xùn)練階段的減速。這些結(jié)果都是用μ = 0.02和σ2 = 0.05的數(shù)據(jù)得到的。
3.8 RNNDrop
上述的方法主要是應(yīng)用在 DNNs 和 CNNs 中,但RNN 也是常用的深度模型結(jié)構(gòu),所以也有一些學(xué)者研究如何在 RNN 上采用 Dropout,不過在 RNN 上應(yīng)用 dropout 是危險的,原因在于 RNN 的目的是長期保存事件的記憶。但傳統(tǒng)的dropout方法效率不高,因為它們會產(chǎn)生噪音,阻止這些模型長期保存記憶。下面這些方法可以長期保存記憶。
T. Moon等人提出的RNNDrop是最簡單的方法。一個伯努利mask只應(yīng)用于隱藏的單元格狀態(tài)。但是這個掩碼從一個序列到另一個序列保持不變。這稱為dropout的逐序列采樣。它只是意味著在每個迭代中我們創(chuàng)建一個隨機(jī)掩碼。然后從一個序列到另一個序列,這個掩碼保持不變。所以被丟棄的元素一直被丟棄而留下來的元素一直留著。所有的序列都是這樣。
3.9 循環(huán) Droput
S. Semeniuta等人提出的循環(huán)Dropout是一個有趣的變體。單元格狀態(tài)保持不變。dropout只應(yīng)用于更新單元格狀態(tài)的部分。所以在每次迭代中,伯努利的mask使一些元素不再對長期記憶有貢獻(xiàn)。但是記憶并沒有改變。
3.10 變分 RNN dropout
由Y. Gal和Z. Ghahramani介紹的RNN Dropout是在internal gates前的基于序列的Dropout的應(yīng)用。這將導(dǎo)致LSTM在不同的點進(jìn)行dropout,這個方法簡單而有效。
3.11 Monte Carlo Dropout
Dropout方法也可以提供一個模型不確定性的指標(biāo)。這是因為對于相同的輸入,經(jīng)歷了dropout的模型在每次迭代中會有一個不同的架構(gòu)。這將導(dǎo)致輸出中的方差。
如果網(wǎng)絡(luò)是相當(dāng)廣義的,并且協(xié)同適應(yīng)是有限的,那么預(yù)測是在整個模型中分布的。這將導(dǎo)致在每次迭代中使用相同的輸入時輸出的方差降低。
研究這個方差可以給出一個可以分配給模型的置信度的概念。這可以從Y. Gal和Z. Ghahramani的方法中看出。
3.12 模型壓縮
K. Neklyudov等人提出了利用變分dropout來剪枝DNNs和CNNs的方法,即對模型進(jìn)行壓縮。直觀上說是因為通過隨機(jī)應(yīng)用 dropouts,可以看到給定神經(jīng)元對預(yù)測是否有效,根據(jù)這個觀察結(jié)果,就可以通過減少參數(shù)的數(shù)量,即對預(yù)測無效的神經(jīng)元是可以刪除的,從而實現(xiàn)模型壓縮。
3.13 Stochastic Depth
這是一種在 DenseNet 前提出的,用在 ResNet 中,隨機(jī)將一部分 Res Block 失活,實際操作和 Dropout 類似,也就是訓(xùn)練過程隨機(jī)丟失一部分 Res Block,但是測試階段是所有 ResBlock 都采用。這種方法在訓(xùn)練的時候可以采用較淺的深度(隨機(jī)丟失 ResBlock,相當(dāng)于隨機(jī)跳過一些層),測試則使用了較深的深度,這可以減少訓(xùn)練時間,提高訓(xùn)練性能。
詳細(xì)可以參考文章:卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)路線(十一)| Stochastic Depth(隨機(jī)深度網(wǎng)絡(luò))
3.14 DropBlock
這個方法和 Cutout 比較相似,其思路就是在每個feature map上按spatial塊隨機(jī)設(shè)置失活。
DropBlock有三個重要的參數(shù):
-
block size控制block的大小
-
γ 控制有多少個channel要進(jìn)行DropBlock
-
keep prob類別Dropout中的p,以一定的概率失活
經(jīng)過實驗,可以證明block size控制大小最好在7x7, keep prob在整個訓(xùn)練過程中從1逐漸衰減到指定閾值比較好。
推薦閱讀的學(xué)習(xí)筆記
11.神經(jīng)網(wǎng)絡(luò)不收斂怎么辦?看看是不是這些原因
AI 算法面試資料推薦
12. 7 個有用的 PyTorch 技巧
公眾號后臺回復(fù)這些關(guān)鍵詞,可以獲得相應(yīng)的資料:
回復(fù)”入門書籍“,獲取機(jī)器學(xué)習(xí)入門資源,包括書籍、視頻以及 python 入門書籍;
回復(fù)”數(shù)據(jù)結(jié)構(gòu)“,獲取數(shù)據(jù)結(jié)構(gòu)算法書籍和 leetcode 題解;
回復(fù)”多標(biāo)簽“,獲取使用 keras 實現(xiàn)的多標(biāo)簽圖像分類代碼和數(shù)據(jù)集
回復(fù)“pytorch 遷移學(xué)習(xí)”,獲取 pytorch 的遷移學(xué)習(xí)教程代碼
回復(fù)“py_ml",獲取初學(xué)者的機(jī)器學(xué)習(xí)入門教程代碼和數(shù)據(jù)集
歡迎評論,指正文章中的錯誤,謝謝!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的神经网络中的 Dropout 以及变体方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑键盘中英文按键有哪些?有什么作用?
- 下一篇: 视频格式介绍