Mini-challenge: chẩn đoán ba đường cong huấn luyện hỏng
Ba ca huấn luyện thất bại, mỗi ca một đường cong loss kèm cấu hình. Tự chẩn đoán nguyên nhân và đề xuất cách sửa trước khi đọc lời giải.
TL;DR: Ba ca huấn luyện từ dự án banking/fintech nội bộ, mỗi ca đến với cấu hình mạng cụ thể và bảng loss ghi theo epoch. Nhiệm vụ: đọc hai đường train và validation trong từng ca, viết chẩn đoán nguyên nhân và đề xuất siêu tham số cần sửa — trước khi mở Lời giải. Kỹ năng bài này xây dựng là đọc hình dạng đường cong thành nguyên nhân: xu hướng tổng thể, mức khi ổn định, và khoảng cách giữa hai đường là ba thứ bạn cần nhìn. Bảng tổng hợp triệu chứng — nguyên nhân — hành động ở phần Mở rộng là thứ đáng bookmark cho những lần debug tiếp theo.
Mạng nhiều lớp tuyến tính tương đương một lớp duy nhất; chính hàm phi tuyến (ReLU, sigmoid) tạo ra sức mạnh biểu diễn khi chồng lớp. Sức chứa của mạng tăng theo số lớp và số neuron — mạng quá nhỏ chỉ vẽ được ranh giới thẳng cho bài toán cong.
Vòng lặp huấn luyện: forward pass → tính loss → tính gradient → cập nhật trọng số. Learning rate là bước nhảy mỗi lần cập nhật — quá lớn thì vượt điểm cực tiểu mỗi bước, quá nhỏ thì hội tụ rất chậm. Đường cong loss lành mạnh giảm đều và ổn định qua từng epoch.
Overfitting: model học thuộc tập train nhưng không khái quát hoá được ra dữ liệu mới. Dấu hiệu kinh điển: train loss tiếp tục giảm trong khi validation loss chạm đáy rồi bắt đầu tăng lên. Validation set là thước đo trung thực duy nhất về khả năng khái quát hoá.
🎯 Đề bài
Ba ca huấn luyện xảy ra trong môi trường dev/UAT nội bộ ngân hàng. Mỗi ca có bối cảnh, cấu hình mạng, và bảng loss theo epoch.
Ca A — Loss dao động loạn, không có xu hướng
Bối cảnh: Đội tín dụng đang UAT model phân loại nhị phân dự đoán khả năng trả nợ. Input gồm 50 feature số từ lịch sử giao dịch. Tập huấn luyện: 8 000 mẫu; tập validation: 2 000 mẫu.
Cấu hình:
| Siêu tham số | Giá trị |
|---|---|
| Kiến trúc | 3 lớp ẩn: 128, 64, 32 neuron — activation ReLU |
| Learning rate | 0.1 |
| Batch size | 64 |
| Số epoch | 30 |
| Optimizer | SGD thuần (không momentum) |
Loss theo epoch:
| Epoch | Train Loss | Val Loss |
|---|---|---|
| 1 | 1.42 | 1.38 |
| 2 | 0.95 | 0.92 |
| 3 | 1.87 | 1.91 |
| 4 | 1.23 | 1.19 |
| 5 | 2.13 | 2.24 |
| 6 | 0.78 | 0.82 |
| 7 | 1.51 | 1.56 |
| 8 | 0.83 | 0.86 |
| 9 | 1.98 | 2.01 |
| 10 | 1.45 | 1.52 |
| 15 | 0.88 | 0.90 |
| 20 | 1.97 | 2.04 |
| 25 | 0.67 | 0.71 |
| 30 | 1.23 | 1.30 |
Ca B — Loss phẳng ở mức cao từ sớm
Bối cảnh: Cùng bài toán tín dụng như Ca A (8 000 mẫu train / 2 000 val, 50 feature), nhưng đội infra đề xuất model nhỏ hơn để giảm latency API nội bộ.
Cấu hình:
| Siêu tham số | Giá trị |
|---|---|
| Kiến trúc | 1 lớp ẩn, 8 neuron — activation ReLU |
| Learning rate | 0.001 |
| Batch size | 64 |
| Số epoch | 50 |
| Optimizer | Adam |
Loss theo epoch:
| Epoch | Train Loss | Val Loss |
|---|---|---|
| 1 | 1.64 | 1.67 |
| 5 | 0.91 | 0.93 |
| 10 | 0.74 | 0.76 |
| 20 | 0.68 | 0.70 |
| 30 | 0.67 | 0.69 |
| 40 | 0.67 | 0.68 |
| 50 | 0.67 | 0.68 |
Ca C — Train tốt nhưng validation đi ngược chiều
Bối cảnh: Đội phòng chống gian lận UAT model phân loại giao dịch bất thường. Dữ liệu nội bộ hạn chế: chỉ có 100 mẫu huấn luyện và 50 mẫu validation đã được gán nhãn.
Cấu hình:
| Siêu tham số | Giá trị |
|---|---|
| Kiến trúc | 4 lớp ẩn: 256, 128, 64, 32 neuron — activation ReLU |
| Learning rate | 0.001 |
| Batch size | 32 |
| Số epoch | 60 |
| Optimizer | Adam |
Loss theo epoch:
| Epoch | Train Loss | Val Loss |
|---|---|---|
| 1 | 1.73 | 1.71 |
| 5 | 0.94 | 0.97 |
| 10 | 0.62 | 0.67 |
| 20 | 0.38 | 0.53 |
| 30 | 0.22 | 0.71 |
| 40 | 0.14 | 0.89 |
| 50 | 0.09 | 1.12 |
| 60 | 0.06 | 1.31 |
✍️ Phần việc của bạn
Cho mỗi ca, trả lời ba câu trước khi kéo xuống Lời giải:
- Nguyên nhân: Hình dạng đường loss cho thấy vấn đề gì?
- Siêu tham số: Bạn sẽ thay đổi gì để sửa?
- Dấu hiệu phân biệt: Triệu chứng này khác với hai ca còn lại như thế nào?
💡 Gợi ý
- Xu hướng tổng thể: Đường train loss có giảm theo chiều đơn điệu từ epoch đầu đến epoch cuối không, hay nó dao động qua lại?
- Mức khi ổn định: Khi loss không còn thay đổi nhiều, nó đang ở mức cao hay thấp — và chạy thêm epoch có giúp gì không?
- Hình dạng và khoảng cách: Hai đường train/validation di chuyển cùng chiều hay ngược chiều, và khoảng cách giữa chúng thay đổi thế nào theo thời gian?
✅ Lời giải
Ca A — Learning rate quá lớn
Phân tích: Không có xu hướng giảm ổn định — loss dao động từ 0.67 đến 2.24 qua 30 epoch mà không hội tụ. Đây là triệu chứng điển hình của learning rate quá lớn: bước nhảy lớn hơn "bề rộng" vùng cực tiểu, trọng số vượt đáy rồi bị kéo ngược lại mỗi bước. Train và val dao động đồng pha và khoảng cách nhỏ — model chưa ổn định đủ lâu để học thuộc tập train (phân biệt với Ca C, nơi hai đường tách xa và ngược chiều).
Cách sửa: Giảm lr ít nhất 10 lần (0.1 → 0.01); nếu còn dao động, thử 0.001. Phương án tốt hơn: dùng Adam thay SGD thuần — tự điều chỉnh lr per-parameter, ít nhạy cảm hơn. Dấu hiệu sửa đúng: loss giảm đều trong 3–5 epoch đầu, không còn bước tăng đột biến.
Bẫy chẩn đoán nhầm: Dữ liệu nhiễu cũng gây dao động loss, nhưng xu hướng tổng thể vẫn giảm dần theo epoch. Ca A không có xu hướng giảm nào trong 30 epoch — dấu hiệu tách bạch. Kiểm thêm: giảm lr một nửa; nếu dao động thu hẹp ngay ở 5 epoch đầu thì là lr; nếu không đổi thì mới nghĩ đến dữ liệu.
Ca B — Model thiếu sức chứa (underfit)
Phân tích: Loss train giảm từ 1.64 xuống 0.68 trong 20 epoch đầu — có học được. Nhưng từ epoch 20, cả hai đều phẳng — train ở 0.67–0.68, val ở 0.68–0.70 — dù huấn luyện thêm 30 epoch nữa. Khoảng cách giữa hai đường chỉ 0.01–0.02. Mạng 1 lớp 8 neuron không đủ biểu diễn các mối quan hệ phi tuyến trong dữ liệu tín dụng 50 feature. Mấu chốt: train loss cao nghĩa là model không fit được ngay cả dữ liệu nó đã thấy nhiều lần.
Cách sửa: Tăng sức chứa mạng: thay 1 lớp 8 neuron bằng 3 lớp (128, 64, 32 neuron), giữ nguyên learning rate 0.001. Sau khi tăng sức chứa, nếu val loss cũng giảm theo thì model đang học tốt; nếu val loss tăng lên thì đã chuyển sang vùng overfit.
Bẫy chẩn đoán nhầm: Nhầm phổ biến nhất: "cần thêm dữ liệu". Cách phân biệt: nếu train loss cũng cao và phẳng dù model đã thấy 8 000 mẫu hàng chục lần, model không có khả năng học — thêm dữ liệu chỉ cho thêm bài tập mà model không làm được. Nhầm thứ hai: lr nhỏ cũng làm loss giảm chậm, nhưng vẫn giảm đều; Ca B phẳng hoàn toàn từ epoch 20, thêm epoch không giúp gì.
Ca C — Overfit
Phân tích: Train loss giảm đều và trơn tru từ 1.73 xuống 0.06 qua 60 epoch. Val loss giảm ban đầu — đạt mức thấp nhất 0.53 ở epoch 20 — rồi tăng dần đến 1.31 ở epoch 60. Khoảng cách tại epoch 60: chênh 1.25. Mạng 4 lớp có hàng chục nghìn tham số nhưng chỉ 100 mẫu — từ khoảng epoch 20, model bắt đầu học thuộc đặc điểm riêng của từng mẫu train, kể cả noise. Epoch tốt nhất để dừng: khoảng epoch 20, khi val loss còn ở mức thấp nhất trước khi bắt đầu tăng.
Cách sửa: Ba hướng, thường kết hợp: (1) Giảm sức chứa — thử 2 lớp (64, 32 neuron). (2) Thêm regularization — Dropout 20–30% hoặc L2 weight decay; cả hai làm tăng train loss một chút nhưng thu hẹp khoảng cách train/val. (3) Early stopping — dừng khi val loss tăng liên tiếp 5 epoch. Về lâu dài: thu thập thêm dữ liệu gán nhãn.
Bẫy chẩn đoán nhầm: "Train loss đang giảm, chạy thêm 100 epoch nữa thì val sẽ tốt hơn." Sai: val đã bắt đầu tăng từ epoch 20 — chạy thêm chỉ đẩy train xuống thêm và val lên thêm. Nhầm khác: lr nhỏ làm cả hai đường giảm đều nhau (khoảng cách nhỏ và ổn định); Ca C có hai đường tách xa theo hướng ngược nhau — dấu hiệu tách bạch rõ ràng.
🎓 Mở rộng
| Hình dạng hai đường loss | Khoảng cách train / val | Nguyên nhân | Hành động sửa |
|---|---|---|---|
| Dao động loạn giữa các epoch, không có xu hướng giảm ổn định | Nhỏ — cả hai dao động đồng pha | Learning rate quá lớn | Giảm lr 10 lần; dùng Adam; thêm scheduler |
| Giảm nhanh rồi phẳng ở mức cao — thêm epoch không giúp | Rất nhỏ — hai đường gần trùng nhau | Model thiếu sức chứa (underfit) | Tăng số lớp hoặc số neuron |
| Train giảm đều và trơn tru, val chạm đáy rồi tăng dần | Lớn và ngày càng tăng | Overfit — model quá lớn so với dữ liệu | Giảm sức chứa, dropout, L2, early stopping |
Trong thực tế, một đường cong có thể mang dấu hiệu của nhiều vấn đề cùng lúc — learning rate hơi lớn cộng với model hơi overfit tạo ra đường cong vừa dao động vừa tách xa. Chẩn đoán đúng cần can thiệp từng biến một: giảm lr trước, quan sát 10 epoch, rồi mới đánh giá sức chứa và regularization.
✨ Điều bạn vừa làm được
Bạn vừa đọc đường cong loss như một công cụ chẩn đoán — không phải chờ kết quả cuối cùng mà phán đoán vấn đề ngay trong quá trình huấn luyện. Kỹ năng này áp dụng trực tiếp vào mọi lần bạn chạy model: bật TensorBoard hoặc print loss theo epoch, nhìn hình dạng, và biết mình cần làm gì tiếp theo.
Liên hệ các bài khác
- Xếp lớp và phi tuyến — sức chứa mạng (số lớp, số neuron) là yếu tố trực tiếp tạo ra Ca B.
- Gradient Descent — vòng lặp chỉnh trọng số — vòng lặp huấn luyện và vai trò của learning rate là nền tảng để đọc Ca A.
- Overfitting và data leakage — bài này mổ sâu cơ chế overfit và vai trò của validation set. Ca C là biểu hiện trực quan của điều bài đó cảnh báo.
- Tổng kết module — cheat sheet và self-assessment cho toàn bộ module, tổng hợp cả ba ca vào bức tranh lớn hơn.
Bài tiếp theo: Tổng kết: Não nhân tạo vừa đủ
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên