1) Giới Thiệu
🧠 Sigmoid và Softmax — hai cái tên bạn sẽ gặp đi gặp lại trong Deep Learning
Dù bạn đang làm image classification, NLP, hay recommendation — hai hàm này luôn xuất hiện ở lớp output. Nhưng chúng khác nhau thế nào? Khi nào dùng cái nào?
Nhiều người mới học Deep Learning thường nhầm lẫn giữa Sigmoid và Softmax — hoặc dùng sai ngữ cảnh. Bài viết này sẽ giải thích rõ ràng, trực quan với ví dụ cụ thể.
Tóm tắt 1 dòng
Sigmoid = mỗi output độc lập (0-1) — dùng cho binary / multi-label.
Softmax = tất cả outputs cộng lại = 1 — dùng cho multi-class (chọn 1 trong N).
2) Hàm Kích Hoạt (Activation Function) Là Gì?
⚡ Tại sao neural network cần activation function?
Nếu không có activation function, mạng neural dù bao nhiêu lớp cũng chỉ là một phép biến đổi tuyến tính — không thể học được patterns phức tạp.
Activation function thêm tính phi tuyến (non-linearity) vào mạng neural, cho phép nó học được các mối quan hệ phức tạp trong dữ liệu.
🔄 Hidden Layers
Dùng ReLU, GELU, Swish — để mạng học features phức tạp.
🎯 Output Layer
Dùng Sigmoid hoặc Softmax — để chuyển output thành xác suất.
Bài viết này tập trung vào Sigmoid và Softmax — hai hàm chủ yếu dùng ở output layer cho bài toán classification.
3) Sigmoid — Chi Tiết
📐 Hàm Sigmoid
Sigmoid "ép" bất kỳ số thực nào vào khoảng (0, 1) — biến output thành xác suất.
📝 Công thức
Sigmoid Function
$$\sigma(x) = \frac{1}{1 + e^{-x}}$$
Trong đó: x = giá trị đầu vào (logit), e = số Euler (≈ 2.718)
📊 Đặc điểm của Sigmoid
| Đặc điểm | Giá trị |
|---|---|
| Output range | (0, 1) |
| Khi x = 0 | σ(0) = 0.5 |
| Khi x rất lớn (+∞) | σ(x) → 1 |
| Khi x rất nhỏ (-∞) | σ(x) → 0 |
| Đạo hàm | σ'(x) = σ(x) · (1 - σ(x)) |
| Đạo hàm max | 0.25 (tại x = 0) |
🎯 Ví dụ trực quan
Input: x = 2.0
σ(2.0) = 1 / (1 + e⁻²) = 1 / (1 + 0.135) = 0.88 → 88% probability
Input: x = -3.0
σ(-3.0) = 1 / (1 + e³) = 1 / (1 + 20.09) = 0.047 → 4.7% probability
Input: x = 0
σ(0) = 1 / (1 + 1) = 0.5 → 50/50, không chắc chắn
💡 Cách nhớ
Sigmoid giống như công tắc mờ (dimmer switch) — không chỉ ON/OFF mà cho ra mức độ từ 0% đến 100%. Mỗi output độc lập — không phụ thuộc vào output khác.
⚠️ Nhược điểm của Sigmoid
Vanishing Gradient
Khi x rất lớn hoặc rất nhỏ → đạo hàm gần 0 → gradient "biến mất" → mạng học rất chậm ở hidden layers. Đây là lý do không nên dùng Sigmoid ở hidden layers.
Output không centered
Output luôn dương (0, 1) → gradient updates luôn cùng dấu → convergence chậm hơn so với hàm centered quanh 0 (như Tanh).
4) Softmax — Chi Tiết
📐 Hàm Softmax
Softmax chuyển một vector logits thành phân phối xác suất — tổng tất cả output = 1. Giống như "cuộc bầu cử" giữa các classes.
📝 Công thức
Softmax Function
$$\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{N} e^{x_j}}$$
Trong đó: x_i = logit của class thứ i, N = tổng số classes
📊 Đặc điểm của Softmax
| Đặc điểm | Giá trị |
|---|---|
| Output range | (0, 1) cho mỗi phần tử |
| Tổng outputs | Luôn = 1.0 |
| Input | Vector (nhiều giá trị cùng lúc) |
| Tính chất | Các output phụ thuộc lẫn nhau |
| Khuếch đại | Logit lớn nhất → xác suất cao nhất |
🎯 Ví dụ trực quan
Bài toán: Phân loại ảnh là Chó / Mèo / Chim
Model output (logits): [2.0, 1.0, 0.1]
| Class | Logit | e^logit | Softmax |
|---|---|---|---|
| 🐕 Chó | 2.0 | 7.389 | 0.659 (65.9%) |
| 🐱 Mèo | 1.0 | 2.718 | 0.242 (24.2%) |
| 🐦 Chim | 0.1 | 1.105 | 0.099 (9.9%) |
| Tổng | — | 11.212 | 1.000 (100%) |
→ Model dự đoán: Chó (65.9% confidence)
💡 Cách nhớ
Softmax giống như bầu cử — mỗi class là một ứng viên, tổng phiếu bầu = 100%. Class nào có logit cao nhất sẽ "thắng" với xác suất cao nhất. Các output phụ thuộc lẫn nhau — tăng 1 class = giảm class khác.
Softmax "khuếch đại" sự khác biệt
Nhờ hàm mũ (e^x), Softmax khuếch đại logit lớn nhất và triệt tiêu logit nhỏ. Ví dụ: logits [10, 1, 1] → softmax ≈ [0.9999, 0.00005, 0.00005]. Chênh lệch 9 ở logit → gần như 100% ở probability.
5) So Sánh Sigmoid vs Softmax
🔥 Đây là phần quan trọng nhất!
Hiểu sự khác biệt này giúp bạn thiết kế đúng output layer cho model.
| Tiêu chí | Sigmoid | Softmax |
|---|---|---|
| Input | 1 số (scalar) | 1 vector (nhiều số) |
| Output range | (0, 1) mỗi output | (0, 1) mỗi output, tổng = 1 |
| Outputs phụ thuộc? | ❌ Độc lập | ✅ Phụ thuộc lẫn nhau |
| Tổng outputs | Không cố định (có thể > 1) | Luôn = 1.0 |
| Bài toán | Binary, Multi-label | Multi-class (chọn 1) |
| Loss function | Binary Cross-Entropy | Categorical Cross-Entropy |
| Ý nghĩa | "Có hay không?" cho từng label | "Cái nào nhất?" trong N classes |
🎯 Ví dụ so sánh cực dễ hiểu
🏷️ Sigmoid — Gắn tag ảnh
Ảnh có thể có nhiều tag cùng lúc:
Chó: 95% ✅
Dễ thương: 88% ✅
Ngoài trời: 72% ✅
Mèo: 3% ❌
→ Mỗi tag độc lập, tổng không cần = 100%
📂 Softmax — Phân loại ảnh
Ảnh chỉ thuộc 1 loại duy nhất:
Chó: 65.9%
Mèo: 24.2%
Chim: 9.9%
→ Tổng = 100%, các class cạnh tranh nhau
6) Khi Nào Dùng Cái Nào?
📋 Quy tắc vàng
Hỏi: "Mỗi sample chỉ thuộc 1 class, hay có thể thuộc nhiều class?"
→ 1 class duy nhất = Softmax
→ Nhiều class cùng lúc = Sigmoid
✅ Dùng Sigmoid khi:
🔘 Binary Classification
Chỉ 2 class: Spam/Not Spam, Fraud/Legit, Positive/Negative. Output: 1 neuron + Sigmoid.
🏷️ Multi-label Classification
Ảnh tag: "chó", "dễ thương", "ngoài trời" — nhiều label đúng cùng lúc. Output: N neurons + Sigmoid.
🚪 Gate Mechanisms
LSTM gates, Attention weights — cần giá trị 0-1 làm "cổng" đóng/mở.
✅ Dùng Softmax khi:
📂 Multi-class Classification
Phân loại ảnh: Chó / Mèo / Chim — chỉ chọn 1. Output: N neurons + Softmax.
🔤 Language Model
Dự đoán từ tiếp theo trong vocab 50K tokens — chọn 1 token. Softmax trên toàn vocab.
📊 Phân phối xác suất
Bất kỳ khi nào cần output là probability distribution (tổng = 1).
📋 Bảng quyết định nhanh
| Bài toán | Số classes | Activation | Loss Function |
|---|---|---|---|
| Spam detection | 2 (binary) | Sigmoid | Binary Cross-Entropy |
| Sentiment (Pos/Neg/Neutral) | 3 (multi-class) | Softmax | Categorical CE |
| Image tagging | N (multi-label) | Sigmoid | Binary CE (per label) |
| MNIST digit recognition | 10 (multi-class) | Softmax | Categorical CE |
| Disease diagnosis | N (multi-label) | Sigmoid | Binary CE (per label) |
| Next word prediction | Vocab size | Softmax | Categorical CE |
7) Sai Lầm Thường Gặp
Sai lầm #1: Dùng Softmax cho multi-label
Ảnh có cả "chó" lẫn "mèo" → Softmax buộc model chỉ chọn 1 → sai! Phải dùng Sigmoid để mỗi label độc lập.
Sai lầm #2: Dùng Sigmoid cho multi-class
Phân loại 10 chữ số (0-9) bằng Sigmoid → model có thể output 0.8 cho cả số 3 lẫn số 8 → không có winner rõ ràng. Phải dùng Softmax.
Sai lầm #3: Sigmoid ở hidden layers
Dùng Sigmoid ở hidden layers → vanishing gradient → mạng học cực chậm. Hãy dùng ReLU / GELU cho hidden layers, chỉ dùng Sigmoid ở output.
Sai lầm #4: Sai loss function
Sigmoid + Categorical Cross-Entropy = sai!
Softmax + Binary Cross-Entropy = sai!
Phải match activation với loss cho đúng.
8) Code Minh Họa Python
💻 Thực hành luôn!
Dưới đây là code Python minh họa Sigmoid và Softmax — bạn có thể chạy ngay.
🔢 Sigmoid từ đầu
1import numpy as np23def sigmoid(x):4 return 1 / (1 + np.exp(-x))56# Ví dụ: Binary classification7logit = 2.08prob = sigmoid(logit)9print(f"Logit: {logit} → Sigmoid: {prob:.4f}")10# Output: Logit: 2.0 → Sigmoid: 0.88081112# Ví dụ: Multi-label (mỗi label độc lập)13logits = np.array([2.0, -1.0, 0.5, 3.0])14labels = ["Chó", "Mèo", "Ngoài trời", "Dễ thương"]15probs = sigmoid(logits)1617print("\nMulti-label Classification:")18for label, p in zip(labels, probs):19 status = "✅" if p > 0.5 else "❌"20 print(f" {label}: {p:.1%} {status}")21# Chó: 88.1% ✅ | Mèo: 26.9% ❌ | Ngoài trời: 62.2% ✅ | Dễ thương: 95.3% ✅🔢 Softmax từ đầu
1import numpy as np23def softmax(x):4 # Trừ max để tránh overflow (numerical stability)5 e_x = np.exp(x - np.max(x))6 return e_x / e_x.sum()78# Ví dụ: Multi-class classification9logits = np.array([2.0, 1.0, 0.1])10classes = ["🐕 Chó", "🐱 Mèo", "🐦 Chim"]11probs = softmax(logits)1213print("Multi-class Classification:")14for cls, p in zip(classes, probs):15 print(f" {cls}: {p:.1%}")16print(f"\nTổng xác suất: {probs.sum():.4f}")17# 🐕 Chó: 65.9% | 🐱 Mèo: 24.2% | 🐦 Chim: 9.9%18# Tổng: 1.0000🔧 Dùng với PyTorch
1import torch2import torch.nn as nn34# === SIGMOID: Binary / Multi-label ===5sigmoid = nn.Sigmoid()6logits = torch.tensor([2.0, -1.0, 0.5])7print("Sigmoid:", sigmoid(logits))8# tensor([0.8808, 0.2689, 0.6225])910# === SOFTMAX: Multi-class ===11softmax = nn.Softmax(dim=0)12logits = torch.tensor([2.0, 1.0, 0.1])13print("Softmax:", softmax(logits))14# tensor([0.6590, 0.2424, 0.0986])1516# Thực tế: dùng loss function có sẵn sigmoid/softmax17# Binary / Multi-label18loss_fn = nn.BCEWithLogitsLoss() # Sigmoid built-in1920# Multi-class21loss_fn = nn.CrossEntropyLoss() # Softmax built-inPro tip: PyTorch loss functions
nn.BCEWithLogitsLoss() = Sigmoid + Binary CE (tối ưu hơn tách riêng).nn.CrossEntropyLoss() = Softmax + Categorical CE (tối ưu hơn tách riêng).
→ Truyền logits trực tiếp, KHÔNG cần gọi sigmoid/softmax trước!
9) Kết Luận
✨ Tóm lại trong 30 giây
| Sigmoid | Softmax | |
|---|---|---|
| Ý nghĩa | "Có hay không?" (mỗi cái) | "Cái nào nhất?" (chọn 1) |
| Outputs | Độc lập | Phụ thuộc (tổng = 1) |
| Use case | Binary, Multi-label | Multi-class |
| Nhớ nhanh | Gắn tag (nhiều tag/ảnh) | Bầu cử (1 người thắng) |
🔑 Key Takeaways
- Sigmoid: output (0,1) độc lập — Binary & Multi-label classification
- Softmax: output tổng = 1 — Multi-class classification
- Luôn match activation + loss function cho đúng
- Không dùng Sigmoid ở hidden layers — dùng ReLU/GELU thay thế
- PyTorch: dùng
BCEWithLogitsLossvàCrossEntropyLoss— chúng đã tích hợp sẵn activation
🎓 Học Deep Learning cùng MinAI
Muốn thực hành Neural Networks, Activation Functions, Loss Functions và xây model từ đầu? Khám phá các khóa học tại MinAI — với AI Tutor hỗ trợ 24/7 và dự án thực hành!
Xem khóa học →