深度學習和機器學習中過擬合的判定 原因和解決方法

2021-10-01 23:56:06 字數 3291 閱讀 1155

目錄

一、過擬合的表現以及判定

1、模型過擬合的表現

2、模型過擬合的判定

二、過擬合的原因

三、過擬合的解決方案

1、模型層面

2、資料層面

3、訓練層面

4、其他

最近在做nlp相關任務的時候,訓練神經網路模型的過程中,遇到過模型過擬合的情況,到底怎麼解決過擬合,來提高模型的效能,不是特別的清晰。以前學習機器學習的時候,也講到了模型的過擬合,對裡面怎麼來解決過擬合的方法也有一些模糊的印象,例如正則化、增加資料和整合學習等,對於原理和具體的步驟等細節也記不清楚了。因此很有必要對這一專題做乙個總結,加深印象和記憶。當然網上也是有一大堆的相關部落格,我寫這篇部落格的目的不求做出創新,只求做到全面,對自己以後跳槽有利。

過擬合(over-fitting),機器學習模型或者是深度學習模型在訓練樣本中表現得過於優越,導致在驗證資料集以及測試資料集中表現不佳。也就是泛化誤差比較大,泛化能力差。從方差和偏差的角度來說,過擬合也就是訓練集上高方差,低偏差。為了更加生動形象的表示,我們看一些經典的圖:

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

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

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

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

也就是看訓練集合驗證集隨著樣本數量的增加,他們之間的差值變化。如果訓練集和測試集的準確率都很低,那麼說明模型欠擬合;如果訓練集的準確率接近於1而驗證集還相差甚遠,說明模型典型的過擬合。當然具體的差多少這個沒有明確的定義,個人看法是,如果訓練集95%+,而驗證集才60-80直接感覺都是有點過擬合的。

1、資料量太小

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

2、訓練集和驗證集分布不一致

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

3、模型複雜度太大

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

4、資料質量很差

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

5、過度訓練

這個是同第4個是相聯絡的,只要訓練時間足夠長,那麼模型肯定就會吧一些雜訊隱含的規律學習到,這個時候降低模型的效能是顯而易見的。

針對過擬合的原因我們可以有針對性的來使用一些方法和技巧來減少過擬合。

這裡主要是減小模型的複雜度,主要是從模型包含的引數個數和引數值。

a、正則化

這裡包含l1和l2範數,具體的區別去看相關的理論去了解,這裡一般使用l1範數,使得模型擬合的引數大部分都為0,這樣就可以說從引數值和引數個數的角度減少了模型的複雜度,從而降低了過擬合。

b、權值共享

這個方法常用於深度學習中,一般在網路中,某些層可能會使用同樣的引數,那麼這樣就在引數個數上減小了——模型複雜度也隨之降低

c、dropout

這個方法也很常見,在神經網路中以一定的概率使得神經元不工作。這種方法的本質上是沒乙個step中,使用的模型都是不一樣的,並且模型引數在一定程度上也是減少了。

torch.nn.dropout(0.5)
在pytorch中,這裡的0.5的意思就是神經元不保留的概率,這個與tf框架不同。

d、batch normalization

這個批歸一化處理層,是乙個作用非常大的。我自己在寫網路中也嘗試在使用這個bn層,其作用是:使得每一層的資料分布不變,做歸一化處理,加快了模型的收斂速度,避免梯度消失、提高準確率。反正就是優點很多!

e、權值衰減

權值衰減——weight_decay,簡單的理解就是乘在正則項的前面的係數,目的是為了使得權值衰減到很小的值,接近如0。一般在深度學習好中,pytorch的提供的優化器都可以設定的:

optimizer = optim.sgd(model.parameters(), lr = 0.01, momentum=0.9,weight_decay=1e-5)
a、保證資料集分布一致性

在切分資料集的時候要保證分布一致性。可以使用sklearn包中,model_selection相關train_text_split來實現資料集切割後分布的一致性。

b、增加資料集的規模

最好的是人工標註高質量的資料,但是成本非常高;可以採用一定的資料增強策略,來實現資料集的擴充。注意的是這裡可能會引入一定的雜訊,雜訊也會影響模型的效能的,要注意利弊的取捨。另外cv和nlp的資料增強是不一樣的,nlp資料增強更難。

這個訓練就要看經驗了,模型需要到達什麼樣的乙個基線標準。然後參考這個標準對模型實施early-stopping。神經網路的訓練過程中我們會初始化一組較小的權值引數,隨著模型的訓練,這些權值也變得越來越大了。為了減小過擬合的影響,就有可能需要早停止了。我本人沒有使用過early-stopping,一般都是設定10個epoch然後看效果來考慮時候增加epochs的次數。

整合學習——也就是乙個均值的思想,通過整合的思想來減弱過擬合的影響。

參考文章:

學習曲線判斷模型狀態:欠擬合 or 過擬合

過擬合(定義、出現的原因4種、解決方案7種)

機器學習中常見的過擬合解決方法

pytorch中的l2和l1正則化,自定義優化器設定等操作

pytorch--dropout筆記

深度學習中的過擬合

這篇 章主要是介紹 下神經 絡中的過擬合問題,並總結 下 前都有哪些有效的 法來緩解過擬合問題。過擬合表現 在深度學習任務中,過擬合最直觀的表現就是,模型在測試集的表現遠遠差於訓練集,也就是模型的泛化效能太差。直觀分析為什麼在測試集上的表現差於訓練集?最簡單的回答,因為模型就是在訓練集上訓練出來的,...

深度學習過擬合

過擬合是深度學習中十分常見的問題,乙個模型如果過擬合了就無法很好的適用於實際的業務場景中。防止過擬合的方法 1 引入正則化 2 dropout 3 提前終止訓練 4 增加樣本量 下面一一作出詳細的介紹 模型過擬合極有可能是模型過於複雜造成的。模型在訓練的時候,在對損失函式進行最小化的同時,也需要對引...

深度學習中過擬合與防止過擬合的方法

1.什麼是過擬合?過擬合 overfitting 是指在模型引數擬合過程中的問題,由於訓練資料報含抽樣誤差,訓練時,複雜的模型將抽樣誤差也考慮在內,將抽樣誤差也進行了很好的擬合。具體表現就是最終模型在訓練集上效果好 在測試集上效果差。模型泛化能力弱。2.過擬合產生的原因?1 在對模型進行訓練時,有可...