ReLU, GELU, SiLU — Tại sao neuron cần 'bật/tắt'
Tại sao neural network cần hàm kích hoạt phi tuyến? Giải thích bản chất ReLU, GELU, SiLU — từ cơ chế bật/tắt đơn giản đến smooth transition giúp gradient chảy mượt trong deep learning.
Mỗi khi bạn chat với ChatGPT hoặc nhận diện khuôn mặt trong ảnh, hàng tỷ phép tính nhân ma trận đang chạy trong GPU. Nhưng nếu chỉ có nhân ma trận, dù xếp 1000 lớp chồng lên nhau, kết quả vẫn chỉ là một phép biến đổi tuyến tính đơn thuần — chẳng khác gì hồi quy tuyến tính thời đại ông bà ta. Điều biến neural network từ "máy tính Casio" thành "bộ não nhân tạo" chính là những hàm kích hoạt (activation functions) — những chiếc công tắc thông minh quyết định thông tin nào được đi qua, thông tin nào bị chặn lại. Và cuộc cách mạng từ ReLU đến GELU, SiLU chính là hành trình tìm ra chiếc công tắc hoàn hảo nhất.
Vấn đề
Tính tuyến tính là kẻ thù của sự phức tạp. Nếu bạn chỉ dùng các phép biến đổi tuyến tính (W·x + b), dù xếp chồng 100 lớp, kết quả vẫn tương đương một lớp tuyến tính duy nhất. Network không thể học các ranh giới quyết định phi tuyến — như phân loại hình tròn vs hình vuông, học XOR đơn giản, hay nắm bắt ngữ nghĩa phức tạp trong ngôn ngữ.
Giải pháp đầu tiên là Sigmoid và Tanh — những đường cong chữ S mượt mà. Nhưng chúng mang "lời nguyền gradient biến mất" (vanishing gradient). Khi input lớn hoặc nhỏ, đạo hàm của chúng tiến về 0. Trong mạng sâu (như ResNet hay Transformer với hàng trăm lớp), gradient phải nhân qua hàng trăm con số < 1 khi lan truyền ngược — kết quả là gradient "bốc hơi" trước khi về đến lớp đầu tiên. Network ngừng học, dù bạn có thêm dữ liệu hay tăng epoch cũng vô ích.
Ý tưởng cốt lõi
Hãy để neuron "bật" hoặc "tắt" một cách đơn giản, nhưng đừng làm nó "chết" hoàn toàn.
ReLU (Rectified Linear Unit) là bước đột phá: f(x) = max(0, x). Nếu input dương, để nguyên; nếu âm, bật thành 0. Điều này tạo ra phi tuyến tính (non-linearity) cần thiết, nhưng vẫn giữ đạo hàm đơn giản (0 hoặc 1), giúp gradient chảy dễ dàng như nước trong ống thoát.
Nhưng ReLU có vấn đề "dying ReLU" — nếu một neuron luôn nhận input âm (ví dụ do weight khởi tạo xấu hoặc learning rate cao), nó sẽ output 0 mãi mãi. Gradient không lan truyền qua, neuron "chết" và không bao giờ tỉnh lại.
GELU (Gaussian Error Linear Unit) và SiLU (Sigmoid Linear Unit, còn gọi là Swish) giải quyết bằng cách không "tắt" đột ngột mà "tắt dần" một cách mượt (smooth). GELU có công thức: x · Φ(x) (x nhân với hàm phân phối tích lũy Gaussian). SiLU có công thức: x · σ(x) (x nhân sigmoid).
Đây là phần hay nhất: Đây là sự chuyển đổi từ "công tắc điện cơ" sang "dimmer switch" (công tắc điều chỉnh độ sáng). Thay vì bật/tắt nhị phân đơn thuần, chúng ta có sự chuyển tiếp mượt mà giữa 0 và x, cho phép gradient nhỏ vẫn rỉ rỉ chảy qua khi input âm, cứu sống những neuron "sắp chết".
Nhiều người nói GELU chỉ là "ReLU mượt hơn" — thực ra misleading. Phần quan trọng nhất là GELU cho phép gradient âm nhỏ (không phải 0 hoàn toàn), giúp neuron có thể "tỉnh dậy" từ trạng thái âm sâu, điều mà ReLU không làm được.
Tại sao nó hoạt động
ReLU hoạt động như một cổng thông tin hiệu quả: f(x) = max(0, x). Đạo hàm của nó là 1 khi x > 0 (thông thoáng, gradient chảy qua không biến dạng) và 0 khi x < 0 (chặn hoàn toàn). Điều này giải quyết vanishing gradient của Sigmoid, nhưng quá "brutal" — một khi chặn là chặn vĩnh viễn.
GELU dùng hàm phân phối Gaussian để tạo đường cong mượt: f(x) = x · ½[1 + erf(x/√2)]. Khác với ReLU có góc nhọn tại 0 (không differentiable), GELU differentiable ở mọi điểm. Đạo hàm của nó không bao giờ bằng 0 hoàn toàn, chỉ tiến gần 0. Kết quả: dù neuron đang ở trạng thái "tắt" (input âm), vẫn có chút gradient nhỏ len lỏi qua, giữ cho neuron sống sót để có thể "tỉnh lại" khi có tín hiệu tốt hơn.
SiLU (Swish) mang tính "tự điều chỉnh" (self-gating): f(x) = x · σ(x). Khi x lớn dương, σ(x) tiến về 1, nên output ≈ x (giữ nguyên thông tin). Khi x âm, σ(x) tiến về 0, nhấn output xuống. Đây là cơ chế "gate" học được, cho phép network tự quyết định mức độ quan trọng của chính input.
Trong mạng sâu với residual connections (như Transformer), gradient phải chảy qua hàng chục lớp. Nếu mỗi lớp có đạo hàm nhỏ (như Sigmoid) hoặc 0 (ReLU chết), gradient bị nhân dần thành 0 theo luật số nhỏ. GELU/SiLU đảm bảo gradient luôn có giá trị nào đó để lan truyền, giúp train được network sâu hàng trăm lớp mà không bị "mất dấu".
Ý nghĩa thực tế
ReLU đã kích hoạt cuộc cách mạng deep learning hiện đại — từ AlexNet (2012) đến ResNet (2015). Nó đơn giản, tính toán cực nhanh (chỉ so sánh với 0), nhưng vẫn để lại rủi ro "chết neuron" trong quá trình training dài.
GELU trở thành chuẩn mực cho kiến trúc Transformer (BERT, GPT-2/3/4). Nó cân bằng hoàn hảo giữa tính phi tuyến cần thiết và độ mượt của gradient, giúp training ổn định hơn ReLU trên mạng cực sâu. Chi phí tính toán cao hơn một chút (do hàm erf) nhưng đáng đổi lại bằng sự ổn định.
SiLU (Swish) được dùng trong nhiều kiến trúc hiện đại như EfficientNet, Swin Transformer, và một số biến thể Llama. Tính "self-gated" giúp kiểm soát thông tin tự nhiên hơn, đặc biệt trong các mô hình cần sự tinh tế trong việc lọc thông tin.
| Feature | ReLU | GELU | SiLU |
|---|---|---|---|
| Công thức | max(0,x) | x·Φ(x) | x·σ(x) |
| Smooth | Không (góc nhọn tại 0) | Có (differentiable) | Có (differentiable) |
| Dying Neuron | Có thể xảy ra | Không | Không |
| Tốc độ tính | Cực nhanh | Chậm hơn (hàm erf) | Trung bình |
| Dùng trong | CNNs truyền thống, VGG, ResNet | BERT, GPT, Transformer | EfficientNet, Modern LLMs |
Các giới hạn: ReLU có thể "chết" và cần khởi tạo cẩn thận (He initialization). GELU tốn compute hơn và có thể gây numerical instability nếu không xử lý cẩn thận. SiLU đôi khi cần learning rate thấp hơn để tránh gradient exploding ở giai đoạn đầu training.
Đào sâu hơn
Paper gốc:
- ReLU: "Rectified Linear Units Improve Restricted Boltzmann Machines" (Nair & Hinton, 2010)
- GELU: "Gaussian Error Linear Units (GELUs)" (Hendrycks & Gimpel, 2016)
- SiLU/Swish: "Searching for Activation Functions" (Ramachandran et al., 2017)
Cùng cụm:
- Backpropagation — Hiểu cách gradient chảy ngược qua các activation functions này khi training
- Gradient Descent & Adam — Tại sao Adam hoạt động tốt với ReLU/GELU hơn SGD thuần túy
- BatchNorm vs LayerNorm — Cách normalization tương tác với activation functions để ổn định phân phối
Đọc tiếp:
- Decoder-Only — Xem activation functions hoạt động trong kiến trúc Transformer, nơi GELU trở thành lựa chọn số một
- Gradient Accumulation — Khi scale lên model lớn, lựa chọn activation ảnh hưởng đến memory và chiến lược tích lũy gradient như thế nào
Gradient Descent & Adam — Tại sao Adam thắng SGD
Adam không chỉ là 'SGD có momentum' — nó là việc mỗi tham số trong mạng neuron được học với tốc độ riêng. Hiểu bản chất adaptive learning rate qua analog chiếc xe địa hình.
Dropout — Giết neuron ngẫu nhiên để mạng mạnh hơn
Kỹ thuật tắt ngẫu nhiên neuron trong quá trình huấn luyện, buộc mạng neural phải học cách tổng quát hóa thay vì ghi nhớ máy móc — giải pháp đơn giản nhưng cực kỳ hiệu quả cho overfitting.