跳轉到

8.3 Overfitting

範例程式:Open In Colab

Overfitting 指的是模型把訓練資料記得很好,卻無法泛化到 validation 或 test data。本篇使用合成表格分類資料,先故意建立一個容量較大的 DNN 觀察過擬合,再加入 Dropout、L2 regularization 與 EarlyStopping 改善模型。

1. 學習目標

初學者常用 training accuracy 判斷模型好不好,但這很容易誤判。真正要觀察的是模型在未見資料上的表現。若出現以下現象,就要懷疑 overfitting:

  1. training loss 持續下降,但 validation loss 開始上升。
  2. training accuracy 很高,validation accuracy 明顯較低。
  3. 模型在訓練集表現很好,但 test set 表現不穩定。

本篇的重點不是只介紹正則化 API,而是建立一套「先診斷,再改善,再比較」的流程。

2. Overfitting 怎麼看?

最直接的方法是畫出 training 與 validation 的 learning curve:

曲線現象 解讀
train loss 與 val loss 都下降 模型仍在學習,通常是健康狀態
train loss 下降,val loss 上升 典型 overfitting
train accuracy 遠高於 val accuracy 記住訓練資料但泛化不足
train 與 val 都不好 可能是 underfitting 或資料/特徵不足

因此,訓練模型時至少要保留 validation set,並把 history.history 視覺化。

3. 範例資料

Notebook 使用 make_classification 產生二元分類表格資料。資料只有部分特徵真的有訊號,其餘是雜訊特徵。這種設定很適合觀察 overfitting,因為容量太大的模型會傾向把雜訊也學進去。

流程中會把資料切成 train、validation、test,並只用 training set fit StandardScaler,避免 validation/test 資訊提前洩漏到前處理階段。

4. Baseline:先建立容易過擬合的模型

Baseline 模型刻意使用較大的 Dense layers,而且不加 regularization:

model = tf.keras.Sequential([
    tf.keras.layers.Input(shape=(x_train.shape[1],)),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

這個模型不是為了追求最佳結果,而是為了讓讀者看見 overfitting 的曲線長什麼樣子。

5. 改善方法

本篇使用三種常見技巧:

方法 作用
Dropout 訓練時隨機關閉部分神經元,降低模型依賴特定路徑
L2 regularization 懲罰過大的權重,讓模型傾向學比較平滑的規則
EarlyStopping validation loss 不再改善時停止訓練,並回復最佳權重

regularized model 的概念如下:

model = tf.keras.Sequential([
    tf.keras.layers.Input(shape=(x_train.shape[1],)),
    tf.keras.layers.Dense(
        128,
        activation='relu',
        kernel_regularizer=tf.keras.regularizers.l2(1e-3)
    ),
    tf.keras.layers.Dropout(0.3),
    tf.keras.layers.Dense(
        64,
        activation='relu',
        kernel_regularizer=tf.keras.regularizers.l2(1e-3)
    ),
    tf.keras.layers.Dropout(0.3),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

6. 如何套用到自己的資料?

替換成自己的資料時,建議照以下順序處理:

  1. 先建立不加 regularization 的 baseline。
  2. 畫出 training 與 validation 的 loss/metric 曲線。
  3. 若出現 overfitting,再加入 Dropout、L2 或資料增強。
  4. 使用 EarlyStopping(restore_best_weights=True) 保留最佳 validation 表現。
  5. 最後只用 test set 做一次最終評估。

如果是圖片任務,也可以加入 data augmentation;如果是文字或表格任務,則常從模型容量、Dropout、L2、資料量與特徵品質開始調整。

7. 小結

Overfitting 不是單靠一個 API 解決,而是一個診斷與比較流程。先用 learning curve 找出問題,再用 regularization、Dropout 與 EarlyStopping 改善泛化能力,才能讓模型在未見資料上更可靠。