過擬合是什麼意思:機器學習模型怎樣記住噪音,又怎樣被認出來
「過擬合」究竟是甚麼
Google Machine Learning Crash Course 對「過擬合」(overfitting)的定義很直接:模型在訓練資料上表現良好,但到了未經見過的新資料上,表現卻很差。
重點不是模型曾經學過甚麼,而是它面對新資料時是否仍然有效。對機構內的 AI 專案而言,不能只因系統能處理熟悉的歷史資料,便推論它也能處理日後遇到的新個案。過擬合正是「熟練」與「泛化」之間出現落差:模型記住的東西,未必有助於判斷新資料。
模型點解會記住噪音
Google Machine Learning Crash Course 指出,過擬合可從兩方面理解。
第一,訓練資料本身不具代表性。文件以 broccoli 作比喻:如果訓練時只提供西蘭花圖片,測試時卻混入其他食物,模型便沒有足夠代表性去處理新一類圖片。對機構內的系統來說,這提醒我們抽樣不能只覆蓋最容易取得的舊有個案,否則模型在真正未見過的輸入上可能失效。
第二,模型相對於資料太複雜。當模型有足夠空間配合訓練內容時,它可能把隨機噪點也當成重要特徵,而不是只學會當中的穩定關係。這就是標題所說的「記住噪音」:訓練錯誤下降得很快,但模型也可能正把不應泛化的細節一併背下來。
點樣從損失曲線認出過擬合
判斷時,先把資料分為訓練集與驗證集,在訓練過程中記錄模型的損失並畫出曲線。訓練集用來更新模型,驗證集則用來觀察模型面對未參與訓練的資料時表現如何。
若驗證損失在某一點之後由跌轉升,而訓練損失仍維持良好表現,兩條曲線之間的間隙便會愈拉愈闊。這是過擬合的典型訊號:模型繼續降低訓練損失,代價卻是驗證表現開始變差。
Google Machine Learning Crash Course 亦提醒,訓練損失與驗證損失之間的間隙要看其形態。若間隙一直很大,對應欠擬合;若間隙先縮小,之後再擴大,才對應過擬合。因此,不能只問「哪一條損失曲線較低」,還要看兩條曲線的分歧何時出現,以及正在擴大還是收窄。
正則化:限制模型硬記資料
正則化的作用,是對模型作出的判斷增加限制。以 L2 正則化為例,系統會在原有損失中加入一個懲罰權重大小的項目:權重愈大,額外受到的懲罰便愈重。
這種做法會迫使模型不能單靠把權重拉大來配合訓練資料,並壓低模型複雜度。它不是把所有細節都抹走,而是在貼合訓練資料與保持簡化之間作出取捨。正則化需要付出的代價,是偏差上升。
換言之,正則化不是單純追求更低的訓練損失,而是在問:模型是否需要記得這麼多,才可以處理未見資料?當曲線顯示模型開始過度貼合訓練集時,這個額外限制便可能減少部分過擬合。
早停:在驗證表現變差前停手
早停(early stopping)是一種更直接的處理方法。訓練期間持續觀察驗證損失,當它由下降轉為上升時,便停止繼續訓練,保留較早的模型狀態。
它的道理與曲線形態一致:模型再繼續練下去,訓練損失可能仍然漂亮,但驗證損失已經開始惡化。早停等於在這個分歧出現時停止,讓模型不致一路走到更嚴重的過擬合。
交叉驗證:避免一次切分講得太運氣
scikit-learn 的 Cross-validation 文件介紹的 k-fold 交叉驗證,會把資料切成 k 折,輪流把其中一折用作驗證資料,其餘用作訓練資料,再重複整個過程。
這種做法是為了避免單次切分剛好,讓模型獲得過於有利的驗證結果,因而低估泛化誤差。對機構評估 AI 模型而言,重點不是某一個碰巧留出的驗證集表現如何,而是模型在反覆輪換的未見資料上,能否維持相近表現。
驗證與測試亦要分開:測試集必須獨立保留,並且只在最後使用一次。交叉驗證主要協助比較不同模型或設定;測試集則保留作最後評估,避免測試資料在反覆調校過程中間接成為訓練的一部分。