在過去的學習裡,我們總是希望模型的準確率越高越好,
但當你看到訓練集準確率接近 100%,
而驗證集或測試集的準確率卻明顯落後時,就要小心了。
這種情況並不是模型真的「完美」,而是掉進了「過擬合」(Overfitting)的陷阱。
而在今天,我們就要把過擬合的概念拆解得更清楚,
並來探討如何避免。
首先第一步,我們當然要來解釋什麼是「過擬合」:
過擬合一般來說是一種情況,當模型在訓練資料上表現得非常好,
但在新的資料(測試集或真實應用場景)上表現卻很差。
換句話說,模型「記住」了訓練資料的細節與噪音,
而不是「學會」了真正的規律。
白話一點的比喻來說,過擬合就像一個學生考前死背課本的題目,
模擬考的時候分數很高,但一旦遇到課本以外的題目就不知所措。
這代表他並沒有真正理解,而只是把答案硬背下來。
目前已知過擬合的原因常見有幾種:
神經網路擁有非常多的參數,若模型的層數過多或神經元數過大,
它就會有能力去「記住」訓練資料的細節。
而複雜模型就像是一個記憶力超強的學生,
哪怕是資料中的錯誤或雜訊,它也能背下來,
就可能會導致全部東西都背下來,
但沒辦法區分什麼是對、什麼是錯。
如果給模型的訓練樣本太少,模型很容易就把這些有限的資料全部記起來,
而不是去歸納一般規律。
這也是為什麼在深度學習裡,資料常常比模型本身更重要,
有更多的資料讓我們可以去跑訓練,
模型運行的品質才能更好。
當模型訓練太久,它會一點一滴地把資料的細節「過度擬合」。
就像如果只是考一面選擇題,但卻給你五個小時的時間,
寫到最後說不定你連題目的字有幾筆畫都能說出來。
如果資料本身不乾淨,例如影像模糊、錯誤標記,或樣本差異太大,
模型也可能會錯誤地把這些雜訊當成模式,
進而導致訓練的錯誤。
我們通常會觀察 Loss 與 Accuracy 曲線:
如果「訓練集的 Loss 持續下降,但驗證集的 Loss 卻開始上升」,
這就是一種過擬合的警訊,因為很明顯兩者對不上。
同樣地,如果訓練 Accuracy 越來越高,但驗證 Accuracy 卻停滯不前甚至下降,
也表示模型只是在訓練資料上表現好,而泛化能力不足。
而如果要避免過擬合,下面也有幾種常見的方法,以下就來介紹一下:
當模型有更多樣的資料可以學習時,它就比較不會只專注於記住某些細節。
例如在影像辨識中,我們可以旋轉、翻轉或調整亮度來「擴充」資料。
正則化是一種在模型參數中加入限制的方法。最常見的有:
Dropout 是在訓練過程中隨機讓一部分神經元「暫時不工作」,
避免模型過度依賴某些特定的神經元,進而提升泛化能力。
當我們發現驗證集的表現開始惡化,
就可以提前停止訓練,避免模型進一步「背答案」。
如果資料量有限,就不要使用過度複雜的模型,
應該讓模型的容量(capacity)與資料規模相匹配。
當在教導一個學生學習的時候,你肯定不希望他只是死背,
而是希望他可以對問題「融會貫通」。
而對於深度學習也是一樣,
我們也要盡力的去避免模型死記硬背,
否則等考試成績(訓練結果)出來之後,
你原本臉上的笑容就要被轉移到你的 Loss 曲線上面了。
這也是為什麼我們要去學習「過擬合」這個專業術語。
參考資料:
https://aws.amazon.com/tw/what-is/overfitting/
https://vocus.cc/article/66cbe07cfd897800017bd6e4