1. Dropout
如果模型參數過多,而訓練樣本過少,容易陷入過擬合。過擬合的表現主要是:在訓練數據集上loss比較小,准確率比較高,但是在測試數據上loss比較大,准確率比較低。Dropout可以比較有效地緩解模型的過擬合問題,起到正則化的作用。
Dropout,中文是隨機失活,是一個簡單又機器有效的正則化方法,可以和L1正則化、L2正則化和最大范數約束等方法互為補充。
在訓練過程中,Dropout的實現是讓神經元以超參數 \(p\) 的概率停止工作或者激活被置為0,
在訓練過程中,Dropout會隨機失活,可以被認為是對完整的神經網絡的一些子集進行訓練,每次基於輸入數據只更新子網絡的參數。
在測試過程中,不進行隨機失活,而是將Dropout的參數p乘以輸出。
再來看Dropout論文中涉及到的一些實驗:
上圖是作者在MNIST數據集上進行的Dropout實驗,可以看到Dropout可以破壞隱藏層單元之間的協同適應性,使得在使用Dropout后的神經網絡提取的特征更加明確,增加了模型的泛化能力。
另外可以從神經元之間的關系來解釋Dropout,使用Dropout能夠隨機讓一些神經元臨時不參與計算,這樣的條件下可以減少神經元之間的依賴,權值的更新不再依賴固有關系的隱含節點的共同作用,這樣會迫使網絡去學習更加魯棒的特征。
再看一組實驗,在隱藏層神經元數目不變的情況下,調節參數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)
詳解請看卷積神經網絡學習路線(十一)| Stochastic Depth(隨機深度網絡)
4. DropBlock
一句話概括就是: 在每個feature map上按spatial塊隨機設置失活。
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數據集進行的處理,移除輸入圖片中的一塊連續區域。
此外作者也針對移除塊的大小影響進行了實驗,如下圖:
可以看出,對CIFAR-10數據集來說,隨着patch length的增加,准確率是先升后降。
可見在使用了Cutout后可以提高神經網絡的魯棒性和整體性能,並且這種方法還可以和其他正則化方法配合使用。不過如何選取合適的Patch和數據集有非常強的相關關系,如果想用Cutout進行實驗,需要針對Patch Length做一些實驗。
擴展:最新出的一篇Attentive CutMix中的有一個圖很吸引人。作者知乎親自答: https://zhuanlan.zhihu.com/p/122296738
Attentive CutMix具體做法如下如所示:
將原圖划分為7x7的格子,然后通過一個小的網絡得到熱圖,然后計算49個格子中top N個置信度最高的格子, 從輸入圖片中將這些網格對應的區域裁剪下來,覆蓋到另一張待融合的圖片上,用於訓練神經網絡。Ground Truth 的Label 也會根據融合的圖片的類別和剪切的區域的大小比例而相應修改。至於上圖貓和狗面部的重合應該是一個巧合。
6. DropConnect
DropConnect也是Dropout的衍生品,兩者相似處在於都是對全連接層進行處理(DropConnect只能用於全連接層而Dropout可以用於全連接層和卷積層),兩者主要差別在於:
-
Dropout是對激活的activation進行處理,將一些激活隨機失活,從而讓神經元學到更加獨立的特征,增加了網絡的魯棒性。
-
DropConnect則是對鏈接矩陣的處理,具體對比可以看下圖。
DropConnect訓練的時候和Dropout很相似,是隨機采樣一個矩陣M作為Mask 矩陣(值為0或者1),然后施加到W上。
7. 總結
本文屬於一篇的科普文,其中有很多細節、公式還需要去論文中仔細品讀。
在CS231N課程中,講到Dropout的時候引申出來了非常多的這種類似的思想,其核心就是減少神經元互相的依賴,從而提升模型魯棒性。和Dropout的改進非常相似的有Batch Normalization的一系列改進(這部分啟發自知乎@mileistone):
一個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