深度學習由於超參數的個數比較多,訓練樣本數目相對超參數來說略顯不足,一不小心就容易發生過擬合。從本質上來說,過擬合是因為模型的學習能力太強,除了學習到了樣本空間的共有特性外,還學習到了訓練樣本集上的噪聲。因為這些噪聲的存在,導致了模型的泛化性能下降。在深度學習中如何克服過擬合的問題呢?一般來說有以下4種方法:
1 data augmentation
data augmentation即數據增強,數據增強其實是增加訓練樣本的一種方法。以人臉識別為例,對於人臉識別的數據增強,一般有隨機裁剪,隨機加光照,隨機左右翻轉等。
- 隨機裁剪:比如人臉圖片本身大小是256*256,隨機裁剪每次從256*256的圖像里扣出227*227大小的像素點(像素點的原本位置不一定連續)構成訓練樣本
- 隨機加光照:隨機加光照其實就是對像素點隨機乘以scale或者隨機加bias,這樣其實可以提高模型對於光照條件的魯棒性,使得模型克服外部光照的影響,學習人臉的本質特征
- 隨機左右翻轉:人臉是一個左右接近對稱的結構,但是左右又不完全一樣,通過隨機左右翻轉可以提高樣本的多樣性(那么上下翻轉可以嗎?當然不可以了!人臉並不具備上下對稱的特性。)
通過類似的手段,無論是圖像處理,還是語音或者自然語言處理,我們都能有效地增加樣本數量。更多的訓練樣本意味着模型能夠學到更多的本質特征,具有對於噪聲更好的魯棒性,從而具有更好的泛化性能,能夠有效地避免過擬合。
2 early stopping
early stopping,顧名思義,就是在訓練次數沒有達到預先設定的最大訓練次數時,我們就讓網絡停止訓練。采用early stopping需要我們在訓練集合上划分出一小部分(大概10%~30%吧)作為驗證集,驗證集不參與訓練,可以視為是我們知道結果的測試集。我們通過實時監控模型在驗證集上的表現來(實時監控並不意味着每次迭代都去監控,可以每1000次去觀察一次),一旦模型在驗證集上的表現呈現下降趨勢,我們就停止訓練,因為再訓練下去模型的泛化性能只會更差。
而實際訓練中,我們不可能一直坐在電腦旁觀察驗證集的准確率,更一般的做法是每隔一段時間(比如每1000次迭代)就保存一次模型,然后選擇在驗證集上效果最好的模型作為最終的模型。
3 dropout
dropout技術是hinton大神(https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf )提出來的防止過擬合的方法。原理非常簡單,dropout的作用對象是layer,對於某一層中的每個節點,dropout技術使得該節點以一定的概率p不參與到訓練的過程中(即前向傳導時不參與計算,bp計算時不參與梯度更新),如上圖所示。實驗證明了,dropout的效果非常爆炸,對於模型訓練有非常好的效果。為什么dropout能起到這么大作用呢? 一個原因是通過dropout,節點之間的耦合度降低了,節點對於其他節點不再那么敏感了,這樣就可以促使模型學到更加魯棒的特征;第二個是dropout layer層中的每個節點都沒有得到充分的訓練(因為它們只有一半的出勤率),這樣就避免了對於訓練樣本的過分學習;第三個原因是在測試階段,dropout layer的所有節點都用上了,這樣就起到了ensemble的作用,ensemble能夠有效地克服模型的過擬合。
4 weight penality L1&L2
第四種常用的辦法就是weight decay,weight decay通過L1 norm和L2 norm強制地讓模型學習到比較小的權值。這里說明兩個問題:1 為什么L1和L2 norm能夠學習到比較小的權值? 2 為什么比較小的權值能夠防止過擬合?
對於問題1:
首先看一下L1和L2的定義:
其中C0為未加上懲罰項的代價函數。那么L1和L2形式的代價函數會如何影響w的值呢?
(1) 未增加懲罰項w的更新
(2) L1下的w更新,其中u為學習率
(3) L2下的w更新,其中u為學習率
由上面的(1)(2)(3)可以看出,加上懲罰項之后,w明顯減少得更多。L1是以減法形式影響w,而L2則是以乘法形式影響w,因此L2又稱為weight decay。
對於問題2:
過擬合的本質是什么呢?無非就是對於非本質特征的噪聲過於敏感,把訓練樣本里的噪聲當作了特征,以至於在測試集上的表現非常稀爛。當權值比較小時,當輸入有輕微的改動(噪聲)時,結果所受 到的影響也比較小,所以懲罰項能在一定程度上防止過擬合。