8.3 Overfitting
Overfitting 指的是模型把訓練資料記得很好,卻無法泛化到 validation 或 test data。本篇使用合成表格分類資料,先故意建立一個容量較大的 DNN 觀察過擬合,再加入 Dropout、L2 regularization 與 EarlyStopping 改善模型。
1. 學習目標
初學者常用 training accuracy 判斷模型好不好,但這很容易誤判。真正要觀察的是模型在未見資料上的表現。若出現以下現象,就要懷疑 overfitting:
- training loss 持續下降,但 validation loss 開始上升。
- training accuracy 很高,validation accuracy 明顯較低。
- 模型在訓練集表現很好,但 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. 如何套用到自己的資料?
替換成自己的資料時,建議照以下順序處理:
- 先建立不加 regularization 的 baseline。
- 畫出 training 與 validation 的 loss/metric 曲線。
- 若出現 overfitting,再加入 Dropout、L2 或資料增強。
- 使用
EarlyStopping(restore_best_weights=True)保留最佳 validation 表現。 - 最後只用 test set 做一次最終評估。
如果是圖片任務,也可以加入 data augmentation;如果是文字或表格任務,則常從模型容量、Dropout、L2、資料量與特徵品質開始調整。
7. 小結
Overfitting 不是單靠一個 API 解決,而是一個診斷與比較流程。先用 learning curve 找出問題,再用 regularization、Dropout 與 EarlyStopping 改善泛化能力,才能讓模型在未見資料上更可靠。