Overfitting & Underfitting
Overfit và underfit: hai cách học sai của model
Hai kiểu trượt thi: thuộc đề cũ và đọc mỗi lý thuyết
Thuộc lòng 10 đề cũ
Nhớ rõ từng câu trong 10 đề đã làm. Vào phòng thi gặp đề mới, lạ từ câu 1. Điểm rất thấp. Đây là overfit.
Đọc mỗi lý thuyết, không luyện đề
Đọc hiểu lý thuyết nhưng chưa luyện bài nào. Gặp đề thật, bí ngay từ đầu, không áp dụng được. Đây là underfit.
Model ML cũng vậy. Có hai cách trượt: học ít quá (underfit) hoặc học nhiều quá đến mức nhớ luôn cả nhiễu (overfit). Mục tiêu nằm ở giữa. Đủ phức tạp để bắt được quy luật, đủ đơn giản để không nhớ rác.
Bạn tăng bậc đa thức (polynomial degree) từ 1 lên 20 để fit một đường cong qua các điểm dữ liệu. Train loss (lỗi trên dữ liệu cũ) sẽ thay đổi thế nào?
Đây là 12 điểm dữ liệu train (cam)nằm quanh một đường cong “thật” (chưa hiện). Kéo thanh trượt để chọn bậc đa thức dùng để fit các điểm này. Quan sát đường xanh biến dạng thế nào, rồi bật test data để xem model có đoán đúng điểm mới không.
Hình minh họa
Good fit
Vừa đủ. Bắt được quy luật, bỏ qua nhiễu
Train loss (MSE)
0.029
Càng tăng bậc, train loss càng giảm về 0.
Test loss (MSE)
0.012
Bật “Hiện test” để quan sát.
Train loss thấp không có nghĩa model tốt. Mục tiêu thực sự là loss thấp trên dữ liệu mới, chưa hề thấy. Model overfit thuộc lòng train data (loss xấp xỉ 0) nhưng sai bét trên test, giống học sinh thuộc đáp án 10 đề cũ rồi đi thi trượt vì đề mới.
Good fit không phải train loss thấp nhất. Good fit là khoảng cách nhỏ giữa train loss và test loss, và cả hai đều ở mức hợp lý.
Bấm “Tiếp tục” để đi qua ba chế độ của cùng tập train: bậc 1, bậc 3, bậc 20. Mỗi chế độ kèm hình minh hoạ và phần chẩn đoán.
Bậc 1: đường thẳng
UnderfitModel chỉ có 2 tham số (độ dốc và chặn). Không đủ linh hoạt để uốn theo đỉnh và đáy của dữ liệu. Cả train loss lẫn test loss đều cao và gần bằng nhau.
- Train loss: cao (khoảng 0.55)
- Test loss: cao (khoảng 0.58)
- Triệu chứng: cả hai đều cao, khoảng cách nhỏ
- Cách chữa: tăng độ phức tạp, thêm feature
Early stopping nghĩa là dừng huấn luyện khi validation loss bắt đầu TĂNG trở lại (không chờ train loss về 0). Vì sao kỹ thuật này chống overfit hiệu quả?
Bên dưới là biểu đồ kinh điển. Đường train loss (xanh dương) luôn giảm. Đường val loss (đỏ) giảm rồi tăng. Đường xanh lá đứt nét đánh dấu điểm early stop.
Giải thích
Khi huấn luyện một model, có hai loại lỗi hoàn toàn khác nhau cần phân biệt: lỗi trên dữ liệu đã thấy (train error) và lỗi trên dữ liệu chưa thấy (test error). Mục tiêu cuối cùng luôn là thu nhỏ test error, vì chỉ khi đó model mới thực sự hữu ích.
Generalization gap(khoảng cách tổng quát hoá) chính là khoảng cách giữa “điểm bài tập về nhà” và “điểm thi”. Mục tiêu là giữ khoảng cách này nhỏ. Không phải bằng cách hạ train error về 0, mà bằng cách chọn model đủ linh hoạt vừa phải.
So sánh hai model ở hai cực
Cùng một tập train, hai đường cong khác nhau kinh khủng.
Underfit là học chưa đủ
- Model quá đơn giản (ít tham số)
- Cả train và test error đều cao
- Ẩn dụ: chỉ đọc lý thuyết, chưa luyện đề
- Giải pháp: tăng độ phức tạp, thêm feature, huấn luyện lâu hơn
Bảng chẩn đoán nhanh
| Triệu chứng | Underfit | Good fit | Overfit |
|---|---|---|---|
| Train error | Cao | Thấp | Rất thấp |
| Test error | Cao | Thấp | Cao |
| Khoảng cách | Nhỏ | Nhỏ | Lớn |
| Độ phức tạp | Quá thấp | Vừa phải | Quá cao |
- Chọn model đủ lớn để ban đầu overfit nhẹ trên train.
- Dùng cross-validation hoặc train/val/test split để đo generalization gap.
- Nếu overfit: thêm dữ liệu, early stopping, regularization.
- Nếu underfit: tăng số tham số, thêm feature, train lâu hơn.
- Lặp lại tới khi val loss không còn tốt hơn được nữa.
- Underfit là model quá đơn giản: train và test loss đều cao. Overfit là model quá phức tạp: train loss thấp, test loss cao.
- Good fit không phải train loss thấp nhất, mà là khoảng cách nhỏ giữa train loss và test loss.
- Early stopping: dừng khi val loss bắt đầu tăng. Miễn phí và cực kỳ hiệu quả.
- Quy trình: bắt đầu cho overfit nhẹ, rồi dùng regularization hoặc thêm dữ liệu để thu hẹp gap. Đừng bao giờ bắt đầu với một model quá nhỏ.
Kiểm tra hiểu biết
Train loss = 0.01, validation loss = 2.5. Model đang gặp vấn đề gì?