Overfitting 是什麼?過擬合原理、偵測與解決方法白話解析

一句話說明

過擬合(Overfitting)是模型把訓練資料的雜訊和特例都背下來了,結果遇到新資料就判斷失準。這是機器學習中最常見也最需要注意的問題,從傳統的決策樹到現代的大型語言模型都可能遇到。

核心概念:背答案 vs 學會解題

想像兩個學生準備考試。

學生 A 把過去五年的考古題和答案全部背下來。如果考試出了一模一樣的題目,他可以拿滿分。但如果出了一道他沒背過的新題目,他就完全不會。他花了大量時間記住每一題的細微差異,包括哪一年的第三題答案是 C、哪一年的第五題要用公式二,但他其實沒有真正理解題目背後的邏輯。

學生 B 花時間理解題目背後的原理和解題邏輯。他在考古題上的分數可能比學生 A 低一點(因為有些細節沒記住),但遇到新題目也能舉一反三。他把精力放在理解「為什麼」,而非記住「是什麼」,所以他的知識可以遷移到從沒見過的問題上。

過擬合就是學生 A 的狀態——在訓練資料(考古題)上表現很好,但在新資料(新題目)上表現很差。這種「在熟悉的環境中表現優異,換一個場景就失靈」的現象,是機器學習從業者每天都在對抗的核心挑戰。

技術上的說法是:模型在訓練集(Training Set)上的誤差很低,但在測試集(Test Set)上的誤差很高。這個差距越大,過擬合越嚴重。理想的情況是兩者之間的差距很小,代表模型學到了可以泛化(generalize)到新資料的規律。

為什麼會過擬合

過擬合的成因可以歸納為五大類,理解每一類的原理才能對症下藥。

資料量太少。只有 100 筆資料要訓練一個有 100 萬個參數的模型,模型可以輕鬆記住每一筆資料的所有細節,包括雜訊。就像只有 5 題考古題,直接背比理解更容易。在台灣的企業場景中,這個問題特別常見——很多公司想用 AI 做預測或分類,但手上的標註資料可能只有幾百筆,遠遠不夠訓練一個穩定的模型。例如一家電商想預測客戶流失,但過去一年只有 200 筆流失紀錄,這個資料量對大多數模型來說都太少了。

模型太複雜。用一個非常複雜的模型(很多層、很多參數)去處理簡單的問題。就像用微積分去解一道國中數學題——雖然能解出來,但多餘的複雜度會讓模型「發明」出不存在的規律。舉個實際的例子:如果你只是想判斷一封信是不是垃圾郵件,用一個簡單的邏輯迴歸可能就夠了,但如果你硬是用一個有 10 億參數的深度神經網路來做,模型有太多的「容量」去記住每一封訓練信件的獨特特徵,反而會在新的垃圾郵件上失準。

訓練時間太長。模型訓練太多輪(epoch),一開始學到的是通用規律,但繼續訓練下去就開始記住訓練資料的雜訊和特例。可以把訓練過程想成學生的學習曲線:前幾次複習學到的是大方向和核心原理,但如果反覆看同一份材料幾十次,就會開始記住不重要的細節,比如「這道題的答案在第二頁的左上角」。在實務上,很多初學者會把 epoch 設得很大(例如 1000),然後看到訓練 loss 一路下降就很開心,殊不知模型早已過擬合了。

資料中有雜訊。訓練資料的標註不完全正確,或包含異常值。模型如果連這些錯誤都學起來,就是過擬合了。在真實世界中,完美的資料幾乎不存在。人工標註的資料可能因為標註者的疲勞、主觀判斷差異、或對標準的理解不同而有錯誤。例如情感分析的訓練資料中,標註者可能對「還好啦」這句話到底是正面還是中性有不同的看法。如果模型把這種模糊的標註當成確定的規律來學,就會在類似的邊界案例上做出不穩定的判斷。

特徵和標籤之間有虛假關聯(Spurious Correlation)。例如訓練資料中所有的狼照片都有雪地背景,模型可能學到「有雪地就是狼」而非真正辨認狼的特徵。這類虛假關聯在現實中非常常見。曾有研究發現,某個用來辨識肺炎 X 光片的模型,實際上學到的是「來自特定醫院的 X 光片比較可能是肺炎」,因為那家醫院是專門的胸腔科醫院。模型抓住了影像中的醫院標記,而非真正的肺炎特徵。這種情況在部署到其他醫院時就會完全失效。

怎麼偵測過擬合

偵測過擬合有幾種系統性的方法,每種方法的適用場景和精確度不同。

觀察訓練曲線(Learning Curve)。畫出訓練集和驗證集的損失(Loss)隨訓練輪數變化的曲線。正常情況下兩條線都會下降。如果訓練集的損失持續下降,但驗證集的損失開始上升,就是過擬合的訊號。這兩條線開始分叉的那個點,就是模型從「學習」轉變成「背書」的轉折點。在大多數深度學習框架中(PyTorch、TensorFlow),都可以用 TensorBoard 或 Weights & Biases 來即時監控這兩條曲線。飛飛建議在每次訓練模型時都要看這張圖,它是判斷模型健康狀態最直覺的工具。

交叉驗證(Cross-validation)。把資料分成 k 份,輪流用其中 k-1 份訓練、1 份驗證。如果不同分組的結果差異很大,代表模型對訓練資料太敏感。最常見的是 5-fold 或 10-fold 交叉驗證。例如你有 1000 筆資料,分成 5 份,每次用 800 筆訓練、200 筆驗證,重複 5 次。如果 5 次的準確率分別是 95%、72%、88%、91%、69%,這個巨大的變異告訴你模型不穩定,很可能有過擬合的問題。穩定的模型在不同分組上的表現應該相近。

比較訓練和測試的準確率。如果訓練準確率 99% 但測試準確率只有 70%,中間的 29% 差距就是過擬合造成的。這個差距(Generalization Gap)越大,問題越嚴重。一般來說,如果差距超過 10 個百分點,就需要認真處理了。在工業實務中,飛飛建議保留三組資料:訓練集(用於訓練)、驗證集(用於調參數和早停)、測試集(用於最終評估,訓練過程中完全不碰)。很多初學者會犯的錯誤是在測試集上反覆調整模型,這等於把測試集變成了第二個驗證集,最終報告的數字就不可信了。

檢查模型對微小輸入變化的敏感度。如果把輸入稍微改一下(例如圖片加一點雜訊、文字改幾個字),模型的預測就大幅改變,這可能是過擬合的徵兆。穩定的模型應該對合理範圍內的輸入變化保持穩健的預測。例如在情感分析中,「這家餐廳的服務很好」和「這家餐廳的服務非常好」應該都被判為正面情緒,如果模型把前者判為正面、後者判為負面,那它顯然沒有學到正確的規律。

解決方法

針對不同的過擬合成因,有對應的解決方案。

增加訓練資料。最直接的方法。更多資料意味著模型更難「背答案」,必須學會通用的規律。在圖片辨識中,可以用資料增強(Data Augmentation)人工擴充資料——對圖片做旋轉、翻轉、裁切、調整亮度等變換。在自然語言處理中,資料增強的手法包括同義詞替換、隨機刪除詞彙、或用翻譯做回譯(Back-translation,把中文翻成英文再翻回中文,得到語意相同但措辭不同的句子)。如果取得新資料的成本太高,也可以考慮用合成資料(Synthetic Data)。例如用已有的少量資料訓練一個生成模型,再用它來產生更多的訓練樣本。

降低模型複雜度。用更小的模型(更少的層數或參數)。如果簡單模型就能達到差不多的效果,沒必要用複雜模型。在實務中,這代表你可能需要從 ResNet-152 換成 ResNet-50,或者把 LSTM 的隱藏層維度從 512 降到 128。一個有用的經驗法則是:模型的可訓練參數數量不應該超過訓練資料量的 10 倍。例如你有 1000 筆訓練資料,那模型的參數量超過 10,000 就要開始警惕過擬合的風險了。

正則化(Regularization)。在損失函數中加入懲罰項,讓模型傾向使用較小的參數值。常見的有 L1 正則化(讓不重要的參數歸零,達到特徵選擇的效果)和 L2 正則化(讓所有參數都不要太大,也叫 Weight Decay)。L1 適合在你懷疑很多特徵是無用的時候使用,它會自動幫你「關掉」不重要的特徵。L2 則是讓模型更平滑,避免對任何單一特徵過度依賴。在深度學習框架中,L2 正則化通常透過 optimizer 的 weight_decay 參數來設定,例如 PyTorch 中的 torch.optim.AdamW(model.parameters(), lr=1e-4, weight_decay=0.01)

Dropout。在訓練時隨機「關閉」一部分神經元(通常 20-50%),迫使模型不能依賴少數幾個神經元,要學會分散的、穩健的特徵表示。這是深度學習中最常用的防過擬合技巧之一。Dropout 的比例需要根據模型大小和資料量調整:資料少的時候用較高的 Dropout(0.5),資料充足的時候可以降低(0.1-0.2)。在推論(inference)階段,Dropout 會自動關閉,所有神經元都會參與計算,但輸出會按照 Dropout 比例做縮放,以保持數值一致性。

Early Stopping(提前停止)。監控驗證集的表現,當驗證集的損失不再下降(甚至開始上升)時,停止訓練。不讓模型「學過頭」。實作上通常設定一個「耐心值」(patience):如果驗證集的損失在連續 N 個 epoch 都沒有改善,就停止訓練,並回復到損失最低那個 epoch 的模型權重。在 PyTorch 中可以用 torch.optim.lr_scheduler.ReduceLROnPlateau 搭配手動的 early stopping 邏輯。在 Keras 中則可以直接用 callbacks.EarlyStopping(patience=5, restore_best_weights=True)

Batch Normalization。在網路的每一層做正規化,讓每層的輸入分布穩定。這個技巧原本是為了加速訓練,但也有正則化的效果。它會減少模型對初始化權重的敏感度,讓訓練過程更穩定。在 CNN 中通常放在卷積層之後、激活函數之前。在 Transformer 架構中,Layer Normalization 取代了 Batch Normalization 的角色。

資料清洗和去雜訊。如果過擬合的根因是資料品質問題,再多的正則化技巧也治標不治本。飛飛建議在訓練前花時間做資料品質檢查:移除明顯標註錯誤的樣本、處理離群值(outlier)、確認標註標準一致。在台灣企業的專案中,資料清洗通常佔整個專案工作量的 40-60%,但很多團隊為了趕進度跳過這一步,結果花更多時間處理過擬合的問題。

過擬合的解決方法比較

方法 原理 適用場景 實作難度 效果
增加資料 減少模型記憶的可能 資料量少 中(需要收集或生成資料)
降低複雜度 減少模型的記憶容量 模型明顯過大
L1/L2 正則化 懲罰過大的參數值 傳統 ML 和淺層網路
Dropout 隨機關閉部分神經元 深度學習模型
Early Stopping 訓練過程中適時停止 所有場景
Batch Normalization 穩定每層的輸入分布 CNN 和深層網路
資料增強 人工擴充訓練資料 圖片辨識、NLP
資料清洗 移除雜訊和錯誤標註 資料品質差 高(耗時)

Overfitting 的反面:Underfitting

如果模型太簡單,連訓練資料的基本規律都學不到,就叫做欠擬合(Underfitting)。

過擬合:訓練表現好,測試表現差。模型太複雜或資料太少。就像背書背太多,但沒有理解能力。

欠擬合:訓練和測試表現都差。模型太簡單,或特徵選擇有問題。就像上課沒聽懂,連基本概念都沒掌握。

好的模型在兩者之間取得平衡——學到足夠的規律,但不記住雜訊。這就是機器學習中「偏差-變異數權衡」(Bias-Variance Tradeoff)的核心概念。高偏差(high bias)代表欠擬合,模型的假設太強,忽略了資料中的重要模式。高變異數(high variance)代表過擬合,模型太靈活,連雜訊都學進去了。理想的模型在兩者之間找到甜蜜點(sweet spot)。

在實務中,建議從簡單的模型開始,逐步增加複雜度。如果簡單模型的訓練和測試表現都差,代表欠擬合,可以加大模型。如果訓練表現好但測試表現差,代表過擬合,需要用前面提到的方法處理。這個逐步調整的過程就是模型選擇(Model Selection)的核心邏輯。

在 LLM 時代的過擬合

大型語言模型(LLM)的過擬合表現形式稍有不同,但核心原理相同。

微調時過擬合。用太少的資料或訓練太多輪微調 LLM,模型會開始逐字複製訓練範例,而非學會通用的回答模式。這在企業微調客服機器人時很常見。例如某家台灣電商用 500 筆客服對話微調 Llama 模型,結果模型在回答時會直接重複訓練資料中的客戶名字和訂單編號,這不只是過擬合,也是隱私風險。防止微調過擬合的最佳實踐是:使用較低的學習率(例如 2e-5)、只訓練 2-3 個 epoch、使用 LoRA 等參數高效微調方法來限制可訓練參數的數量。

訓練資料記憶(Memorization)。研究顯示 LLM 會記住訓練資料中的特定段落,在特定的 Prompt 下可以被引導重現這些內容。這是一種安全風險,尤其當訓練資料包含個人資料時。例如 GPT 模型曾被研究者用特定的 Prompt 模式引導出訓練資料中的電話號碼和地址。Anthropic、OpenAI 等公司都在研究如何在保持模型能力的同時減少這種記憶效應,但目前沒有完全的解決方案。

評估資料汙染(Benchmark Contamination)。如果評測 LLM 的基準測試(Benchmark)出現在模型的訓練資料中,模型可能「背了答案」。這讓評測結果的可信度下降。例如某些模型在 MMLU 上的分數很高,但後來被發現訓練資料中包含了 MMLU 的題目。這就像學生在考試前拿到了考卷,分數再高也不能代表真實能力。為了應對這個問題,研究社群越來越傾向使用新建的、未公開的評測集來測試模型。

台灣企業常見的過擬合場景

在台灣企業的 AI 專案中,飛飛觀察到幾個特別容易發生過擬合的場景。

中文 NLP 的資料稀缺問題。中文的公開 NLP 資料集比英文少很多。當企業想訓練一個繁體中文的分類器或 NER(命名實體辨識)模型時,往往只能靠自己標註資料。在資料量有限的情況下,過擬合的風險特別高。建議先用多語言的預訓練模型(如 XLM-RoBERTa)做遷移學習,再用有限的繁體中文資料做微調,這樣可以大幅降低過擬合的風險。

製造業的異常偵測。台灣的製造業經常需要用 AI 做產品瑕疵檢測。問題是:正常品的資料很多,但瑕疵品的資料很少(因為良率通常在 95% 以上)。在這種極度不平衡的資料集上訓練模型,很容易過擬合少數類別——模型可能記住了每一個瑕疵品的特定外觀,而非學到「什麼是瑕疵」的通用特徵。解決方法包括:使用過採樣(oversampling)、設計適合不平衡資料的損失函數(如 Focal Loss)、或使用異常偵測方法而非分類方法。

金融業的時序預測。台灣的金融機構常嘗試用 AI 預測股價或市場走勢。時序資料的過擬合特別陰險——模型可能學到「歷史上每年 1 月台股都漲」這種虛假的規律。在回測(backtesting)時看起來績效很好,一旦上線就失準。避免這種過擬合的關鍵是使用嚴格的時間序列交叉驗證(Time Series Cross-validation),確保訓練資料永遠在驗證資料之前,不能有未來資訊洩漏(data leakage)。

安全與限制

過擬合的模型在部署環境中表現不可預期。因為模型記住了訓練資料的特例,遇到和訓練分布不同的真實資料時,可能做出荒謬的判斷。在醫療診斷、金融風控等高風險場景中,這是嚴重的安全隱患。例如一個過擬合的信用評分模型可能對某些不在訓練資料分布內的申請者給出極端的分數,導致不公平的貸款決策。

對抗樣本(Adversarial Examples)利用了過擬合的弱點。過擬合的模型對輸入的微小變化特別敏感。攻擊者可以在圖片上加入人眼看不到的微小擾動,讓模型做出完全錯誤的判斷。例如在自動駕駛場景中,攻擊者可以在停車標誌上貼幾張小貼紙,讓模型把它誤判為速限標誌。這種攻擊對過擬合的模型特別有效,因為過擬合的模型依賴的是訓練資料中的表面特徵而非深層語義。

過擬合可能導致歧視。如果訓練資料中某個群體的代表性不足,模型會在這個群體上表現特別差。這在自動化決策系統中可能構成歧視。例如一個用來篩選履歷的 AI,如果訓練資料中女性工程師的比例很低,模型可能會學到「工程師大多是男性」的偏見,在遇到女性申請者時給出不合理的低分。這種偏見本質上是對少數群體的過擬合——模型把「歷史上的不均等」當成了「預測的規律」。

在台灣的個資法框架下,如果 AI 系統的自動化決策因為過擬合導致對特定群體的不公平對待,可能構成違法。企業在部署 AI 之前,應該檢查模型在不同群體上的表現是否一致,避免因過擬合導致的歧視問題。

常見問題

過擬合一定是壞事嗎?

在絕大多數場景下是。但在某些特殊情況下(如記憶式的查詢系統、最近鄰搜尋),某種程度的「過擬合」可能是設計意圖的一部分。不過這通常不叫過擬合,而是叫記憶(Memorization)。例如搜尋引擎的索引系統就是要「記住」每一份文件的內容,這裡的完全記憶是功能需求而非缺陷。

資料增強真的有效嗎?

在圖片辨識領域非常有效。一張圖片經過旋轉、翻轉、裁切、調色後,對模型來說就是「不同的圖片」,但保留了相同的標籤。例如一張貓的照片,翻轉後仍然是貓,但像素排列完全不同,這等於免費獲得了一筆新的訓練資料。在自然語言處理中,資料增強的效果沒有那麼穩定,因為對文字的變換更容易改變語義。例如「我喜歡這家餐廳」和「我不喜歡這家餐廳」只差一個字,但情感完全相反。

Dropout 為什麼有效?

直覺上,Dropout 就像是在訓練一個「委員會」。每次隨機關閉不同的神經元,相當於訓練了很多個不同結構的小模型,最後把它們的判斷平均起來。任何一個神經元都不能「獨大」,模型必須學會分散式的穩健特徵。從另一個角度看,Dropout 讓每個神經元不能假設其他特定的神經元一定存在,所以每個神經元都必須學會獨立有用的特徵,而非依賴於和其他神經元的特定組合。

深度學習一定會過擬合嗎?

不一定,但風險比傳統機器學習高,因為深度學習模型的參數量通常遠大於訓練資料量。現代的技巧(Dropout、BatchNorm、資料增強、正則化)可以有效控制過擬合。有趣的是,研究發現非常大的模型(如 GPT 級別)在足夠多的資料上訓練時,反而不容易過擬合——這被稱為「雙重下降」(Double Descent)現象。在雙重下降中,模型的測試誤差先下降、然後上升(傳統過擬合),然後在模型複雜度繼續增加後再次下降。這挑戰了「越大越容易過擬合」的直覺。

怎麼判斷模型是過擬合還是其他問題?

最簡單的方式:比較訓練集和測試集的表現。如果訓練集好但測試集差→過擬合。如果兩者都差→可能是欠擬合、資料品質問題或特徵選擇問題。如果兩者都好→恭喜,你的模型沒什麼問題。另外,也可以觀察訓練曲線的形狀:如果驗證損失先降後升形成 U 形,幾乎可以確定是過擬合。如果驗證損失一直在高位震盪不下降,則更可能是欠擬合或學習率設定的問題。

遷移學習可以避免過擬合嗎?

遷移學習(Transfer Learning)是在資料量有限的情況下防止過擬合的有效方法。基本概念是:用大量資料預先訓練好一個通用模型,然後用你的少量資料做微調。因為模型已經在預訓練階段學到了通用的特徵表示,微調時只需要學習任務相關的少量知識,大幅降低了過擬合的風險。例如在圖片辨識中,你可以用在 ImageNet 上預訓練好的 ResNet,在你自己的 500 張圖片上微調最後幾層,效果通常比從頭訓練好得多。在 NLP 中,BERT、GPT 等預訓練語言模型的出現讓遷移學習成為標準做法。

相關文章

參考資料

  • Srivastava et al., "Dropout: A Simple Way to Prevent Neural Networks from Overfitting" (2014)
  • Ying, "An Overview of Overfitting and its Solutions" (2019)
  • Nakkiran et al., "Deep Double Descent" (2019)