在咱們機器學習或者訓練深度神經網絡的時候常常會出現欠擬合和過擬合這兩個問題,可是,一開始咱們的模型每每是欠擬合的,也正是由於如此纔有了優化的空間,咱們須要不斷的調整算法來使得模型的表達能拿更強。可是優化到了必定程度就須要解決過擬合的問題了,這個問題也在學術界討論的比較多。(以前搜了不少有的博客,講的都不太全,所以我從新整理總結了一遍,同時加入了本身的理解,方便本身和後來人查閱)html
首先就是咱們在進行模型訓練的時候會出現模型不可以很好地擬合數據的狀況,這個時候就須要咱們來判斷究竟如今的模型是欠擬合仍是過擬合,那麼怎麼來判斷這二者的狀況呢?有兩種方法:git
首先看一下三種偏差的計算方法:github
1)學習曲線(learning curves)算法
學習曲線就是比較 j_train 和 j_cv。以下圖所示,爲通常的學習曲線,藍色的線表示訓練集上的偏差 j_train, 粉色的線表示驗證集上的偏差 j_cv,橫軸表示訓練集合的大小。網絡
剛開始處於 「A」 點,表示當訓練數據很小時,很容易時訓練集上的偏差很是小,此時處於過擬合狀態。隨着訓練數據的增長,訓練數據上的偏差 J_train 愈來愈大,而驗證集上的偏差 J_cv 愈來愈小,J_train 和 J_cv 愈來愈接近但始終保持 J_cv > J_train.
app
2)交叉驗證(cross-validation)機器學習
這裏首先解釋一下bias和variance的概念。模型的Error = Bias + Variance,Error反映的是整個模型的準確度,Bias反映的是模型在樣本上的輸出與真實值之間的偏差,即模型自己的精準度,Variance反映的是模型每一次輸出結果與模型輸出指望之間的偏差,即模型的穩定性。函數
咱們能夠根據j_cv 與 j_train兩個來判斷是處於欠擬合仍是過擬合。post
當觀察到 J_cv 很大時,可能處在途中藍色圓圈中的兩個位置,雖然觀察到的現象很類似(J_cv都很大),但這兩個位置的狀態是很是不一樣的,處理方法也徹底不一樣。
學習
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
轉自:http://blog.csdn.net/willduan1/article/details/53070777