Loss — quy cái sai của model về một con số duy nhất
Loss biến toàn bộ sai lệch giữa dự đoán và nhãn thành một con số để tối ưu. Chọn loss nào là quyết định thiết kế vì nó định nghĩa thế nào là sai.
TL;DR: Model neural net có thể có hàng triệu trọng số. Để tự điều chỉnh, nó cần biết "mình đang sai bao nhiêu" quy về đúng một con số — đó là loss. Loss nhận vào dự đoán và nhãn thật của toàn tập, rồi trả về một số không âm: không sai thì gần 0, sai nhiều thì lớn. Bài này giải thích cơ chế, hai họ loss phổ biến (MSE cho đoán số, cross-entropy cho phân loại), và quan trọng nhất: chọn loss nào không phải kỹ thuật con — nó định nghĩa "sai" nghĩa là gì, và model sẽ tối ưu đúng điều đó, kể cả khi điều đó không phải điều bạn thực sự muốn.
1. "Model này sai" — vấn đề với nhận xét định tính
Bạn đang build service phân loại email spam. Chạy model lần đầu, nhìn một vài kết quả, thấy nhiều cái sai. Bạn nói: "Model này sai." Câu đó đúng — nhưng không đủ để máy tính làm gì cả.
Muốn model tự cải thiện — tức là điều chỉnh hàng triệu trọng số để ra dự đoán tốt hơn — nó cần một mục tiêu số học: "Sai bao nhiêu? Đang giảm hay tăng?" Không có số, không có hướng để đi.
Loss (hay hàm mất mát, loss function) là thứ biến nhận xét định tính "model này sai" thành một con số cụ thể mà quá trình học có thể tối ưu. Mọi vòng cập nhật trọng số đều bắt đầu từ đây.
Analogy — loss như build report tổng hợp: Sau khi chạy CI, bạn không muốn đọc danh sách 2.000 log lỗi lẻ rồi tự quyết định "đang cải thiện hay tệ hơn". Bạn muốn một con số: "3 errors, 0 warnings" — rồi push tiếp và xem con số đó giảm không. Loss làm y hệt cho neural net: thay vì "mẫu 1 sai 0.3, mẫu 2 sai 0.8, mẫu 3 đúng...", bạn có một con số tổng hợp cho cả tập. Mỗi epoch (vòng học) bạn nhìn xem loss giảm hay tăng — giống CI dashboard.
| Khái niệm lập trình | Tương đương trong ML |
|---|---|
| Build artifacts (code, config) | Trọng số model (params W) |
| Test suite chạy trên code | Tập huấn luyện chạy qua model |
| "3 errors" từ CI | Loss (sai lệch tổng hợp) |
| Fix lỗi, commit, push | Cập nhật trọng số (gradient descent) |
| Green build | Loss về gần 0 |
2. Cơ chế — loss là hàm so dự đoán với nhãn
Loss nhận vào hai thứ: dự đoán của model và nhãn thật từ dữ liệu — rồi trả về một số không âm. Dự đoán hoàn toàn đúng thì loss gần 0; sai nhiều thì loss lớn.
Loss của cả model không tính riêng lẻ từng mẫu mà lấy trung bình trên toàn tập huấn luyện, gộp thành một con số duy nhất:
// Compute model loss over a training set
total_loss <- 0
for each (prediction, label) in training_set:
sample_loss <- loss_fn(prediction, label)
total_loss <- total_loss + sample_loss
model_loss <- total_loss / size(training_set)
// model_loss: non-negative scalar; lower = fewer errors
Ví dụ trực quan: Tập trọng số hiện tại khiến model đoán sai nhiều email, loss = 0.85. Sau một vòng điều chỉnh trọng số, loss = 0.82. Loss giảm — đây là tín hiệu model đang học đúng hướng.

loss_fn(y_pred, y_true) nhận dự đoán và nhãn thật, trả về một con số duy nhất — loss của toàn model.
3. Hai họ loss phổ biến nhất
Loss không phải một hàm duy nhất — có nhiều lựa chọn tuỳ bài toán. Hai họ quan trọng nhất:
3.1 MSE — khi model phải đoán một con số
MSE (Mean Squared Error — Sai số bình phương trung bình) dùng cho bài toán đoán số (regression): đoán giá nhà, đoán thời gian deploy, đoán nhiệt độ.
MSE = average( (prediction - label) ^ 2 )
Bình phương có hai tác dụng: (1) luôn dương dù dự đoán thừa hay thiếu so với nhãn; (2) phạt nặng hơn khi lỗi lớn — sai 2 đơn vị bị tính là 4, sai 3 đơn vị bị tính là 9. Model ưu tiên tránh lỗi nghiêm trọng hơn là tối ưu đều đặn.
Ví dụ tính tay (đoán thời gian deploy, đơn vị phút):
| Lần deploy | Dự đoán | Thực tế | Hiệu | Bình phương |
|---|---|---|---|---|
| 1 | 3.0 | 5.0 | -2.0 | 4.0 |
| 2 | 7.0 | 6.0 | +1.0 | 1.0 |
| 3 | 2.0 | 4.0 | -2.0 | 4.0 |
| MSE | (4+1+4)/3 = 3.0 |
3.2 Cross-entropy — khi model phải chọn nhãn
Cross-entropy dùng cho bài toán phân loại (classification): spam/không spam, giao dịch bất thường/bình thường, chữ số trong ảnh.
Model trả về một xác suất (từ 0 đến 1) cho mỗi lớp. Cross-entropy đo theo mức độ tự tin: model càng tự tin mà càng sai thì phạt càng nặng.
cross_entropy_one_sample = - ln(prob_of_correct_class)
// ln: natural logarithm
// prob_of_correct_class: probability model assigned to the true label
Tại sao dùng -ln(p) mà không phải (1-p)? Lý do liên quan đến lý thuyết thông tin: -ln(p) đo "sự ngạc nhiên" (surprise) khi một sự kiện xảy ra. Khi p = 1.0 (model hoàn toàn chắc chắn và đúng), -ln(1) = 0 — không có gì đáng ngạc nhiên. Khi p = 0.01 (model gần như chắc chắn sai), -ln(0.01) ≈ 4.6 — rất ngạc nhiên. Và khi p tiến về 0, penalty tiến về vô cực — model bị phạt không giới hạn khi cực kỳ tự tin mà cực kỳ sai. Tính chất này quan trọng: nó ngăn model bao giờ được phép "100% chắc chắn sai".
So sánh nhanh:
| p (xác suất lớp đúng) | (1 - p) | -ln(p) |
|---|---|---|
| 0.99 | 0.01 | 0.010 |
| 0.70 | 0.30 | 0.357 |
| 0.50 | 0.50 | 0.693 |
| 0.10 | 0.90 | 2.303 |
| 0.01 | 0.99 | 4.605 |
Chú ý: khi p giảm từ 0.5 xuống 0.1, (1-p) tăng từ 0.5 lên 0.9 (tuyến tính), nhưng -ln(p) tăng từ 0.69 lên 2.30 (phi tuyến, nhanh hơn nhiều). Cross-entropy nhạy cảm hơn (1-p) với những lần model tự tin sai — và đó chính là đặc tính ta muốn.
Ví dụ tính tay (phân loại spam, cột "Xác suất lớp đúng" là xác suất model gán cho nhãn thật):
| Nhãn thật | Xác suất lớp đúng | Cross-entropy | |
|---|---|---|---|
| 1 | Spam | 0.90 (tự tin, đúng) | -ln(0.90) xấp xỉ 0.105 |
| 2 | Spam | 0.10 (tự tin đoán không-spam, sai) | -ln(0.10) xấp xỉ 2.303 |
| 3 | Spam | 0.70 (đúng, ít chắc hơn) | -ln(0.70) xấp xỉ 0.357 |
| Trung bình | (0.105+2.303+0.357)/3 xấp xỉ 0.922 |
Email 2 một mình đẩy average cross-entropy lên 0.922 — gần 9 lần so với email 1. Đây là đặc tính cốt lõi: cross-entropy nhạy cảm với sự tự tin sai lầm, không chỉ đếm số lần sai.
4. Vì sao chọn loss là quyết định thiết kế?
Đây là điểm thường bị bỏ qua nhất khi học về loss.
Loss không chỉ là "công cụ đo". Nó định nghĩa thế nào là sai — và model sẽ tối ưu đúng thứ loss đo, kể cả khi điều đó không phải điều bạn thực sự muốn.
Giả sử bạn build model phát hiện giao dịch bất thường (fraud detection). Tập huấn luyện có 10.000 giao dịch: 9.900 bình thường, 100 giao dịch fraud — dữ liệu lệch nặng.
Có một model đơn giản — gọi là model A — chỉ làm một việc: đoán "bình thường" cho tất cả mọi giao dịch, không phân biệt gì cả.
Hỏi: Model A có accuracy bao nhiêu phần trăm? Loss của nó trên tập này sẽ cao hay thấp? Từ accuracy và loss đó, bạn kết luận gì về chất lượng thật của model?
Viết ra câu trả lời của bạn trước khi đọc tiếp.
Kết quả thật: Model A đoán đúng 9.900/10.000 mẫu — accuracy 99%. Nếu dùng MSE tiêu chuẩn, loss thấp một cách ấn tượng — chỉ 0.01 (100 mẫu fraud × (0-1)² / 10.000). Giả sử model xuất xác suất p(bình thường) = 0.99 cho mọi mẫu (softmax không bao giờ ra đúng 1.0 hay 0.0): cross-entropy trung bình ≈ 0.056 — thấp hơn nhiều so với đoán ngẫu nhiên (0.693), dù không ngoạn mục bằng MSE vì 100 mẫu fraud bị phạt nặng (-ln(0.01) ≈ 4.6 mỗi mẫu) kéo trung bình lên. Về mọi con số, model trông "giỏi". Nhưng nó không phát hiện được một giao dịch fraud nào.
Điều này xảy ra vì loss bạn chọn không thực sự quan tâm đến fraud — nó chỉ quan tâm đến "đúng bao nhiêu phần trăm trên toàn tập". Model học được rằng bỏ qua toàn bộ fraud thì loss vẫn thấp, vì fraud chỉ chiếm 1%.
Nguyên nhân gốc rễ: dữ liệu lệch (class imbalance) khiến loss mặc định bị "lừa" bởi đa số. Model tối ưu đúng thứ bạn đặt vào loss — không phải thứ bạn muốn trong đầu khi code.
Lối thoát: chỉnh loss để nó phạt nặng hơn khi bỏ sót fraud (weighted loss, focal loss), hoặc dùng metric như recall/F1 để hướng dẫn thiết kế. Nhưng điều quan trọng ở bài này là nhận ra rằng chọn loss là lúc bạn nói với model "thế này là sai" — không phải việc làm tự động.
5. Loss khác metric như thế nào?
Loss và metric (accuracy, precision, recall, F1) đều liên quan đến chất lượng model — nhưng phục vụ hai mục đích khác nhau và có yêu cầu kỹ thuật khác nhau:
| Loss | Metric | |
|---|---|---|
| Ai dùng | Máy (để tối ưu trọng số) | Người (để đọc và ra quyết định) |
| Yêu cầu kỹ thuật | Liên tục, mượt — đổi trọng số một chút thì loss phải đổi tương ứng | Không cần mượt — accuracy là số đếm cứng |
| Ví dụ | MSE, cross-entropy | Accuracy, precision, recall, F1 |
Lý do loss phải mượt: bài 04-gradient-descent sẽ giải thích rằng trọng số được cập nhật dựa trên độ dốc (gradient) của loss theo từng trọng số. Nếu loss không liên tục (nhảy cóc), thay đổi nhỏ ở trọng số không làm loss thay đổi tương ứng — không có gradient, không có hướng cập nhật.
Hệ quả thực tế: loss và metric có thể đi ngược chiều nhau trong ngắn hạn. Loss giảm đều từng epoch không có nghĩa accuracy tăng từng epoch — accuracy nhảy theo bậc (mỗi khi model vượt ngưỡng đổi quyết định). Khi bạn thấy loss đang giảm nhưng accuracy plateau, đó thường là bình thường, không phải báo hiệu model hỏng.
6. Ba pitfall phổ biến
Pitfall 1 — Nhầm loss với accuracy. Loss và accuracy đo khác thứ. Loss nói "sai bao nhiêu theo thang đo của loss function"; accuracy nói "đúng bao nhiêu phần trăm theo đếm cứng". Loss thấp không đảm bảo accuracy cao, và ngược lại — đặc biệt khi dữ liệu lệch.
Pitfall 2 — So loss giữa hai model dùng loss khác nhau. MSE của model A và cross-entropy của model B là hai thang đo hoàn toàn khác nhau — so số trực tiếp không có ý nghĩa. "Model A loss = 0.3 thấp hơn model B loss = 2.1" không nói lên model nào tốt hơn về bài toán gốc.
Pitfall 3 — Loss thấp = sản phẩm tốt. Loss đo trên tập huấn luyện theo hàm bạn chọn. Nếu dữ liệu lệch hoặc hàm loss không phản ánh use case thật (như fraud detection trên), loss thấp có thể ẩn thất bại hoàn toàn. Luôn đọc metric nghiệp vụ (recall, precision, F1) cùng với loss.
7. Đào sâu
Nền tảng toán học của loss: Cross-entropy có gốc từ lý thuyết thông tin và ước lượng Maximum Likelihood (MLE). Minimize cross-entropy trên tập huấn luyện tương đương với tìm bộ tham số có khả năng cao nhất sinh ra dữ liệu quan sát — đây là nền lý thuyết tốt cho bài toán phân loại. Sách Deep Learning (Goodfellow, Bengio, Courville), Chương 5 "Machine Learning Basics", mục 5.5 "Maximum Likelihood Estimation", giải thích chi tiết mối liên hệ này. Sách miễn phí trực tuyến tại deeplearningbook.org/contents/ml.html.
8. Liên hệ các bài khác
- Dữ liệu, nhãn và chia tập — M1·03: nhãn đóng vai trò
expectedtrong mỗi mẫu huấn luyện. Loss chính là phép soactual(dự đoán) vớiexpected(nhãn) — gộp trên toàn tập thành một con số. - Neuron và trọng số — bài 01: trọng số là thứ model điều chỉnh khi học. Loss là thước đo cho biết điều chỉnh đó đang đúng hướng hay không.
- Gradient descent — bài 04: bài tiếp theo dùng loss để tính gradient — hướng điều chỉnh trọng số. Loss là đầu vào của gradient; cập nhật trọng số là kết quả.
- Mini-challenge đọc đường cong loss — bài 07: sau khi hiểu cơ chế loss, bài đó cho bạn chẩn đoán ba đường cong loss hỏng — ứng dụng trực tiếp những gì học ở đây.
9. Tóm tắt
- Loss biến "model này sai" thành một con số không âm duy nhất — trung bình sai lệch trên toàn tập huấn luyện.
- MSE dùng cho regression (đoán số): bình phương hiệu, phạt nặng lỗi lớn. Cross-entropy dùng cho classification: phạt nặng khi model tự tin mà sai.
- Chọn loss là quyết định thiết kế: model tối ưu đúng thứ loss đo. Dữ liệu lệch cộng với loss mặc định có thể cho accuracy 99% và sản phẩm hoàn toàn vô dụng.
- Loss mượt để tính được gradient; metric để người đọc và ra quyết định. Hai thứ đo khác nhau và có thể đi ngược chiều nhau ngắn hạn.
- Loss thấp không đảm bảo sản phẩm tốt — luôn đọc cùng metric nghiệp vụ.
Bài tiếp theo: Gradient descent — vòng lặp chỉnh trọng số cho bớt sai
10. Tự kiểm tra
Q1Loss trả về một con số hay một mảng giá trị? Tại sao cần đúng một con số để huấn luyện?▸
Q2MSE bình phương hiệu thay vì lấy giá trị tuyệt đối. Hai tác dụng của bình phương là gì?▸
Q3Model fraud detection đoán 'bình thường' cho tất cả giao dịch, đạt accuracy 99% và loss thấp. Vấn đề gốc rễ là gì?▸
Q4Vì sao loss phải 'mượt' (liên tục, đổi trọng số một chút thì loss đổi một chút), trong khi metric như accuracy thì không cần?▸
Q5Cross-entropy của một email với xác suất lớp đúng là 0.5 so với 0.9 — cái nào cho cross-entropy cao hơn và tại sao cơ chế đó hợp lý?▸
Q6Hai model: model A dùng MSE với loss = 0.3, model B dùng cross-entropy với loss = 1.4. Có thể kết luận model A tốt hơn không? Tại sao?▸
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