Softmax
Softmax chuyển một vector logit thành các xác suất có tổng bằng một. Nội dung đề cập đến công thức, temperature, tính ổn định số, attention và code.
Softmax là một hàm biến vector các điểm số thô, gọi là logits, thành một phân phối xác suất: mọi đầu ra nằm trong khoảng từ 0 đến 1 và tổng các đầu ra chính xác bằng 1. Với vector z, hàm tính softmax(z)ᵢ = e^(zᵢ) / Σⱼ e^(zⱼ), lấy hàm mũ của từng điểm số rồi chia cho tổng tất cả các giá trị hàm mũ. Softmax là lớp đầu ra tiêu chuẩn của mạng nơ-ron dùng để chọn một lớp trong nhiều lớp; hàm này chuyển điểm tương đồng thành trọng số bên trong cơ chế attention của các Transformer, đồng thời chuyển điểm số của model ngôn ngữ trên toàn bộ từ vựng thành xác suất token tiếp theo. Tên gọi phản ánh việc đây là phiên bản trơn, khả vi của argmax, vốn sẽ dồn toàn bộ xác suất vào điểm số lớn nhất duy nhất.
Cách Softmax hoạt động#
Hàm mũ khiến mọi đầu ra đều dương và khuếch đại chênh lệch giữa các điểm số, vì vậy logit lớn nhất chiếm phần xác suất vượt trội. Softmax giữ nguyên thứ tự của các logit, nên điểm số cao nhất luôn nhận xác suất cao nhất. Chỉ chênh lệch giữa các logit mới quan trọng: cộng cùng một hằng số vào mọi logit không làm thay đổi đầu ra. Các thư viện tận dụng tính chất này để đảm bảo ổn định số học bằng cách trừ logit lớn nhất trước khi lấy hàm mũ, vì e^1000 gây tràn số dấu phẩy động 32-bit.
Nhiệt độ T kiểm soát mức độ tập trung của phân phối: softmax(z / T). Giá trị T nhỏ hơn 1 làm phân phối tập trung hơn vào lớp đứng đầu, còn giá trị lớn hơn 1 làm phân phối dàn đều hơn. Công thức tương tự xuất hiện trong cơ học thống kê dưới dạng phân phối Boltzmann, trong đó T đúng nghĩa là nhiệt độ. Đoạn mã PyTorch bên dưới minh họa cả hai tác động:
import torch
logits = torch.tensor([2.0, 1.0, 0.1])
# Divide logits by a temperature before softmax: low sharpens, high flattens
for temperature in [0.5, 1.0, 2.0]:
probs = torch.softmax(logits / temperature, dim=0)
print(f"T={temperature}: {[round(p, 3) for p in probs.tolist()]}")
# Adding a constant leaves softmax unchanged, so libraries subtract the max to avoid overflow
big = logits + 1000
naive = big.exp() / big.exp().sum()
print(f"Naive: {naive.tolist()}, torch.softmax: {[round(p, 3) for p in torch.softmax(big, dim=0).tolist()]}")Với T = 1, các logit 2.0, 1.0 và 0.1 trở thành [0.659, 0.242, 0.099]. Giảm nhiệt độ xuống một nửa làm phân phối tập trung hơn thành [0.864, 0.117, 0.019], còn tăng gấp đôi làm phân phối dàn đều hơn thành [0.502, 0.304, 0.194]. Khi cộng 1,000 vào mọi logit, công thức ngây thơ bị tràn số và in ra [nan, nan, nan], trong khi torch.softmax vẫn trả về [0.659, 0.242, 0.099].
Softmax trong quá trình huấn luyện#
Các bộ phân loại được huấn luyện bằng softmax kết hợp với hàm mất mát cross-entropy. Hàm mất mát là −log(pᵧ), tức log âm của xác suất gán cho lớp đúng y, và gradient theo các logit đơn giản là p − y, tức xác suất dự đoán trừ nhãn one-hot. Vì vậy, các framework kết hợp hai phép tính này: CrossEntropyLoss của PyTorch nhận logits thô và tính log-softmax bên trong, ổn định hơn so với việc lấy log của các xác suất được tính riêng. Model được huấn luyện theo cách này xuất ra logits; softmax chỉ được áp dụng khi cần xác suất tại thời điểm suy luận.
Các trường hợp sử dụng Softmax#
- Phân loại ảnh: Lớp cuối cùng của bộ phân loại tạo ra một logit cho mỗi lớp, còn softmax chuyển chúng thành điểm số độ tin cậy mà người dùng thấy.
- Attention: Transformer tính softmax(QKᵀ / √dₖ) trên các điểm tương đồng giữa một query và từng key, nhờ đó tổng trọng số attention của mỗi token bằng 1. Phép chia cho √dₖ ngăn điểm số tăng theo số chiều và làm softmax bão hòa.
- Sinh văn bản: Model ngôn ngữ lớn (LLM) áp dụng softmax trên từ vựng gồm hàng chục hoặc hàng trăm nghìn token ở mỗi bước, và nhiệt độ lấy mẫu chính là T nêu trên. Sau đó, lấy mẫu hạt nhân chọn từ tập token nhỏ nhất có tổng xác suất đạt đến một ngưỡng.
- Học tăng cường: Softmax trên các giá trị hành động tạo ra một policy thường chọn hành động tốt nhất nhưng vẫn khám phá các hành động khác; nhiệt độ giúp cân bằng giữa khám phá và khai thác.
Các model phân loại YOLO26 áp dụng softmax trong classification head khi suy luận, còn thuộc tính probs của mỗi kết quả chứa toàn bộ phân phối trên 1,000 lớp ImageNet:
from ultralytics import YOLO
# Load a YOLO26 classification model trained on ImageNet
model = YOLO("yolo26n-cls.pt")
results = model("https://ultralytics.com/images/bus.jpg")
# probs holds the softmax output of the classification head
probs = results[0].probs
for index, conf in zip(probs.top5, probs.top5conf.tolist()):
print(f"{results[0].names[index]}: {conf:.3f}")
print(f"Sum over all 1,000 classes: {probs.data.sum().item():.3f}")Đoạn mã in ra năm lớp có khả năng cao nhất cùng xác suất tương ứng; tổng xác suất của cả 1,000 lớp được in là 1.000 vì head trả về một phân phối softmax.
Softmax và các hàm liên quan#
- Sigmoid: Nén độc lập từng điểm số vào khoảng từ 0 đến 1, do đó tổng đầu ra không nhất thiết bằng 1. Sigmoid phù hợp với các bài toán nhị phân và đa nhãn, chẳng hạn ảnh có cả người và ba lô; các bộ phát hiện vật thể cũng thường dùng hàm này để tính điểm cho từng lớp. Với hai lớp, softmax tương đương chính xác với sigmoid của hiệu giữa hai logit.
- Argmax: Trả về chỉ số của điểm số lớn nhất, tạo ra quyết định cứng không có gradient. Softmax giữ nguyên thứ hạng nhưng vẫn khả vi nên có thể được huấn luyện; lấy argmax của các xác suất softmax cho cùng kết quả với lấy argmax của logits.
- Log-softmax: Logarit của softmax, được tính trực tiếp để đảm bảo ổn định số học và được hàm mất mát cross-entropy sử dụng.
- Hiệu chỉnh nhiệt độ: Một phương pháp hiệu chỉnh khớp một giá trị nhiệt độ duy nhất trên dữ liệu validation sau khi huấn luyện, để xác suất softmax phản ánh đúng tần suất model thực sự dự đoán đúng. Phương pháp này không thay đổi lớp dự đoán vì chia mọi logit cho cùng một T dương sẽ giữ nguyên thứ tự của chúng.










