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

Hàm kích hoạt GELU: Công thức, Trực giác và Ứng dụng trong Học sâu

GELU là hàm kích hoạt mượt, có tính xác suất, vượt trội hơn các lựa chọn đơn giản như ReLU trong các kiến trúc học sâu, và đã trở thành mặc định trong các mô hình transformer như BERT và GPT.
Đã cập nhật 4 thg 5, 2026  · 8 phút đọc

Các hàm kích hoạt quyết định tín hiệu nào đi qua mạng nơ-ron và tín hiệu nào không. Khi chọn sai, mô hình của bạn sẽ học quá chậm hoặc không khái quát hóa được. ReLU từng là lựa chọn mặc định hợp lý trong nhiều năm vì nó nhanh và đủ tốt cho hầu hết tác vụ.

GELU (Gaussian Error Linear Unit) đã thay đổi điều đó. Giờ đây, nó là hàm kích hoạt đứng sau một số mô hình mạnh mẽ nhất từng được xây dựng, bao gồm BERT và GPT.

Trong bài viết này, tôi sẽ trình bày trực giác đằng sau GELU, công thức của nó, cách so sánh với các hàm kích hoạt khác và nơi bạn sẽ dùng nó trong thực tế.

Nếu bạn hoàn toàn mới với các hàm kích hoạt trong machine learning, hãy đọc Hướng dẫn cho người mới bắt đầu về Rectified Linear Unit (ReLU) của chúng tôi.

Hàm kích hoạt GELU là gì?

GELU, hay Gaussian Error Linear Unit, là một hàm kích hoạt gán trọng số cho đầu vào dựa trên độ lớn của chúng bằng cách tiếp cận mượt và xác suất.

Hầu hết các hàm kích hoạt đưa ra quyết định hoặc cho tín hiệu đi qua hoặc chặn lại. Ví dụ, ReLU đưa mọi giá trị âm về 0 và giữ nguyên những giá trị còn lại. GELU hoạt động khác. Thay vì một ngưỡng cứng, nó co giãn đầu vào một cách mượt mà dựa trên độ lớn nhỏ của chúng, nghĩa là ngay cả các giá trị âm nhỏ vẫn có thể đóng góp vào đầu ra.

Điểm khác biệt so với ReLU là GELU mượt và liên tục ở mọi nơi. Không có góc gắt tại 0 và không có chuyển tiếp đột ngột. Tính mượt đó có thể quan trọng trong quá trình huấn luyện vì nó cung cấp cho bộ tối ưu hóa thông tin gradient sạch hơn để làm việc.

Trực giác đằng sau GELU

Hãy coi GELU như một bộ lọc không đối xử mọi đầu vào như nhau.

ReLU thì thô - bất cứ giá trị âm nào cũng bị đưa về 0, mọi lúc. Ngược lại, GELU tự hỏi “giá trị đầu vào này có khả năng hữu ích đến mức nào?” Những giá trị rõ ràng là lớn và dương sẽ đi qua gần như không đổi. Những giá trị nhỏ hoặc âm sẽ bị giảm tỷ lệ, không bị cắt hoàn toàn.

Kết quả là bạn có một đường cong mượt mà, làm suy giảm các tín hiệu kém liên quan thay vì loại bỏ hoàn toàn chúng.

Hãy tưởng tượng bạn đang duyệt một chồng hồ sơ xin việc. Một bộ lọc nghiêm ngặt sẽ loại bất kỳ ai không có bằng cấp, không ngoại lệ. Một bộ lọc thông minh hơn vẫn sẽ cân nhắc những ứng viên suýt đạt vì có thể họ có kinh nghiệm liên quan để bù đắp. GELU hoạt động như bộ lọc thông minh hơn. Nó không đưa ra các ngắt cứng, mà cân nhắc mỗi đầu vào dựa trên độ lớn và quyết định cho qua bao nhiêu.

Việc co giãn dần dần và có tính xác suất này là điều làm cho GELU khác biệt. Không có chuyển tiếp đột ngột và không có nơ-ron chết - chỉ là một quyết định mượt mà giữa cho qua hay giảm bớt cho từng giá trị đầu vào.

Công thức GELU

Công thức GELU chính xác được xây dựng trên hàm phân phối tích lũy Gaussian (CDF), được viết như sau:

Gaussian cumulative distribution function

Hàm phân phối tích lũy Gaussian

trong đó x là giá trị đầu vào và Φ(x) là xác suất rằng một biến ngẫu nhiên lấy từ phân phối chuẩn tắc nhỏ hơn hoặc bằng x. Nói đơn giản, Φ(x) cho bạn biết đầu vào “bình thường” hay kỳ vọng đến mức nào - và chính xác suất đó được GELU dùng để co giãn đầu vào.

Đầu vào càng lớn, Φ(x) càng tiến gần 1, nghĩa là đầu vào đi qua gần như nguyên vẹn. Đầu vào càng nhỏ, Φ(x) càng tiến gần 0, nghĩa là đầu vào bị suy giảm.

Xấp xỉ dùng trong thực tế

Vấn đề với công thức chính xác là tính Φ(x) tốn kém. Nó liên quan đến hàm error, vốn không có dạng đóng đơn giản và chậm khi tính ở quy mô lớn.

Các framework học sâu thay vào đó dùng xấp xỉ sau:

GELU approximation formula

Công thức xấp xỉ GELU

Xấp xỉ này dùng tanh, vốn nhanh và được hỗ trợ tốt trên phần cứng hiện đại. Kết quả gần như giống hệt công thức chính xác trong dải đầu vào quan trọng trên thực tế, đó là lý do các framework như PyTorch và TensorFlow dùng mặc định.

Tất nhiên, bạn không cần phải ghi nhớ bất kỳ công thức nào. Nhưng biết rằng có tồn tại xấp xỉ - và lý do tại sao - sẽ giúp bạn hiểu điều gì thực sự xảy ra khi gọi GELU trong mã.

GELU so với các hàm kích hoạt khác

Mỗi hàm kích hoạt xử lý đầu vào theo cách khác nhau, và những khác biệt đó thể hiện ở mức độ mô hình của bạn học tốt đến đâu.

Dưới đây là sự khác biệt ở dạng trực quan trước khi giải thích bằng văn bản:

GELU versus other activation functions graph

Biểu đồ GELU so với các hàm kích hoạt khác

Sigmoid

Sigmoid nén mọi đầu vào vào khoảng từ 0 đến 1. Nó mượt, nhưng có vấn đề nổi tiếng: gradient biến mất. Với các đầu vào rất lớn hoặc rất nhỏ, gradient tiến gần 0, nghĩa là các tầng sâu hơn ngừng học. GELU không gặp vấn đề này vì gradient của nó vẫn có ý nghĩa trong dải đầu vào rộng hơn.

Tanh

Tanh tương tự Sigmoid nhưng được căn giữa tại 0, với đầu ra trong khoảng -1 đến 1. Nó xử lý đầu vào âm tốt hơn Sigmoid, nhưng vẫn chịu ảnh hưởng của gradient biến mất ở hai đầu cực trị. GELU tạo ra đường cong đầu ra mượt hơn với dòng gradient tốt hơn qua các mạng sâu.

ReLU

ReLU nhanh và đơn giản: đầu vào dương đi qua không đổi, đầu vào âm bị đưa về 0. Ngưỡng cứng tại 0 gây ra vấn đề nơ-ron chết - các nơ-ron luôn nhận đầu vào âm theo thời gian sẽ dừng cập nhật hoàn toàn. GELU tránh điều này bằng cách co giãn các đầu vào âm thay vì cắt bỏ chúng.

Leaky ReLU

Leaky ReLU khắc phục vấn đề nơ-ron chết bằng cách cho một phần nhỏ đầu vào âm đi qua. Đây là bước tiến so với ReLU, nhưng chuyển tiếp tại 0 vẫn gắt. GELU tạo ra đường cong tổng thể mượt hơn, thường hoạt động tốt hơn trong các kiến trúc sâu nơi chất lượng gradient quan trọng hơn.

Tóm lại, dưới đây là sự khác biệt giữa năm hàm kích hoạt này:

GELU versus other activation functions table

Bảng so sánh GELU với các hàm kích hoạt khác

Vì sao GELU được dùng trong Transformer

Transformer chỉ là các mạng nơ-ron sâu. Và mạng càng sâu, chất lượng gradient càng quan trọng.

Các mô hình như BERT và GPT xếp chồng hàng chục tầng lên nhau. Ở độ sâu đó, các vấn đề nhỏ về dòng gradient sẽ tích lũy. Nếu hàm kích hoạt của bạn tạo ra gradient không ổn định hoặc gần bằng 0 ở một số vùng, các tầng sớm trong mạng hầu như không được cập nhật trong khi huấn luyện, đồng nghĩa chúng không học được nhiều.

GELU tránh điều này bằng cách giữ gradient mượt và khác 0 trên dải đầu vào rộng hơn. Không có ngưỡng cắt như biên 0 của ReLU, nên bộ tối ưu hóa nhận được tín hiệu sạch hơn ở mọi tầng, không chỉ các tầng gần đầu ra.

Có một lý do bổ sung khiến GELU phù hợp với kiến trúc transformer. 

Transformer xử lý đầu vào thông qua cơ chế attention tạo ra một dải giá trị kích hoạt rộng - cả dương lẫn âm. Một hàm kích hoạt mượt xử lý dải này tốt hơn so với hàm có chuyển tiếp gắt.

Khi bài báo BERT gốc được công bố, các tác giả đã chọn GELU thay vì ReLU và báo cáo kết quả tốt hơn trên các benchmark của họ. GPT cũng làm lựa chọn tương tự. Kể từ đó, GELU đã trở thành hàm kích hoạt mặc định trong hầu hết kiến trúc dựa trên transformer, không phải vì nó mới, mà vì nó hoạt động tốt hơn ở quy mô các mô hình này vận hành.

GELU trong thực tế

Dùng GELU trong mô hình của bạn dễ như dùng bất kỳ hàm kích hoạt nào khác. Cả PyTorch và TensorFlow đều hỗ trợ sẵn.

PyTorch

Trong PyTorch, bạn có thể áp dụng GELU như một mô-đun độc lập hoặc inline trong định nghĩa mô hình. Dưới đây là một khối feedforward đơn giản dùng GELU:

import torch
import torch.nn as nn

class FeedForwardBlock(nn.Module):
    def __init__(self, input_dim, hidden_dim):
        super().__init__()
        self.fc1 = nn.Linear(input_dim, hidden_dim)
        self.act = nn.GELU()
        self.fc2 = nn.Linear(hidden_dim, input_dim)

    def forward(self, x):
        return self.fc2(self.act(self.fc1(x)))

block = FeedForwardBlock(input_dim=512, hidden_dim=2048)
x = torch.randn(8, 512)
output = block(x)

nn.GELU() nằm giữa hai tầng tuyến tính, đúng như vị trí bạn sẽ thấy trong tầng con feedforward của transformer. Hàm kích hoạt chạy sau phép chiếu thứ nhất và trước phép chiếu thứ hai.

TensorFlow

Trong TensorFlow, GELU có sẵn thông qua API Keras:

import tensorflow as tf
from tensorflow import keras

model = keras.Sequential([
    keras.layers.Dense(2048, input_shape=(512,)),
    keras.layers.Activation("gelu"),
    keras.layers.Dense(512)
])

x = tf.random.normal((8, 512))
output = model(x)

Bạn cũng có thể truyền trực tiếp nó dưới dạng chuỗi cho tham số activation của một tầng Dense:

keras.layers.Dense(2048, activation="gelu")

Cả hai cách đều cho kết quả như nhau.

GELU phù hợp ở đâu trong mạng

GELU nằm ở cùng vị trí với bất kỳ hàm kích hoạt nào khác - ngay sau một phép biến đổi tuyến tính và trước tầng tiếp theo. Trong kiến trúc transformer, điều đó có nghĩa là bên trong tầng con feedforward, giữa hai phép chiếu dense. Trong các mạng sâu khác, bạn đặt nó sau tầng tuyến tính hoặc tích chập, và để nó co giãn đầu ra trước khi chuyển tiếp.

Ưu điểm của GELU

Nếu bạn đã đọc đến đây, bạn đã biết những điểm mạnh lớn nhất của GELU so với các hàm kích hoạt khác. Dưới đây là tóm tắt ngắn:

  • Kích hoạt mượt: GELU tạo ra đường cong liên tục, khả vi, không có chuyển tiếp gắt, giúp bộ tối ưu hóa nhận thông tin sạch hơn ở mọi bước.
  • Dòng gradient tốt hơn: GELU không đưa đầu vào âm về 0, nên gradient vẫn có thể lan truyền qua các nơ-ron nhận giá trị âm. Điều này giảm rủi ro nơ-ron chết trong huấn luyện.
  • Hiệu quả tốt hơn trong mô hình sâu: Trong các kiến trúc sâu như transformer, hiệu ứng tích lũy của gradient mượt thường chuyển thành kết quả huấn luyện tốt hơn so với các hàm kích hoạt đơn giản.

Hạn chế của GELU

GELU không phải là lựa chọn đúng cho mọi tình huống. Dưới đây là một vài hạn chế bạn cần lưu ý:

  • Tốn chi phí tính toán hơn ReLU: GELU liên quan đến hoặc hàm error hoặc xấp xỉ dựa trên tanh, cả hai đều tốn kém hơn thao tác ngưỡng đơn giản của ReLU. Trong các mô hình lớn với nhiều tầng, chi phí này có thể cộng dồn.

  • Ít trực quan hơn: Các hàm như ReLU dễ suy luận - giá trị dương đi qua, giá trị âm không. Việc co giãn xác suất của GELU khó diễn giải hơn.

  • Không phải lúc nào cũng cần thiết: Với các mạng nông hoặc tác vụ đơn giản, GELU không mang lại lợi thế đáng kể. ReLU hoặc Leaky ReLU thường cho hiệu năng tương đương với chi phí tính toán thấp hơn.

Kết lại, nếu bạn xây dựng transformer hoặc kiến trúc sâu khác, GELU là mặc định vững chắc. Với các trường hợp còn lại, hãy benchmark trước khi quyết định.

Kết luận

GELU không phải bản nâng cấp phổ quát, cũng không phải giải pháp “một cho tất cả” thay thế ReLU. Đó là một lựa chọn thiết kế có chủ đích, đáng để sử dụng trong những ngữ cảnh cụ thể - hãy nghĩ đến các mạng sâu và mô hình transformer.

Nếu bạn đang làm việc với BERT, GPT hoặc bất kỳ mô hình dựa trên transformer nào, bạn đã dùng GELU dù có để ý hay không. Giờ thì bạn biết vì sao nó ở đó.

Với những trường hợp khác, lựa chọn hàm kích hoạt là vấn đề đánh đổi. Không một hàm nào thắng mọi lần, và hiểu mỗi hàm làm gì sẽ giúp bạn đưa ra quyết định tự tin thay vì theo thói quen.

Nếu bạn vẫn thấy sự khác nhau giữa các hàm kích hoạt gây bối rối, hãy đăng ký Lộ trình Kỹ sư Machine Learning để sẵn sàng cho sự nghiệp trong machine learning và MLOps.


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
Chuyên gia Khoa học Dữ liệu Cấp cao, làm việc tại Croatia. Tác giả Công nghệ Hàng đầu với hơn 700 bài viết đã xuất bản, đạt trên 10 triệu lượt xem. Tác giả cuốn sách Tự động hóa Machine Learning với TPOT.

Câu hỏi thường gặp

Hàm kích hoạt GELU là gì?

GELU, hay Gaussian Error Linear Unit, là một hàm kích hoạt dùng trong mạng nơ-ron. Không giống ReLU, GELU co giãn đầu vào một cách mượt mà dựa trên độ lớn bằng phương pháp xác suất. Điều này khiến nó phù hợp hơn cho các kiến trúc sâu nơi chất lượng gradient quan trọng.

GELU khác ReLU như thế nào?

ReLU đưa tất cả đầu vào âm về 0 với một ngưỡng cứng tại 0, có thể khiến nơ-ron ngừng học - vấn đề được gọi là nơ-ron chết. GELU tránh điều này bằng cách dần dần giảm tỷ lệ đầu vào âm thay vì cắt bỏ chúng. Bạn sẽ có dòng gradient mượt hơn và hiệu năng tốt hơn trong các mạng sâu.

Khi nào tôi nên dùng GELU thay cho các hàm kích hoạt khác?

GELU hoạt động tốt nhất trong các kiến trúc sâu, đặc biệt là các mô hình dựa trên transformer như BERT và GPT. Với các mạng nông hoặc tác vụ đơn giản, chi phí tính toán bổ sung hiếm khi đáng để chuyển từ ReLU. Hãy bắt đầu với ReLU làm chuẩn so sánh, và bạn luôn có thể thử các lựa chọn khác.

Sự khác nhau giữa công thức GELU chính xác và bản xấp xỉ là gì?

Công thức GELU chính xác dùng hàm phân phối tích lũy Gaussian, yêu cầu tính hàm error - một phép toán chậm ở quy mô lớn. Bản xấp xỉ thay thế nó bằng một biểu thức dựa trên tanh, nhanh hơn và được hỗ trợ tốt trên phần cứng hiện đại. Trên thực tế, hai cách cho kết quả gần như giống hệt, đó là lý do hầu hết framework dùng xấp xỉ theo mặc định.

GELU có hoạt động trên cả PyTorch và TensorFlow không?

Có, cả hai framework đều hỗ trợ GELU. Trong PyTorch, bạn có thể dùng nn.GELU() như một mô-đun trong định nghĩa mô hình. Trong TensorFlow, bạn có thể truyền "gelu" dưới dạng chuỗi cho tham số activation của bất kỳ tầng nào, hoặc dùng keras.layers.Activation("gelu").

Chủ đề

Học cùng DataCamp

Courses

Giảm Chiều Dữ Liệu với Python

4 giờ
36.3K
Hiểu rõ khái niệm giảm chiều trong dữ liệu của bạn và thành thạo các kỹ thuật để thực hiện điều đó trong Python.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow
Có liên quan

blogs

Claude Opus 4.6: Tính năng, điểm chuẩn, các bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu bảng xếp hạng về mã hóa theo hướng tác nhân và suy luận phức tạp. Thêm nữa, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem thêmXem thêm