过拟合的原因和解决方法
過擬合的原因
1、數據量太小
這個是很容易產生過擬合的一個原因。設想,我們有一組數據很好的吻合3次函數的規律,現在我們局部的拿出了很小一部分數據,用機器學習或者深度學習擬合出來的模型很大的可能性就是一個線性函數,在把這個線性函數用在測試集上,效果可想而知肯定很差了。2、訓練集和驗證集分布不一致
訓練集訓練出一個適合訓練集那樣分布的數據集,當你把模型運用到一個不一樣分布的數據集上,效果肯定大打折扣。這個是顯而易見的。
3、模型復雜度太大
在選擇模型算法的時候,首先就選定了一個復雜度很高的模型,然后數據的規律是很簡單的,復雜的模型反而就不適用了。
4、數據質量很差
數據還有很多噪聲,模型在學習的時候,肯定也會把噪聲規律學習到,從而減小了具有一般性的規律。這個時候模型用來預測肯定效果也不好。
5、過度訓練
這個是同第4個是相聯系的,只要訓練時間足夠長,那么模型肯定就會吧一些噪聲隱含的規律學習到,這個時候降低模型的性能是顯而易見的。
過擬合的解決方法
針對過擬合的原因我們可以有針對性的來使用一些方法和技巧來減少過擬合。
1、模型層面
這里主要是減小模型的復雜度,主要是從模型包含的參數個數和參數值。
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)
2、數據層面
a、保證數據集分布一致性
在切分數據集的時候要保證分布一致性。可以使用sklearn包中,model_selection相關train_text_split來實現數據集切割后分布的一致性。
b、增加數據集的規模
最好的是人工標注高質量的數據,但是成本非常高;可以采用一定的數據增強策略,來實現數據集的擴充。注意的是這里可能會引入一定的噪聲,噪聲也會影響模型的性能的,要注意利弊的取舍。另外CV和NLP的數據增強是不一樣的,NLP數據增強更難。
3、訓練層面
這個訓練就要看經驗了,模型需要到達什么樣的一個基線標準。然后參考這個標準對模型實施early-stopping。神經網絡的訓練過程中我們會初始化一組較小的權值參數,隨著模型的訓練,這些權值也變得越來越大了。為了減小過擬合的影響,就有可能需要早停止了。我本人沒有使用過early-stopping,一般都是設置10個epoch然后看效果來考慮時候增加epochs的次數。
4、其他
集成學習——也就是一個均值的思想,通過集成的思想來減弱過擬合的影響。
總結
以上是生活随笔為你收集整理的过拟合的原因和解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络请求分析实战篇(01)—— 爬取am
- 下一篇: 论文翻译《Salient object