【轉】欠擬合、過擬合及其解決方法
原文地址欠擬合、過擬合及其解決方法
原作者CSDN ID:will_duan
在我們機器學習或者訓練深度神經網路的時候經常會出現欠擬合和過擬合這兩個問題,但是,一開始我們的模型往往是欠擬合的,也正是因為如此才有了優化的空間,我們需要不斷的調整演算法來使得模型的表達能拿更強。但是優化到了一定程度就需要解決過擬合的問題了,這個問題也在學術界討論的比較多。(之前搜了很多有的博客,講的都不太全,因此我重新整理總結了一遍,同時加入了自己的理解,方便自己和後來人查閱)
首先就是我們在進行模型訓練的時候會出現模型不能夠很好地擬合數據的情況,這個時候就需要我們來判斷究竟現在的模型是欠擬合還是過擬合,那麼怎麼來判斷這兩者的情況呢?有兩種方法:
首先看一下三種誤差的計算方法:
- training error
- cross validation error
- test error
1)學習曲線(learning curves)
學習曲線就是比較 j_train 和 j_cv。如下圖所示,為一般的學習曲線,藍色的線表示訓練集上的誤差 j_train, 粉色的線表示驗證集上的誤差 j_cv,橫軸表示訓練集合的大小。
剛開始處於 「A」 點,表示當訓練數據很小時,很容易時訓練集上的誤差非常小,此時處於過擬合狀態。隨著訓練數據的增加,訓練數據上的誤差 J_train 越來越大,而驗證集上的誤差 J_cv 越來越小,J_train 和 J_cv 越來越接近但始終保持 J_cv > J_train.
2)交叉驗證(cross-validation)
這裡首先解釋一下bias和variance的概念。模型的Error = Bias + Variance,Error反映的是整個模型的準確度,Bias反映的是模型在樣本上的輸出與真實值之間的誤差,即模型本身的精準度,Variance反映的是模型每一次輸出結果與模型輸出期望之間的誤差,即模型的穩定性。
我們可以根據j_cv 與 j_train兩個來判斷是處於欠擬合還是過擬合。
當觀察到 J_cv 很大時,可能處在途中藍色圓圈中的兩個位置,雖然觀察到的現象很相似(J_cv都很大),但這兩個位置的狀態是非常不同的,處理方法也完全不同。
- 當cross validation error (Jcv) 跟training error(Jtrain)差不多,且Jtrain較大時,即圖中標出的bias,此時 high bias low variance,當前模型更可能存在欠擬合。
- 當Jcv >> Jtrain且Jtrain較小時,即圖中標出的variance時,此時 low bias high variance,當前模型更可能存在過擬合。
1. 欠擬合
首先欠擬合就是模型沒有很好地捕捉到數據特徵,不能夠很好地擬合數據,例如下面的例子:
左圖表示size與prize關係的數據,中間的圖就是出現欠擬合的模型,不能夠很好地擬合數據,如果在中間的圖的模型後面再加一個二次項,就可以很好地擬合圖中的數據了,如右面的圖所示。
解決方法:
1)添加其他特徵項,有時候我們模型出現欠擬合的時候是因為特徵項不夠導致的,可以添加其他特徵項來很好地解決。例如,「組合」、「泛化」、「相關性」三類特徵是特徵添加的重要手段,無論在什麼場景,都可以照葫蘆畫瓢,總會得到意想不到的效果。除上面的特徵之外,「上下文特徵」、「平台特徵」等等,都可以作為特徵添加的首選項。
2)添加多項式特徵,這個在機器學習演算法裡面用的很普遍,例如將線性模型通過添加二次項或者三次項使模型泛化能力更強。例如上面的圖片的例子。
3)減少正則化參數,正則化的目的是用來防止過擬合的,但是現在模型出現了欠擬合,則需要減少正則化參數。
2. 過擬合
通俗一點地來說過擬合就是模型把數據學習的太徹底,以至於把雜訊數據的特徵也學習到了,這樣就會導致在後期測試的時候不能夠很好地識別數據,即不能正確的分類,模型泛化能力太差。例如下面的例子。
上面左圖表示size和prize的關係,我們學習到的模型曲線如右圖所示,雖然在訓練的時候模型可以很好地匹配數據,但是很顯然過度扭曲了曲線,不是真實的size與prize曲線。
解決方法:
1)重新清洗數據,導致過擬合的一個原因也有可能是數據不純導致的,如果出現了過擬合就需要我們重新清洗數據。
2)增大數據的訓練量,還有一個原因就是我們用於訓練的數據量太小導致的,訓練數據佔總數據的比例過小。
3)採用正則化方法。正則化方法包括L0正則、L1正則和L2正則,而正則一般是在目標函數之後加上對於的範數。但是在機器學習中一般使用L2正則,下面看具體的原因。
L0範數是指向量中非0的元素的個數。L1範數是指向量中各個元素絕對值之和,也叫「稀疏規則運算元」(Lasso regularization)。兩者都可以實現稀疏性,既然L0可以實現稀疏,為什麼不用L0,而要用L1呢?個人理解一是因為L0範數很難優化求解(NP難問題),二是L1範數是L0範數的最優凸近似,而且它比L0範數要容易優化求解。所以大家才把目光和萬千寵愛轉於L1範數。
L2範數是指向量各元素的平方和然後求平方根。可以使得W的每個元素都很小,都接近於0,但與L1範數不同,它不會讓它等於0,而是接近於0。L2正則項起到使得參數w變小加劇的效果,但是為什麼可以防止過擬合呢?一個通俗的理解便是:更小的參數值w意味著模型的複雜度更低,對訓練數據的擬合剛剛好(奧卡姆剃刀),不會過分擬合訓練數據,從而使得不會過擬合,以提高模型的泛化能力。還有就是看到有人說L2範數有助於處理 condition number不好的情況下矩陣求逆很困難的問題(具體這兒我也不是太理解)。
4)採用dropout方法。這個方法在神經網路裡面很常用。dropout方法是ImageNet中提出的一種方法,通俗一點講就是dropout方法在訓練的時候讓神經元以一定的概率不工作。具體看下圖:
如上圖所示,左邊a圖是沒用用dropout方法的標準神經網路,右邊b圖是在訓練過程中使用了dropout方法的神經網路,即在訓練時候以一定的概率p來跳過一定的神經元。
以上就是關於過擬合、欠擬合的解釋以及判斷和其對應的解決方法。
------EOF------
參考文獻:
http://www.veryread.net/n-101-133184.html
http://blog.csdn.net/zouxy09/article/details/24971995
http://blog.csdn.net/wtq1993/article/details/51746847
http://blog.csdn.net/heyongluoyao8/article/details/49429629
http://blog.csdn.net/linkin1005/article/details/42869331
http://ljwsummer.github.io/posts/advice-for-applying-machine-learning.html
推薦閱讀:
※谷歌大腦發布神經架構搜索新方法:提速1000倍
※膠囊網路結構Capsule初探
※神經元 寒武紀水母 脊椎動物神經系統 哺乳動物大腦皮層 神經衝動電傳導 突觸化學傳導 神經遞質 神經迴路
※ML + System = ?
※GAN之父:讓機器擁有天賦 我還在對付利用AI作惡的人
TAG:神經網路 |