Sigmoid
Hàm sigmoid ánh xạ mọi số thực thành một giá trị trong khoảng từ 0 đến 1. Nội dung đề cập đến công thức, gradient, đầu ra xác suất, gate và code PyTorch.
Hàm sigmoid, σ(x) = 1 / (1 + e^(−x)), ánh xạ mọi số thực thành một giá trị từ 0 đến 1 theo đường cong hình chữ S: đầu vào âm lớn cho đầu ra gần 0, đầu vào dương lớn cho đầu ra gần 1, còn đầu vào bằng 0 cho giá trị chính xác 0.5. Trong học máy (ML), “sigmoid” hầu như luôn chỉ hàm logistic, cùng đường cong biến điểm số tuyến tính thành xác suất trong hồi quy logistic. Trong mạng nơ-ron (NN), sigmoid có ba vai trò: ban đầu đây là hàm kích hoạt cho các lớp ẩn; hàm chuyển điểm số cuối thành xác suất cho đầu ra nhị phân và đa nhãn; đồng thời hoạt động như công tắc bật-tắt mềm trong các cổng của tế bào hồi quy và các lớp có cổng khác. Các lớp ẩn sau đó chuyển sang dùng những hàm như ReLU, vì vậy trong các model hiện nay, hầu hết hàm sigmoid nằm ở đầu ra và trong các cổng.
Công thức và tính chất#
Sigmoid đối xứng quanh điểm giữa, σ(−x) = 1 − σ(x), và hàm nghịch đảo của nó là logit, log(p / (1 − p)), chuyển xác suất trở lại log-odds. Vì vậy, đầu ra thô của mạng trước khi qua sigmoid được gọi là logit. Đạo hàm có dạng gọn σ′(x) = σ(x)(1 − σ(x)), đạt cực đại 0.25 khi x = 0 và giảm dần về 0 khi đường cong phẳng ra ở hai đầu; hiện tượng này gọi là bão hòa. Đoạn mã PyTorch dưới đây tính đầu ra và gradient tại năm điểm:
import torch
x = torch.tensor([-6.0, -2.0, 0.0, 2.0, 6.0], requires_grad=True)
y = torch.sigmoid(x)
# Backpropagate to get the derivative sigmoid(x) * (1 - sigmoid(x)) at each input
y.sum().backward()
print(f"Sigmoid: {[round(v, 4) for v in y.tolist()]}")
print(f"Gradient: {[round(v, 4) for v in x.grad.tolist()]}")Kết quả in ra các giá trị sigmoid [0.0025, 0.1192, 0.5, 0.8808, 0.9975] và gradient [0.0025, 0.105, 0.25, 0.105, 0.0025]. Tại ±6, đầu ra cách giới hạn của nó không quá 0.0025 và gradient nhỏ hơn 100 lần so với tại 0, vì vậy đầu vào trong khoảng đó hầu như không làm thay đổi trọng số tạo ra nó.
Sigmoid trong các lớp ẩn#
Các mạng nhiều lớp đời đầu dùng sigmoid ở mọi lớp ẩn, dẫn đến hai vấn đề. Lan truyền ngược nhân đạo hàm của từng hàm kích hoạt qua mỗi lớp; vì đạo hàm sigmoid không bao giờ vượt quá 0.25, qua mười lớp sigmoid, riêng các đạo hàm đó khiến gradient có độ lớn tối đa chỉ bằng 0.25¹⁰, nhỏ hơn một phần triệu; đây là vấn đề vanishing gradient. Đầu ra sigmoid cũng luôn dương, vì vậy trong mỗi lần cập nhật, mọi gradient trọng số của một neuron nhận các đầu ra đó đều cùng dấu, khiến trọng số chỉ có thể dịch chuyển zig-zag về phía giá trị tối ưu. Tanh đưa đầu ra về quanh 0, còn Xavier Glorot và Yoshua Bengio chứng minh vào năm 2010 rằng giá trị trung bình dương của sigmoid khiến lớp ẩn trên cùng của một mạng sâu được khởi tạo ngẫu nhiên rơi vào trạng thái bão hòa. ReLU loại bỏ cả hai vấn đề và trở thành hàm mặc định cho các lớp ẩn; các hàm kế nhiệm trơn như SiLU, x · σ(x), vẫn dùng sigmoid bên trong làm cổng.
Sigmoid làm lớp đầu ra#
Với phân loại nhị phân, một đầu ra z duy nhất trở thành p = σ(z), xác suất dự đoán cho lớp dương; ngưỡng 0,5 trên p tương đương ngưỡng 0 trên z. Quá trình huấn luyện kết hợp sigmoid với binary cross-entropy, có gradient theo logit đơn giản là p − y, tức xác suất dự đoán trừ nhãn. Các framework hợp nhất hai phép tính này để đảm bảo ổn định số: BCEWithLogitsLoss của PyTorch nhận logit thô và dùng thủ thuật log-sum-exp nội bộ, tránh lấy log của xác suất đã làm tròn chính xác thành 0 hoặc 1.
Khi các nhãn có thể đồng xuất hiện, model dùng một sigmoid cho mỗi nhãn; thiết lập này gọi là phân loại đa nhãn. Ngược lại, Softmax khiến các lớp cạnh tranh để chia nhau một đơn vị xác suất, phù hợp với các nhãn loại trừ lẫn nhau:
import torch
# Logits from a classifier for the labels "person", "backpack", and "car"
logits = torch.tensor([2.0, 1.5, -3.0])
# Sigmoid scores each label on its own; softmax makes the labels compete for one total
sigmoid_probs = torch.sigmoid(logits)
softmax_probs = torch.softmax(logits, dim=0)
print(f"Sigmoid: {[round(p, 3) for p in sigmoid_probs.tolist()]}, sum {sigmoid_probs.sum():.3f}")
print(f"Softmax: {[round(p, 3) for p in softmax_probs.tolist()]}, sum {softmax_probs.sum():.3f}")Các điểm sigmoid [0.881, 0.818, 0.047] có tổng bằng 1.746, nên cả “person” và “backpack” đều vượt ngưỡng 0.5; còn softmax phân chia cùng các logit thành [0.62, 0.376, 0.004] và chỉ “person” còn trên 0.5. Các model phát hiện YOLO26 tính điểm cho từng lớp bằng sigmoid độc lập được huấn luyện với BCEWithLogitsLoss, vì vậy điểm lớp của một bounding box không nhất thiết phải có tổng bằng 1; các model pose YOLO26 áp dụng sigmoid lên logit độ hiển thị của mỗi keypoint để xuất ra xác suất keypoint đó hiển thị.
Sigmoid làm cổng#
Vì đầu ra nằm trong khoảng từ 0 đến 1, sigmoid có thể điều chỉnh từng phần tử của một tín hiệu khác, từ chặn hoàn toàn đến truyền hoàn toàn, đồng thời vẫn khả vi:
- Các tế bào LSTM và GRU: Cổng sigmoid quyết định mức độ giữ lại bộ nhớ cũ, ghi nội dung mới và đưa trạng thái ra ngoài tại mỗi bước thời gian; trong khi đó, tanh định hình chính nội dung.
- SwiGLU: Các lớp feed-forward của nhiều mô hình ngôn ngữ lớn (LLM) nhân một phép chiếu đã học với phép chiếu thứ hai được kích hoạt bằng SiLU; đây là một cổng xây dựng trên sigmoid.
- SigLIP: Model ảnh-văn bản này tính điểm cho từng cặp ảnh-chú thích trong một batch bằng một sigmoid riêng, cho ra xác suất khớp có/không, vì vậy loss không cần chuẩn hóa trên toàn batch.
Sigmoid và các hàm liên quan#
- Hàm logistic: Từ đồng nghĩa với sigmoid trong ML. Trong toán học, “sigmoid” còn chỉ các đường cong hình chữ S khác, bao gồm tanh và hàm sai số.
- Softmax: Chuẩn hóa toàn bộ vector thành các xác suất có tổng bằng 1. Với hai lớp, softmax trên logits (z₁, z₂) cho lớp thứ nhất giá trị σ(z₁ − z₂), vì vậy softmax hai đầu ra và sigmoid một đầu ra mô tả cùng một model.
- Tanh: Sigmoid được co giãn lại, tanh(x) = 2σ(2x) − 1, có đầu ra từ −1 đến 1 với tâm tại 0 và đạo hàm cực đại bằng 1.
- Hard sigmoid: Phép xấp xỉ tuyến tính từng đoạn giúp tránh phép tính hàm mũ trên phần cứng di động. MobileNetV3 sử dụng ReLU6(x + 3) / 6; hàm này bằng 0 khi x < −3, bằng 1 khi x > 3 và là một đường thẳng ở giữa.










