Phân loại: sigmoid, softmax, cross-entropy

Bài 3/725 phút

Khi cần dự đoán lớp (spam/không spam, chữ số 0–9), mô hình xuất ra logits rồi chuyển thành xác suất:

  • 2 lớp: sigmoid σ(z) = 1/(1 + e⁻ᶻ) → xác suất lớp dương (hồi quy logistic)
  • Nhiều lớp: softmax(z)ₖ = e^(zₖ) / Σ e^(zⱼ) → vector xác suất tổng bằng 1

Hàm mất mát tương ứng là cross-entropy: L = −log(xác suất của nhãn đúng). Đoán đúng tự tin (p ≈ 1) → L ≈ 0; đoán sai tự tin (p ≈ 0) → L rất lớn.

softmax_ce.py
def softmax(z):
    z = z - z.max(axis=-1, keepdims=True)   # ổn định số: tránh e^1000 = inf
    e = np.exp(z)
    return e / e.sum(axis=-1, keepdims=True)

logits = np.array([[2.0, 1.0, 0.1]])
p = softmax(logits)           # [[0.659 0.242 0.099]]
loss = -np.log(p[0, 0])       # nhãn đúng là lớp 0 → 0.417

Đánh giá mô hình phân loại không chỉ bằng accuracy. Với dữ liệu lệch (99% email không phải spam), mô hình luôn đoán "không spam" đạt 99% accuracy nhưng vô dụng — hãy xem thêm precision, recall, F1.

?softmax([1, 1, 1, 1]) bằng?