天天看點

深度學習中過拟合、欠拟合問題及解決方案

  在進行資料挖掘或者機器學習模型建立的時候,因為在統計學習中,假設資料滿足獨立同分布(i.i.d,independently and identically distributed),即目前已産生的資料可以對未來的資料進行推測與模拟,是以都是使用曆史資料建立模型,即使用已經産生的資料去訓練,然後使用該模型去拟合未來的資料。 在我們機器學習和深度學習的訓練過程中,經常會出現過拟合和欠拟合的現象。訓練一開始,模型通常會欠拟合,是以會對模型進行優化,然而等到訓練到一定程度的時候,就需要解決過拟合的問題了。

一、模型訓練拟合的分類和表現

  如何判斷過拟合呢?我們在訓練過程中會定義訓練誤差,驗證集誤差,測試集誤差(泛化誤差)。訓練誤差總是減少的,而泛化誤差一開始會減少,但到一定程式後不減反而增加,這時候便出現了過拟合的現象。

  如下圖所示,從直覺上了解,欠拟合就是還沒有學習到資料的特征,還有待繼續學習,而過拟合則是學習進行的太徹底,以至于把資料的一些局部特征或者噪聲帶來的特征都給學到了,是以在進行測試的時候泛化誤差也不佳。

深度學習中過拟合、欠拟合問題及解決方案

  從方差和偏差的角度來說,欠拟合就是在訓練集上高方差、高偏差,過拟合也就是訓練集上高方差、低偏差。為了更加生動形象的表示,我們看一些經典的圖:

深度學習中過拟合、欠拟合問題及解決方案

  對比這幾個圖,發現圖一的拟合并沒有把大體的規律給拟合出來,這個就是欠拟合。圖三則是拟合的太細緻了,用的拟合函數太複雜了,在這些資料集上的效果很好,但是換到另外的一個資料集效果肯定可預見的不好。隻有圖二是最好的,把資料的規律拟合出來了,同時在更換資料集後,效果也不會很差。

  仔細想想圖檔三中的模型,拟合函數肯定是一個高次函數,其參數個數肯定肯定比圖二的要多,可以說圖三的拟合函數比圖二的要大,模型更加複雜。這也是過拟合的一個判斷經驗,模型是否太複雜。另外,針對圖三,我們把一些高次變量對應的參數值變小,也就相當于把模型變簡單了。這個角度上看,可以減小參數值,也就是一般模型過拟合,參數值整體比較大。從模型複雜性來講,可以是:

1、模型的參數個數;2、模型的參數值的大小。個數越多,參數值越大,模型就越複雜。

二、欠拟合

1、欠拟合的表現

  針對模型過拟合這個問題,有沒有什麼方法來判定模型是否過拟合呢?其實一般都是依靠模型在訓練集和驗證集上的表現有一個大體的判斷就行了。如果要有一個具體的方法,可以參考機器學中,學習曲線來判斷模型是否過拟合。如下圖:

深度學習中過拟合、欠拟合問題及解決方案

  也就是看訓練集合驗證集随着樣本數量的增加,他們之間的內插補點變化。如果訓練集和測試集的準确率都很低,那麼說明模型欠拟合。

2、欠拟合的解決方案

  • 欠拟合是由于學習不足,可以考慮添加特征,從資料中挖掘出更多的特征,有時候還需要對特征進行變換,使用組合特征和高次特征。
  • 模型簡單也會導緻欠拟合,例如線性模型隻能拟合一次函數的資料。嘗試使用更進階的模型有助于解決欠拟合,如使用SVM,神經網絡等。
  • 正則化參數是用來防止過拟合的,出現欠拟合的情況就要考慮減少正則化參數。

三、過拟合

1、過拟合的定義

  模型在訓練集上的表現很好,但在測試集和新資料上的表現很差。

訓練集上的表現 測試集上的表現 結論
不好 不好 欠拟合
不好 過拟合
适度拟合

2、過拟合的原因

  1)資料量太小

        這個是很容易産生過拟合的一個原因。設想,我們有一組資料很好的吻合3次函數的規律,現在我們局部的拿出了很小一部分資料,用機器學習或者深度學習拟合出來的模型很大的可能性就是一個線性函數,在把這個線性函數用在測試集上,效果可想而知肯定很差了。

  2)訓練集和驗證集分布不一緻

     訓練集訓練出一個适合訓練集那樣分布的資料集,當你把模型運用到一個不一樣分布的資料集上,效果肯定大打折扣。這個是顯而易見的。

  3)模型複雜度太大

    在選擇模型算法的時候,首先就標明了一個複雜度很高的模型,然後資料的規律是很簡單的,複雜的模型反而就不适用了。

  4)資料品質很差

     資料還有很多噪聲,模型在學習的時候,肯定也會把噪聲規律學習到,進而減小了具有一般性的規律。這個時候模型用來預測肯定效果也不好。

  5)過度訓練

     這個是同第4個是相聯系的,隻要訓練時間足夠長,那麼模型肯定就會吧一些噪聲隐含的規律學習到,這個時候降低模型的性能是顯而易見的。

3、解決方案

  1)降低模型複雜度

  處理過拟合的第一步就是降低模型複雜度。為了降低複雜度,我們可以簡單地移除層或者減少神經元的數量使得網絡規模變小。與此同時,計算神經網絡中不同層的輸入和輸出次元也十分重要。雖然移除層的數量或神經網絡的規模并無通用的規定,但如果你的神經網絡發生了過拟合,就嘗試縮小它的規模。

  2)資料集擴增  

  在資料挖掘領域流行着這樣的一句話,“有時候往往擁有更多的資料勝過一個好的模型”。因為我們在使用訓練資料訓練模型,通過這個模型對将來的資料進行拟合,而在這之間又一個假設便是,訓練資料與将來的資料是獨立同分布的。即使用目前的訓練資料來對将來的資料進行估計與模拟,而更多的資料往往估計與模拟地更準确。是以,更多的資料有時候更優秀。但是往往條件有限,如人力物力财力的不足,而不能收集到更多的資料,如在進行分類的任務中,需要對資料進行打标,并且很多情況下都是人工得進行打标,是以一旦需要打标的資料量過多,就會導緻效率低下以及可能出錯的情況。是以,往往在這時候,需要采取一些計算的方式與政策在已有的資料集上進行手腳,以得到更多的資料。

  通俗得講,資料機擴增即需要得到更多的符合要求的資料,即和已有的資料是獨立同分布的,或者近似獨立同分布的。一般有以下方法:

  • 從資料源頭采集更多資料
  • 複制原有資料并加上随機噪聲
  • 重采樣
  • 根據目前資料集估計資料分布參數,使用該分布産生更多資料等

  3)資料增強

  使用資料增強可以生成多幅相似圖像。這可以幫助我們增加資料集規模進而減少過拟合。因為随着資料量的增加,模型無法過拟合所有樣本,是以不得不進行泛化。計算機視覺領域通常的做法有:翻轉、平移、旋轉、縮放、改變亮度、添加噪聲等等

  4)正則化  

  正則化方法是指在進行目标函數或代價函數優化時,在目标函數或代價函數後面加上一個正則項,一般有L1正則與L2正則等。

  L1懲罰項的目的是使權重絕對值最小化。公式如下: 

$L(x, y) \equiv \sum_{i=1}^{n}\left(y_{i}-h_{\theta}\left(x_{i}\right)\right)^{2}+\lambda \sum_{i=1}^{n}\left|\theta_{i}\right|$

  L2懲罰項的目的是使權重的平方最小化。公式如下:

$L(x, y) \equiv \sum_{i=1}^{n}\left(y_{i}-h_{\theta}\left(x_{i}\right)\right)^{2}+\lambda \sum_{i=1}^{n} \theta_{i}^{2}$

  以下表格對兩種正則化方法進行了對比:

L1正則化 L2正則化
1. L1懲罰權重絕對值的總和 1. L2懲罰權重平方和的總和
2. L1生成簡單、可解釋的模型 2. L2正則化能夠學習複雜資料模式
3. L1受極端值影響較小 3. L2受極端值影響較大

  如果資料過于複雜以至于無法準确地模組化,那麼L2是更好的選擇,因為它能夠學習資料中呈現的内在模式。而當資料足夠簡單,可以精确模組化的話,L1更合适。對于我遇到的大多數計算機視覺問題,L2正則化幾乎總是可以給出更好的結果。然而L1不容易受到離群值的影響。是以正确的正則化選項取決于我們想要解決的問題。

  總結

  正則項是為了降低模型的複雜度,進而避免模型區過分拟合訓練資料,包括噪聲與異常點(outliers)。從另一個角度上來講,正則化即是假設模型參數服從先驗機率,即為模型參數添加先驗,隻是不同的正則化方式的先驗分布是不一樣的。這樣就規定了參數的分布,使得模型的複雜度降低(試想一下,限定條件多了,是不是模型的複雜度降低了呢),這樣模型對于噪聲與異常點的抗幹擾性的能力增強,進而提高模型的泛化能力。還有個解釋便是,從貝葉斯學派來看:加了先驗,在資料少的時候,先驗知識可以防止過拟合;從頻率學派來看:正則項限定了參數的取值,進而提高了模型的穩定性,而穩定性強的模型不會過拟合,即控制模型空間。

  另外一個角度,過拟合從直覺上了解便是,在對訓練資料進行拟合時,需要照顧到每個點,進而使得拟合函數波動性非常大,即方差大。在某些小區間裡,函數值的變化性很劇烈,意味着函數在某些小區間裡的導數值的絕對值非常大,由于自變量的值在給定的訓練資料集中的一定的,是以隻有系數足夠大,才能保證導數的絕對值足夠大。如下圖(引用知乎):

深度學習中過拟合、欠拟合問題及解決方案

  另外一個解釋,規則化項的引入,在訓練(最小化cost)的過程中,當某一維的特征所對應的權重過大時,而此時模型的預測和真實資料之間距離很小,通過規則化項就可以使整體的cost取較大的值,進而,在訓練的過程中避免了去選擇那些某一維(或幾維)特征的權重過大的情況,即過分依賴某一維(或幾維)的特征(引用知乎)。

  L2與L1的差別在于,L1正則是拉普拉斯先驗,而L2正則則是高斯先驗。它們都是服從均值為0,協方差為$\frac{1}{\lambda}$。當$\lambda =0$時,即沒有先驗)沒有正則項,則相當于先驗分布具有無窮大的協方差,那麼這個先驗限制則會非常弱,模型為了拟合所有的訓練集資料,參數可以變得任意大進而使得模型不穩定,即方差大而偏差小。$\lambda$越大,标明先驗分布協方差越小,偏差越大,模型越穩定。即,加入正則項是在偏差bias與方差variance之間做平衡tradeoff(來自知乎)。下圖即為L2與L1正則的差別:

深度學習中過拟合、欠拟合問題及解決方案

上圖中的模型是線性回歸,有兩個特征,要優化的參數分别是w1和w2,左圖的正則化是L2,右圖是L1。藍色線就是優化過程中遇到的等高線,一圈代表一個目标函數值,圓心就是樣本觀測值(假設一個樣本),半徑就是誤內插補點,受限條件就是紅色邊界(就是正則化那部分),二者相交處,才是最優參數。可見右邊的最優參數隻可能在坐标軸上,是以就會出現0權重參數,使得模型稀疏。

  其實拉普拉斯分布與高斯分布是數學家從實驗中誤差服從什麼分布研究中得來的。一般直覺上的認識是服從應該服從均值為0的對稱分布,并且誤差大的頻率低,誤差小的頻率高,是以拉普拉斯使用拉普拉斯分布對誤差的分布進行拟合,如下圖:

深度學習中過拟合、欠拟合問題及解決方案

而拉普拉斯在最高點,即自變量為0處不可導,因為不便于計算,于是高斯在這基礎上使用高斯分布對其進行拟合,如下圖:

深度學習中過拟合、欠拟合問題及解決方案

5)dropout

   正則是通過在代價函數後面加上正則項來防止模型過拟合的。而在神經網絡中,有一種方法是通過修改神經網絡本身結構來實作的,其名為Dropout。該方法是在對網絡進行訓練時用一種技巧(trick),對于如下所示的三層人工神經網絡:

深度學習中過拟合、欠拟合問題及解決方案

  對于上圖所示的網絡,在訓練開始時,随機得删除一些(可以設定為一半,也可以為1/3,1/4等)隐藏層神經元,即認為這些神經元不存在,同時保持輸入層與輸出層神經元的個數不變,這樣便得到如下的ANN:

深度學習中過拟合、欠拟合問題及解決方案

  然後按照BP學習算法對ANN中的參數進行學習更新(虛線連接配接的單元不更新,因為認為這些神經元被臨時删除了)。這樣一次疊代更新便完成了。下一次疊代中,同樣随機删除一些神經元,與上次不一樣,做随機選擇。這樣一直進行瑕疵,直至訓練結束。 

  這種技術被證明可以減少很多問題的過拟合,這些問題包括圖像分類、圖像切割、詞嵌入、語義比對等問題。

  6)早停

  對模型進行訓練的過程即是對模型的參數進行學習更新的過程,這個參數學習的過程往往會用到一些疊代方法,如梯度下降(Gradient descent)學習算法。Early stopping便是一種疊代次數截斷的方法來防止過拟合的方法,即在模型對訓練資料集疊代收斂之前停止疊代來防止過拟合。

  Early stopping方法的具體做法是,在每一個Epoch結束時(一個Epoch集為對所有的訓練資料的一輪周遊)計算validation data的accuracy,當accuracy不再提高時,就停止訓練。這種做法很符合直覺感受,因為accurary都不再提高了,在繼續訓練也是無益的,隻會提高訓練的時間。如下圖所示,在幾次疊代後,即使訓練誤差仍然在減少,但測驗誤差已經開始增加了。

深度學習中過拟合、欠拟合問題及解決方案

  那麼該做法的一個重點便是怎樣才認為validation accurary不再提高了呢?并不是說validation accuracy一降下來便認為不再提高了,因為可能經過這個Epoch後,accuracy降低了,但是随後的Epoch又讓accuracy又上去了,是以不能根據一兩次的連續降低就判斷不再提高。一般的做法是,在訓練的過程中,記錄到目前為止最好的validation accuracy,當連續10次Epoch(或者更多次)沒達到最佳accuracy時,則可以認為accuracy不再提高了。此時便可以停止疊代了(Early Stopping)。這種政策也稱為“No-improvement-in-n”,n即Epoch的次數,可以根據實際情況取,如10、20、30……

  7)重新清洗資料

  把明顯異常的資料剔除

  8)使用內建學習方法

  把多個模型內建在一起,降低單個模型的過拟合風險

參考

https://www.cnblogs.com/tsruixi/p/10693101.html

https://www.jianshu.com/p/f8b86af75020

https://blog.csdn.net/husthy/article/details/103883714

https://www.cnblogs.com/LXP-Never/p/13755354.html