Chuyển đến nội dung chính

Hàm kích hoạt Activation Function trong Deep Learning

Hàm kích hoạt (activation function) quyết định cách một neuron biến đổi tín hiệu trước khi truyền sang tầng tiếp theo. Nếu một mạng chỉ gồm các phép biến đổi tuyến tính, việc xếp chồng nhiều layer vẫn có thể rút gọn thành một phép biến đổi tuyến tính duy nhất và mạng không thể mô hình hóa tốt những quan hệ phi tuyến phức tạp.

Không tồn tại một activation tốt nhất cho mọi kiến trúc và mọi bài toán. ReLU phù hợp với nhiều CNN và MLP, GELU phổ biến trong Transformer, Sigmoid thích hợp cho xác suất nhị phân hoặc multi-label, trong khi Softmax thường được sử dụng để chuyển logits thành phân phối xác suất trên nhiều lớp loại trừ lẫn nhau.

Tóm tắt nội dung
  • Hidden layer: ReLU, Leaky ReLU, GELU và SiLU là những lựa chọn phổ biến.
  • Binary classification: thường huấn luyện bằng raw logits và BCEWithLogitsLoss; Sigmoid dùng khi cần xác suất.
  • Multi-class classification: thường dùng logits với CrossEntropyLoss; Softmax chủ yếu cần ở bước suy luận.
  • Regression: thường dùng đầu ra tuyến tính, trừ khi miền giá trị cần bị giới hạn.

Vì sao mạng nơ-ron cần hàm kích hoạt?

Một tầng tuyến tính có thể được viết:

z = W x + b

Nếu tầng tiếp theo cũng chỉ thực hiện một phép biến đổi tuyến tính:

y = W2 ( W1 x + b1 ) + b2

thì toàn bộ biểu thức vẫn có thể được rút gọn thành một phép tuyến tính khác. Vì vậy việc tăng số layer mà không chèn phi tuyến không giúp mạng học được decision boundary phức tạp hơn.

Khi một activation f được đặt sau phép biến đổi tuyến tính:

h = f ( W x + b )

mạng bắt đầu có khả năng xây dựng những phép biến đổi phi tuyến liên tiếp. Activation vì vậy ảnh hưởng đồng thời tới khả năng biểu diễn và quá trình lan truyền gradient.

Các activation quan trọng cho hidden layer

ReLU

Rectified Linear Unit (ReLU) là một trong những activation phổ biến nhất trong Deep Learning:

ReLU ( x ) = max ( 0 , x )

Khi x dương, ReLU giữ nguyên đầu vào. Khi x âm, đầu ra bằng 0. Trên vùng dương, đạo hàm bằng 1 nên gradient không bị nén như ở các hàm sigmoid khi activation lớn.

ReLU đơn giản, tính toán rẻ và là baseline tốt cho nhiều CNN hoặc MLP. Nhược điểm chính là dying ReLU: một neuron có thể rơi vào vùng âm lâu dài, tạo output bằng 0 và gradient theo x bằng 0.

Leaky ReLU

Leaky ReLU giữ lại một độ dốc nhỏ khi x âm:

f ( x ) = { x nếu x ≥ 0 α x nếu x < 0

Với α là một số dương nhỏ, neuron vẫn nhận gradient khi activation âm. Leaky ReLU đáng cân nhắc khi ReLU tạo quá nhiều activation bằng 0 hoặc mô hình có dấu hiệu xuất hiện neuron chết.

GELU

Gaussian Error Linear Unit (GELU) là activation quen thuộc trong Transformer và Vision Transformer. Công thức chính xác có thể viết:

GELU ( x ) = x Φ ( x )

Trong đó Φ(x) là hàm phân phối tích lũy của phân phối chuẩn chuẩn hóa. Khác ReLU, GELU không cắt đột ngột toàn bộ phần âm mà tạo một chuyển tiếp trơn.

Nếu sử dụng pretrained Transformer, thông thường nên giữ activation mà kiến trúc gốc đã dùng thay vì thay đổi tùy ý, vì trọng số pretrained đã được học trong điều kiện đó.

SiLU / Swish

SiLU được định nghĩa bởi:

SiLU ( x ) = x σ ( x )

SiLU cũng là một hàm trơn và cho phép một phần giá trị âm đi qua. Nó xuất hiện trong nhiều kiến trúc hiện đại, đặc biệt ở một số backbone Computer Vision và mạng có yêu cầu tối ưu gradient tốt hơn ReLU cơ bản.

Sigmoid và Tanh trong hidden state

Sigmoid ánh xạ đầu vào về khoảng (0,1):

σ ( x ) = 1 1 + e − x

Tanh ánh xạ đầu vào về khoảng (−1,1):

tanh ( x ) = e x − e − x e x + e − x

Cả hai có thể bị saturation khi |x| lớn, làm đạo hàm tiến gần 0. Vì vậy chúng ít được dùng làm activation mặc định cho hidden layer sâu hiện đại, nhưng vẫn rất quan trọng trong LSTM và GRU: Sigmoid thường đóng vai trò gate, còn Tanh tạo hoặc biến đổi trạng thái.

Baseline thực tế: ReLU cho CNN/MLP cổ điển; GELU cho nhiều Transformer; SiLU cho nhiều kiến trúc hiện đại; Leaky ReLU khi cần giữ gradient ở miền âm.

Activation ở output layer: Sigmoid, Softmax hay không dùng gì?

Activation ở output layer không nên được chọn giống hidden layer. Nó phải phản ánh ý nghĩa thống kê của target và phải tương thích với loss function.

Binary classification

Mô hình thường sinh một logit z. Xác suất lớp dương được tính bằng Sigmoid:

p = σ ( z )

Trong PyTorch, nếu dùng BCEWithLogitsLoss, model nên trả trực tiếp z. Không thêm Sigmoid vào model khi tính loss vì BCEWithLogitsLoss đã kết hợp hai bước theo cách ổn định số học.

Multi-label classification

Nếu một mẫu có thể đồng thời thuộc nhiều lớp, mỗi lớp cần một xác suất riêng:

pi = σ ( zi )

Ví dụ một ảnh có thể đồng thời chứa person, car và tree. Ba nhãn không loại trừ nhau, do đó Sigmoid độc lập cho từng lớp phù hợp hơn Softmax.

Multi-class classification

Khi mỗi mẫu chỉ thuộc một trong C lớp, Softmax chuyển vector logits thành phân phối xác suất:

softmax ( z ) i = e zi ∑ j = 1 C e zj

Các xác suất sau Softmax dương và tổng bằng 1. Tuy nhiên, khi huấn luyện bằng CrossEntropyLoss trong PyTorch, model cũng nên trả raw logits thay vì tự áp dụng Softmax trước loss.

Regression

Nếu target có thể nhận mọi giá trị thực, output thường là một tầng tuyến tính:

y ^ = W h + b

Nếu target bắt buộc thuộc [0,1], có thể dùng Sigmoid. Nếu thuộc [−1,1], Tanh là một lựa chọn tự nhiên. Với target bắt buộc dương nhưng không bị chặn trên, Softplus thường mềm hơn ReLU:

Softplus ( x ) = log ( 1 + e x )
Bài toán Output Activation Loss thường dùng
Binary classification 1 logit Sigmoid khi inference BCEWithLogitsLoss
Multi-label C logits độc lập Sigmoid từng lớp BCEWithLogitsLoss
Multi-class C logits Softmax khi inference CrossEntropyLoss
Regression không giới hạn Số thực Linear MSE, MAE, Huber...
Regression [0,1] Giá trị bị chặn Sigmoid Theo bài toán
Regression dương Giá trị > 0 Softplus có thể phù hợp Theo bài toán

Chọn activation cho CNN, Transformer và segmentation

Hidden activation nên được xem trong ngữ cảnh của toàn bộ kiến trúc. Một activation hoạt động tốt trong CNN không nhất thiết là lựa chọn mặc định tốt nhất cho Transformer.

Kiến trúc / bài toán Activation thường gặp Ghi chú
CNN ReLU, Leaky ReLU, SiLU ReLU là baseline đơn giản; SiLU phổ biến trong nhiều backbone hiện đại
Transformer GELU, SiLU và gated variants Nên giữ activation của pretrained architecture khi fine-tune
LSTM / GRU Sigmoid + Tanh Sigmoid dùng cho gate, Tanh cho candidate/state
Binary segmentation Sigmoid ở output khi inference Một logit cho mỗi pixel
Multi-class segmentation Softmax ở output khi inference C logits cho mỗi pixel

Binary segmentation

Với một foreground class và background, model thường sinh một logit cho mỗi pixel:

p h , w = σ ( z h , w )

Khi huấn luyện bằng BCEWithLogitsLoss, Sigmoid không cần nằm trong model. Khi inference, Sigmoid chuyển logits thành probability map rồi threshold để tạo mask.

Multi-class segmentation

Với C lớp loại trừ lẫn nhau, model sinh tensor logits có dạng B × C × H × W. Sau khi huấn luyện, nhãn dự đoán tại pixel có thể lấy bằng:

y ^ h , w = argmax c z c , h , w

Nếu chỉ cần class ID, argmax trên logits và argmax trên Softmax probability cho cùng thứ tự lớp. Vì vậy không nhất thiết phải tính Softmax chỉ để lấy lớp dự đoán.

Gated activations trong Transformer

Các kiến trúc Transformer hiện đại còn sử dụng những biến thể gated như GLU, GEGLU hoặc SwiGLU. Trực giác tổng quát có thể viết:

y = f ( x W1 ) ⊙ ( x W2 )

Ký hiệu ⊙ là phép nhân từng phần tử. Trong trường hợp này, activation không chỉ được thay đổi độc lập mà nằm trong một cơ chế gating hoàn chỉnh.

Code PyTorch: ghép activation đúng với loss

Binary classification

import torch
import torch.nn as nn


class BinaryClassifier(nn.Module):
    def __init__(self, input_dim):
        super().__init__()

        self.net = nn.Sequential(
            nn.Linear(input_dim, 64),
            nn.ReLU(),
            nn.Linear(64, 1)
        )

    def forward(self, x):
        # Raw logits: không đặt Sigmoid ở đây
        return self.net(x)


model = BinaryClassifier(input_dim=20)
criterion = nn.BCEWithLogitsLoss()

x = torch.randn(8, 20)
targets = torch.randint(
    0,
    2,
    (8, 1)
).float()

logits = model(x)
loss = criterion(logits, targets)

# Chuyển logits thành xác suất khi inference
probs = torch.sigmoid(logits)

Multi-class classification

import torch
import torch.nn as nn

num_classes = 5

model = nn.Sequential(
    nn.Linear(128, 256),
    nn.GELU(),
    nn.Linear(256, num_classes)
)

criterion = nn.CrossEntropyLoss()

x = torch.randn(16, 128)
labels = torch.randint(
    0,
    num_classes,
    (16,)
)

logits = model(x)

# CrossEntropyLoss nhận raw logits
loss = criterion(logits, labels)

# Softmax chỉ cần khi muốn xác suất
probs = torch.softmax(logits, dim=1)

# Nếu chỉ cần class ID, có thể argmax trực tiếp logits
predictions = logits.argmax(dim=1)

Multi-label classification

import torch
import torch.nn as nn

num_labels = 4

model = nn.Sequential(
    nn.Linear(64, 128),
    nn.SiLU(),
    nn.Linear(128, num_labels)
)

criterion = nn.BCEWithLogitsLoss()

x = torch.randn(10, 64)

# Mỗi mẫu có thể có nhiều nhãn cùng lúc
targets = torch.randint(
    0,
    2,
    (10, num_labels)
).float()

logits = model(x)
loss = criterion(logits, targets)

probs = torch.sigmoid(logits)
predictions = (probs >= 0.5).int()

Những lỗi thường gặp và cách chọn activation nhanh

Dùng Softmax cho multi-label classification

Softmax tạo cạnh tranh giữa các lớp vì tổng xác suất bằng 1. Nếu nhiều nhãn có thể đúng đồng thời, cần sử dụng Sigmoid độc lập cho từng lớp.

Thêm Sigmoid trước BCEWithLogitsLoss

BCEWithLogitsLoss đã tích hợp Sigmoid bên trong. Model cần trả logits trực tiếp. Sigmoid chỉ được áp dụng bên ngoài khi muốn đọc xác suất.

Thêm Softmax trước CrossEntropyLoss

CrossEntropyLoss nhận logits và thực hiện phép biến đổi tương ứng theo cách ổn định số học. Vì vậy không cần Softmax trước loss.

Dùng Sigmoid cho mọi hidden layer

Sigmoid có thể saturation khi giá trị tuyệt đối của đầu vào lớn. Với mạng sâu, ReLU, GELU hoặc SiLU thường là baseline tốt hơn cho hidden representation.

Ép output regression bằng activation không phù hợp

Nếu target có thể âm, ReLU ở output khiến model không thể tạo dự đoán âm. Nếu target không bị giới hạn, linear output thường là lựa chọn tự nhiên nhất.

1. Xác định target
Binary / multi-class / regression
→
2. Chọn loss
BCE / CE / MSE...
→
3. Output activation
Theo miền của target
→
4. Hidden activation
Theo kiến trúc
Quy tắc chọn nhanh:

CNN / MLP: bắt đầu với ReLU hoặc SiLU.

Transformer: giữ GELU, SiLU hoặc gated activation của kiến trúc gốc.

Binary output: raw logits + BCEWithLogitsLoss; Sigmoid khi cần probability.

Multi-label: C logits + BCEWithLogitsLoss; Sigmoid độc lập từng lớp.

Multi-class: C logits + CrossEntropyLoss; Softmax khi cần probability.

Regression không giới hạn: linear output.

Regression bị giới hạn: chọn activation theo đúng miền của target.

Nếu model huấn luyện không ổn định, không nên mặc định activation là nguyên nhân duy nhất. Learning rate, normalization, weight initialization, residual connection, batch size và gradient clipping đều có thể ảnh hưởng mạnh đến quá trình tối ưu.

Kết luận

Hàm kích hoạt tạo ra tính phi tuyến giúp mạng nơ-ron học các quan hệ phức tạp. ReLU đơn giản và hiệu quả cho nhiều CNN và MLP, GELU và SiLU phù hợp với nhiều kiến trúc hiện đại, trong khi Sigmoid, Tanh và Softmax có vai trò đặc biệt rõ trong gating hoặc output layer.

Cách chọn activation đúng không phải là tìm một hàm “mạnh nhất”, mà là đảm bảo sự nhất quán giữa kiến trúc, hidden activation, ý nghĩa của output và loss function. Đặc biệt trong PyTorch, cần phân biệt rõ raw logits với probability để tránh những lỗi phổ biến như Sigmoid trước BCEWithLogitsLoss hoặc Softmax trước CrossEntropyLoss.

© The CS Note · THE CS NOTE

Nội dung gốc thuộc tác giả. Vui lòng không đăng lại toàn văn khi chưa được phép, trừ trường hợp pháp luật hoặc giấy phép áp dụng cho phép. Nội dung của bên thứ ba tuân theo quyền và giấy phép tương ứng.

Nguồn gốc: Hàm kích hoạt Activation Function trong Deep Learning

Về trang chủ Về đầu bài

Bài Đăng Phổ Biến

Bài toán tháp Hà nội

Trải nghiệm Tháp Hà Nội Kéo thả đĩa hoặc chạm vào các nút bên dưới để di chuyển. Bạn phải chuyển toàn bộ đĩa sang cột ngoài cùng bên phải (Cột 3) mà không đặt đĩa to lên đĩa nhỏ. Cột 1 Cột 2 Cột 3 Điều khiển & Chế độ Số lượng đĩa 4 Tốc độ máy giải ↪ Undo ↻ Chơi lại 🤖 Máy tự giải Thống kê ván chơi Nước đã đi 0 Thời gian 00:00 Tối thiểu cần 15 Kỷ lục của bạn - Lịch sử và Nguồn gốc Truyền thuyết Bài toán Tháp Hà Nội (hay Tháp Brahma) là một trò chơi xếp hình toán học kinh điển được giới thiệu lần đầu vào năm 1883 bởi nhà toán học người Pháp Édouard L...

Bài toán phân tích cảm xúc trong văn bản

Bài toán phân tích cảm xúc (sentiment analysis) là một bài toán NLP nhằm xác định thái độ hoặc cảm xúc được thể hiện trong văn bản. Ví dụ, từ một đánh giá như “Điện thoại đẹp, chạy nhanh nhưng pin hơi yếu”, hệ thống có thể nhận biết rằng người dùng có cả nhận xét tích cực và tiêu cực. Điểm thú vị của bài toán nằm ở khoảng cách giữa cách con người hiểu ngôn ngữ và cách máy tính xử lý dữ liệu. Một hệ thống phân tích cảm xúc cần biến văn bản tự nhiên thành dữ liệu có cấu trúc, học được các mẫu ngôn ngữ từ dữ liệu huấn luyện và đưa ra dự đoán hợp lý trên những câu chưa từng gặp. 1. Bài toán phân tích cảm xúc bắt đầu từ đâu? Hãy tưởng tượng một cửa hàng trực tuyến có hàng nghìn đánh giá mỗi ngày. Con người có thể đọc từng đánh giá để biết khách hàng hài lòng hay không, nhưng việc này nhanh chóng trở nên tốn thời gian khi dữ liệu tăng lên. NLP có thể biến bài toán đó thành một bài toán phân loại. Với mỗi văn bản, hệ thống nhận vào một chuỗi ký...

KAN cho phân đoạn khối u não với bộ BraTS 2020

Kolmogorov-Arnold Network (KAN) mở ra một hướng khác với MLP truyền thống: thay vì chỉ học các trọng số vô hướng trên mỗi kết nối, KAN có thể học những hàm phi tuyến một biến trên các cạnh . Khi đưa ý tưởng này vào kiến trúc encoder-decoder như U-Net, ta có thể sử dụng convolution để giữ cấu trúc không gian của ảnh MRI và dùng KAN để thực hiện các phép biến đổi phi tuyến mạnh hơn trên representation trung gian. Một bài toán phù hợp để nghiên cứu hướng này là phân đoạn u thần kinh đệm trên BraTS 2020 . Dataset cung cấp MRI đa mô thức và yêu cầu xác định các vùng Whole Tumor (WT), Tumor Core (TC) và Enhancing Tumor (ET). Đây là bài toán 3D có sự mất cân bằng voxel lớn, hình dạng khối u rất đa dạng và ranh giới giữa các mô bệnh lý không đơn giản. Lưu ý học thuật quan trọng: U-KAN gốc được công bố cho nhiều benchmark phân đoạn ảnh y tế nhưng không báo cáo kết quả BraTS 2020. Một công trình sau đó đã mở rộng U-KAN sang 3D MRI brain tumor segmentation , nhưng đánh giá trên BraTS 2...

Tách từ trong tiếng Việt Word Segmentation

Tách từ tiếng Việt là bài toán xác định ranh giới giữa các từ trong một chuỗi văn bản. Khó khăn nằm ở chỗ khoảng trắng trong tiếng Việt thường phân cách các âm tiết , nhưng một từ hoàn chỉnh có thể gồm nhiều âm tiết như “sinh viên” , “đại học” , “công nghệ” hay “tự nhiên” . Tách từ đúng giúp các hệ thống NLP dựa trên từ biểu diễn văn bản hợp lý hơn, đặc biệt trong tìm kiếm, TF-IDF, phân loại văn bản, gán nhãn từ loại và một số mô hình ngôn ngữ tiếng Việt. Tuy nhiên, với các Transformer sử dụng tokenizer dưới mức từ như subword hoặc SentencePiece, tách từ thủ công không phải lúc nào cũng là bước bắt buộc . Việc có cần tách từ trước hay không phụ thuộc vào mô hình và pipeline cụ thể. Tóm tắt nội dung Khoảng trắng trong tiếng Việt không phải lúc nào cũng là ranh giới từ ; nhiều từ gồm hai hoặc nhiều âm tiết. Word segmentation và tokenization có liên quan nhưng không hoàn toàn đồng nghĩa. Ba hướng chính gồm dựa trên từ điển, mô hình thống kê và mô hình học sâu . Tron...

KAN là gì? Mạng Kolmogorov-Arnold khác MLP thế nào?

Kolmogorov-Arnold Network (KAN) là một kiến trúc mạng nơ-ron trong đó mỗi cạnh không chỉ chứa một trọng số vô hướng mà mang một hàm một biến có thể học được . Đây là khác biệt cốt lõi so với Multi-Layer Perceptron (MLP), nơi các cạnh chủ yếu thực hiện phép nhân với trọng số còn hàm kích hoạt thường được áp dụng tại các node. KAN được lấy cảm hứng từ định lý biểu diễn Kolmogorov-Arnold và đặc biệt đáng chú ý trong các bài toán xấp xỉ hàm, mô hình hóa khoa học và symbolic regression. Tuy nhiên, KAN không nên được hiểu là kiến trúc đã thay thế MLP trong mọi bài toán Deep Learning; khả năng biểu diễn, chi phí tính toán và mức độ phù hợp của hai kiến trúc khác nhau theo từng nhiệm vụ. Tóm tắt nội dung MLP học chủ yếu trọng số trên các cạnh , còn KAN đặt hàm một biến học được trên từng cạnh . Một KAN layer cộng kết quả của nhiều hàm cạnh để tạo activation của node tiếp theo. KAN gốc sử dụng B-spline để tham số hóa các hàm phi tuyến trên cạnh. KAN có lợi thế đáng chú ý về trực...