【科普】神經網絡中的隨機失活方法


1. Dropout

如果模型參數過多,而訓練樣本過少,容易陷入過擬合。過擬合的表現主要是:在訓練數據集上loss比較小,准確率比較高,但是在測試數據上loss比較大,准確率比較低。Dropout可以比較有效地緩解模型的過擬合問題,起到正則化的作用。

Dropout,中文是隨機失活,是一個簡單又機器有效的正則化方法,可以和L1正則化、L2正則化和最大范數約束等方法互為補充。

在訓練過程中,Dropout的實現是讓神經元以超參數 \(p\) 的概率停止工作或者激活被置為0,

Dropout示意圖

在訓練過程中,Dropout會隨機失活,可以被認為是對完整的神經網絡的一些子集進行訓練,每次基於輸入數據只更新子網絡的參數。

CS231n中的Dropout測試過程解讀

在測試過程中,不進行隨機失活,而是將Dropout的參數p乘以輸出。

再來看Dropout論文中涉及到的一些實驗:

MNist數據集上的實驗

上圖是作者在MNIST數據集上進行的Dropout實驗,可以看到Dropout可以破壞隱藏層單元之間的協同適應性,使得在使用Dropout后的神經網絡提取的特征更加明確,增加了模型的泛化能力。

另外可以從神經元之間的關系來解釋Dropout,使用Dropout能夠隨機讓一些神經元臨時不參與計算,這樣的條件下可以減少神經元之間的依賴,權值的更新不再依賴固有關系的隱含節點的共同作用,這樣會迫使網絡去學習更加魯棒的特征。

再看一組實驗,在隱藏層神經元數目不變的情況下,調節參數p,觀察對訓練集和測試集上效果的影響。

調節P觀察影響

以上實驗是對MNIST數據集進行的實驗,隨着p的增加, 測試誤差先降后升,p在[0.4, 0.8]之間的時候效果最好,通常p默認值會被設為0.5。

還有一組實驗是通過調整數據集判斷Dropout對模型的影響:

調整數據集大小

在數據量比較少的時候,Dropout並沒有給模型帶來性能上的提升,但是在數據量變大的時候,Dropout則會帶來比較明顯的提升,這說明Dropout有一定正則化的作用,可以防止模型過擬合。

在pytorch中對應的Dropout實現如下:

>>> 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可以,卷積層也可以。

2. Spatial Dropout

普通的Dropout會將部分元素失活,而Spatial Dropout則是隨機將部分區域失失活, 這部分參考參考文獻中的【2】,簡單理解就是通道隨機失活。一般很少用普通的Dropout來處理卷積層,這樣效果往往不會很理想,原因可能是卷積層的激活是空間上關聯的,使用Dropout以后信息仍然能夠通過卷積網絡傳輸。而Spatial Dropout直接隨機選取feature map中的channel進行dropout,可以讓channel之間減少互相的依賴關系。

在pytorch中對應Spatial Dropout實現如下:

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)
>>> m = nn.Dropout2d(p=0.2)
>>> input = torch.randn(20, 16, 32, 32)
>>> output = m(input)

此外對3D feature map中也有對應的torch.nn.Dropout3d函數,和以上使用方法除輸入輸出為(N, C, D, H, W)以外,其他均相同。

3. Stochastic Depth

在DenseNet之前提出,隨機將ResNet中的一部分Res Block失活,實際操作和Dropout也很類似。在訓練的過程中任意丟失一些Block, 在測試的過程中使用所有的block。使用這種方式, 在訓練時使用較淺的深度(隨機在resnet的基礎上跳過一些層),在測試時使用較深的深度,較少訓練時間,提高訓練性能,最終在四個數據集上都超過了ResNet原有的性能(cifar-10, cifar-100, SVHN, imageNet)

圖源cs231n課程第7節

詳解請看卷積神經網絡學習路線(十一)| Stochastic Depth(隨機深度網絡)

4. DropBlock

一句話概括就是: 在每個feature map上按spatial塊隨機設置失活。

DropBlock示意圖

Dropout對卷積層的效果沒那么好(見圖(b))。文章認為是由於每個feature map中的點都對應一個感受野范圍,僅僅對單個像素位置進行Dropout並不能降低feature map學習的特征范圍,網絡依然可以通過失活位置相鄰元素學習對應的語義信息。所以作者提出一塊一塊的失活(見圖(c)), 這種操作就是DropBlock.

DropBlock有三個重要的參數:

  • block size控制block的大小
  • γ 控制有多少個channel要進行DropBlock
  • keep prob類別Dropout中的p,以一定的概率失活

經過實驗,可以證明block size控制大小最好在7x7, keep prob在整個訓練過程中從1逐漸衰減到指定閾值比較好。

5. Cutout

Cutout和DropBlock非常相似,也是一個非常簡單的正則化手段,下圖是論文中對CIFAR10數據集進行的處理,移除輸入圖片中的一塊連續區域。

Cutout示意圖

此外作者也針對移除塊的大小影響進行了實驗,如下圖:

Patch length對Accuracy的影響

可以看出,對CIFAR-10數據集來說,隨着patch length的增加,准確率是先升后降。

可見在使用了Cutout后可以提高神經網絡的魯棒性和整體性能,並且這種方法還可以和其他正則化方法配合使用。不過如何選取合適的Patch和數據集有非常強的相關關系,如果想用Cutout進行實驗,需要針對Patch Length做一些實驗。

擴展:最新出的一篇Attentive CutMix中的有一個圖很吸引人。作者知乎親自答: https://zhuanlan.zhihu.com/p/122296738

Attentive CutMix

Attentive CutMix具體做法如下如所示:Attentive CutMix

將原圖划分為7x7的格子,然后通過一個小的網絡得到熱圖,然后計算49個格子中top N個置信度最高的格子, 從輸入圖片中將這些網格對應的區域裁剪下來,覆蓋到另一張待融合的圖片上,用於訓練神經網絡。Ground Truth 的Label 也會根據融合的圖片的類別和剪切的區域的大小比例而相應修改。至於上圖貓和狗面部的重合應該是一個巧合。

6. DropConnect

DropConnect也是Dropout的衍生品,兩者相似處在於都是對全連接層進行處理(DropConnect只能用於全連接層而Dropout可以用於全連接層和卷積層),兩者主要差別在於:

  • Dropout是對激活的activation進行處理,將一些激活隨機失活,從而讓神經元學到更加獨立的特征,增加了網絡的魯棒性。

  • DropConnect則是對鏈接矩陣的處理,具體對比可以看下圖。

Dropout和DropConnect對比

DropConnect訓練的時候和Dropout很相似,是隨機采樣一個矩陣M作為Mask 矩陣(值為0或者1),然后施加到W上。

7. 總結

本文屬於一篇的科普文,其中有很多細節、公式還需要去論文中仔細品讀。

在CS231N課程中,講到Dropout的時候引申出來了非常多的這種類似的思想,其核心就是減少神經元互相的依賴,從而提升模型魯棒性。和Dropout的改進非常相似的有Batch Normalization的一系列改進(這部分啟發自知乎@mileistone):

BN改進

一個feature map的shape為[N, C, H, W]

  • Batch Norm是從NHW三個維度進行歸一化
  • Layer Norm是從CHW三個維度進行歸一化
  • Instance Norm是從HW兩個維度進行歸一化
  • Group Nrom是從\(C_{part}HW\)上做歸一化,將C分為幾個獨立的部分。

與之類似的Drop系列操作(shape=[N, C, H, W]):

  • Dropout是將NCHW中所有的特征進行隨機失活,以像素為單位。
  • Spatial Dropout是隨機將CHW的特征進行隨機失活,以channel為單位。
  • DropBlock是隨機將\(C[HW]_{part}\)的特征進行隨機失活,以HW中一部分為單位。
  • Stochastic Depth是隨機跳過一個Res Block, 單位更大。

8. 參考文獻

【1】 Dropout: A simple way to prevent neural networks from overfitting

【2】 Efficient object localization using convolutional networks.

【3】 Deep networks with stochastic depth.

【4】 DropBlock: A regularization method for convolutional networks.

【5】 Improved regularization of convolutional neural networks with cutout

【6】 Regularization of Neural Network using DropConnect

【7】Attentive CutMix: https://arxiv.org/pdf/2003.13048.pdf

【8】 https://www.zhihu.com/question/300940578


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM