前言

這篇文章是關於調參中常遇到的欠擬合與過擬合問題,通過將四個概念: 偏差,方差,欠擬合,過擬合連接起來,能夠更好的理解這個問題。 最後,針對該問題,我提出了幾點建議。

泛化能力[1]

機器學習演算法的目的是使得我們的演算法能夠在先前未預測的新輸入上表現良好,而不只是在訓練集上表現良好。 而這種在新數據上表現良好的能力被稱為演算法的泛化能力。

簡單來說, 如果說一個模型在測試集上表現的與訓練集一樣好,我們就說這個模型的泛化能力很好;如果模型在訓練集上表現良好,但在測試集上表現一般,就說明這個模型的泛化能力不好。

從誤差的角度來說,泛化能力差就是指的是測試誤差比訓練誤差要大的情況,所以我們常常採用訓練誤差,測試誤差來判斷模型的擬合能力,這也是測試誤差也常常被稱為泛化誤差的原因。

欠擬合與過擬合

我們在訓練模型的時候有兩個目標:

  1. 降低訓練誤差,尋找針對訓練集最佳的擬合曲線。
  2. 縮小訓練誤差和測試誤差的差距,增強模型的泛化能力。

這兩大目標就對應機器學習中的兩大問題: 欠擬合與過擬合。 具體來講:

  1. 欠擬合是指模型在訓練集與測試集上表現都不好的情況,此時,訓練誤差,測試誤差都很大。
  2. 過擬合是指模型在訓練集上表現良好,但在測試集上表現不好的情況,此時,訓練誤差很小,測試誤差很大, 模型泛化能力不足。
來源:吳恩達課程

如上圖所示, 左邊這幅表示欠擬合,其不能很好的擬合所有的點;最右邊這幅為過擬合,其太認真的擬合所有的點,導致模型的泛化能力很差。

偏差與方差 -- bias 與 variance [2]

上文是從泛化的角度來談,本節從數學角度來分析一下誤差的兩大來源:偏差與方差。

  1. 偏差指的是模型在訓練集上的錯誤率, 如5%。其實是與訓練誤差成線性關係的。
  2. 方差指的是模型在開發集(或測試集)上的表現與訓練集上的差距。如開發集的錯誤率比訓練集差1%。其實是與 測試誤差 - 訓練誤差 成線性關係的。

從偏差與方差的角度來分析模型常常會有四種情況:

  1. 偏差很低,方差很高: 意味著訓練誤差很低,測試誤差很高,此時發生了過擬合現象。
  2. 偏差很高,方差很低: 意味著訓練誤差,測試誤差都很高,此時發生了欠擬合現在。
  3. 偏差,方差都很高: 意味著此時同時發生了欠擬合和過擬合現象。
  4. 偏差很低,方差很低: 意味著訓練誤差很低,測試誤差也很低,表示我們的模型訓練的結果很好。

偏差與方差的權衡

從上面的分析我們可以看出,在實際中,從偏差與方差的角度能夠比欠擬合,過擬合的角度更好的對當前的模型狀態進行很好的評估。在實際中構建模型的過程中,其實就是對於偏差與方差之間的權衡,因為很多改進演算法在減少偏差的同時往往會增大方差,反之亦然。

通過學習曲線來判斷偏差與方差

在代碼中添加一些曲線能夠幫助你更好的分析模型狀態,本節僅探討對於分析偏差,方差有幫助的學習曲線,更多的學習曲線需要根據自己的需要來給定。

訓練集樣本數量與訓練誤差,測試誤差。 對於模型來說,當訓練集的數據量達到一定程度之後,數據量的提升對於模型的提升已經微乎其微了,此時你需要權衡是否需要花費精力去獲取更多的數據來提升模型性能。假設你的訓練集有1000個樣本,那麼通過規模為100,200, 300,...,1000的樣本集分別運行演算法,我們就能得到訓練誤差,測試誤差隨訓練集數據變化的曲線:

從上圖中,我們根據 Training error 與 Dev error的收斂情況完全可以很輕鬆的判斷出此時偏差與方差的狀況。

如何降低偏差[2]

當你發現你的模型的偏差很高時,這也意味著你的訓練誤差很高,建議從以下幾個角度試試:

  1. 加大模型規模(更換其餘機器學習演算法,神經網路可以增加每層神經元/神經網路層數):偏差很高很有可能是因為模型的擬合能力差,對於傳統機器學習演算法,各個方法的擬合能力不同,選擇一個擬合能力更好的演算法往往能夠得出很好的結果。 對於神經網路(擬合能力最強)而言,通過增加網路層數或增加每層單元數就能夠很好的提高模型的擬合能力[3][4][5]。
  2. 根據誤差分析結果來修改特徵: 我們需要將錯誤樣本分類,判斷可能是由於什麼原因導致樣本失敗,在針對分析結果,增加或減少一些特徵。
  3. 減少或去除正則化: 這可以避免偏差,但會增大方差。
  4. 修改模型結構,以適應你的問題:對於不同的問題,不同的模型結構會產生更好的結果,比如在CV中常用CNN,而在NLP領域常用LSTM。

如何降低方差[2]

當你發現你的模型的方差很高時,說明你的模型泛化能力弱,可以從以下幾個角度分析:

  1. 重新分析,清洗數據。 有時候,造成方差很大的原因往往是由於數據不良造成的,對於深度學習來說,有一個大規模,高質量的數據集是極為重要的。
  2. 添加更多的訓練數據。增大訓練數據能夠往往能夠提高模型的泛化能力。
  3. 加入正則化。正則化是機器學習中很重要的一個技巧,你必須掌握它。
  4. 加入提前終止。意思就是在訓練誤差變化很慢甚至不變的時候可以停止訓練,這項技術可以降低方差,但有可能增大了偏差。 提前終止有助於我們能夠在到達最佳擬合附近,避免進入過擬合狀態。
  5. 通過特徵選擇減少輸入特徵的數量和種類。 顯著減少特徵數量能夠提高模型的泛化能力,但模型的擬合能力會降低,這意味著,該技術可以減小方差,但可能會增大偏差。 不過在深度學習中,我們往往直接將所有特徵放入神經網路中,交給演算法來選擇取捨。
  6. 減少模型規模,降低模型複雜度(每層神經元個數/神經網路層數): 謹慎使用。 一般情況下,對於複雜問題如CV或NLP等問題不會降低模型複雜度,而對於簡單問題,採用簡單模型往往訓練速度更快,效果很好。
  7. 根據誤差分析結果修改輸入特徵。
  8. 修改模型架構,使之更適合你的問題。 一般可以選擇簡單模型的情況下,不選擇複雜模型。

Reference

[1] Deep Learning -- 花書

[2] Machine learning yearning: Technical Strategy for AI Engineers, in the era of Deep learning

[3] can shallow network fit any function -- 李宏毅視頻

[4] Deep Potential of Deep -- 李宏毅視頻

[5] Is Deep better than Shallow? -- 李宏毅視頻

推薦閱讀:

相關文章