1. 程式人生 > >大白話給你說清楚什麼是過擬合、欠擬合以及對應措施

大白話給你說清楚什麼是過擬合、欠擬合以及對應措施

開始我是很難弄懂什麼是過擬合,什麼是欠擬合以及造成兩者的各自原因以及相應的解決辦法,學習了一段時間機器學習和深度學習後,分享下自己的觀點,方便初學者能很好很形象地理解上面的問題,同時如果有誤的地方希望大家在評論區留下你們的磚頭,我會進行糾正

無論在機器學習還是深度學習建模當中都可能會遇到兩種最常見結果,一種叫過擬合(over-fitting )另外一種叫欠擬合(under-fitting)。

首先談談什麼是過擬合呢?什麼又是欠擬合呢?網上很直接的圖片理解如下:


所謂過擬合(over-fitting)其實就是所建的機器學習模型或者是深度學習模型在訓練樣本中表現得過於優越,導致在驗證資料集以及測試資料集中表現不佳。打個比喻就是當我需要建立好一個模型之後,比如是識別一隻狗狗的模型,我需要對這個模型進行訓練。恰好,我訓練樣本中的所有訓練圖片都是二哈,那麼經過多次迭代訓練之後,模型訓練好了,並且在訓練集中表現得很好。基本上二哈身上的所有特點都涵括進去,那麼問題來了!假如我的測試樣本是一隻金毛呢?將一隻金毛的測試樣本放進這個識別狗狗的模型中,很有可能模型最後輸出的結果就是金毛不是一條狗(因為這個模型基本上是按照二哈的特徵去打造的)。所以這樣就造成了模型過擬合,雖然在訓練集上表現得很好,但是在測試集中表現得恰好相反,在效能的角度上講就是協方差過大(variance is large),同樣在測試集上的損失函式(cost function)會表現得很大。

所謂欠擬合呢(under-fitting)?相對過擬合欠擬合還是比較容易理解。還是拿剛才的模型來說,可能二哈被提取的特徵比較少,導致訓練出來的模型不能很好地匹配,表現得很差,甚至二哈都無法識別。

那麼問題來了,我們需要怎麼去解決過擬合和欠擬合的問題呢??

過擬合:

首先我們從上面我們可以知道,造成過擬合的原因有可以歸結為:引數過多。那麼我們需要做的事情就是減少引數,這裡有兩種辦法:

1、回想下我們的模型,假如我們採用梯度下降演算法將模型中的損失函式不斷減少,那麼最終我們會在一定範圍內求出最優解,最後損失函式不斷趨近0。那麼我們可以在所定義的損失函式後面加入一項永不為0的部分,那麼最後經過不斷優化損失函式還是會存在。其實這就是所謂的“正則化”。

下面這張圖片就是加入了正則化(regulation)之後的損失函式。這裡m是樣本數目,landa(後面我用“t”表示,實在是打不出)表示的是正則化係數。

注意:當t(landa)過大時,則會導致後面部分權重比加大,那麼最終損失函式過大,從而導致欠擬合

   當t(landa)過小時,甚至為0,導致過擬合。

2、對於神經網路,引數膨脹原因可能是因為隨著網路深度的增加,同時引數也不斷增加,並且增加速度、規模都很大。那麼可以採取減少神經網路規模(深度)的方法。也可以用一種叫dropout的方法。dropout的思想是當一組引數經過某一層神經元的時候,去掉這一層上的一部分神經元,讓引數只經過一部分神經元進行計算。注意這裡的去掉並不是真正意義上的去除,只是讓引數不經過一部分神經元計算而已。

另外增大訓練樣本規模同樣也可以防止過擬合。

欠擬合:

其實個人覺得欠擬合基本上都會發生在訓練剛開始的時候,經過不斷訓練之後欠擬合應該不怎麼考慮了。。但是如果真的還是存在的話,可以通過增加網路複雜度或者在模型中增加多點特徵點,這些都是很好解決欠擬合的方法。