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

Hướng dẫn cho người mới bắt đầu về Rectified Linear Unit (ReLU)

Tìm hiểu những kiến thức cơ bản về một trong những hàm kích hoạt phổ biến nhất cho mạng nơ-ron
Javier Canales Luna
Javier Canales Luna

Tạo tài khoản miễn phí của bạn

Luyện tập và Lộ trình tiến trình của bạn.

Tiếp tục với GoogleBằng cách tiếp tục, bạn chấp nhận Điều khoản sử dụng, Chính sách quyền riêng tư và việc dữ liệu của bạn được lưu trữ tại Hoa Kỳ.

Các hàm kích hoạt như Rectified Linear Unit (ReLU) là nền tảng của mạng nơ-ron hiện đại. Không có chúng, nhiều ứng dụng AI trong thế giới thực—từ nhận dạng hình ảnh đến hệ thống gợi ý—sẽ không thể thực hiện được. Hướng dẫn này khám phá những điều cơ bản về ReLU, ưu điểm, hạn chế và cách triển khai.

Kiến thức cơ bản về ReLU

Một số ứng dụng AI mạnh mẽ nhất sẽ không thể thành hiện thực nếu không có mạng nơ-ron nhân tạo. Mạng nơ-ron là các mô hình tính toán lấy cảm hứng từ não người. Chúng gồm các nút liên kết với nhau, hay còn gọi là "nơ-ron", cùng hoạt động để xử lý thông tin và đưa ra quyết định. Điều khiến một mạng nơ-ron trở nên "sâu" là số lượng tầng giữa đầu vào và đầu ra. Mạng nơ-ron sâu có nhiều tầng, cho phép học các đặc trưng phức tạp hơn và đưa ra dự đoán chính xác hơn.

Mạng nơ-ron sâu

Mạng nơ-ron sâu. Nguồn: DataCamp

Tuy nhiên, các mô hình này không chỉ đơn giản là các tầng. Những thành phần khác cũng rất quan trọng để mạng nơ-ron có thể phát huy hiệu quả. 

Một trong số đó là các hàm kích hoạt. Bạn có thể xem hàm kích hoạt như những người ra quyết định; chúng quyết định thông tin nào sẽ được truyền sang tầng tiếp theo, bổ sung mức độ phức tạp mới giúp mạng nơ-ron đưa ra các quyết định tinh tế.

Tại đây, chúng tôi sẽ giới thiệu một trong những hàm kích hoạt phổ biến và được sử dụng rộng rãi nhất: Rectified Linear Unit (ReLU). Chúng tôi sẽ giải thích những điều cơ bản về hàm này và một số biến thể, ưu nhược điểm, cũng như cách triển khai với Pytorch. Tiếp tục đọc nhé?

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

Hàm kích hoạt là khối xây dựng không thể thiếu của mạng nơ-ron. Chúng biến đổi tín hiệu đầu vào của một nút trong mạng nơ-ron thành tín hiệu đầu ra rồi truyền sang tầng tiếp theo. Không có hàm kích hoạt, mạng nơ-ron sẽ bị giới hạn ở việc mô hình hóa các quan hệ tuyến tính giữa đầu vào và đầu ra, chẳng hạn như thông qua phép nhân ma trận.

Tuy nhiên, hầu hết dữ liệu trong thế giới thực không thể mô hình hóa bằng các quan hệ tuyến tính. Phi tuyến tính nắm bắt những mẫu như việc từ không có con đến có một con có thể ảnh hưởng đến giao dịch ngân hàng của bạn khác với từ ba con lên bốn con. Nếu mạng nơ-ron không có hàm kích hoạt, chúng sẽ không học được các mẫu phi tuyến phức tạp tồn tại trong các hiện tượng thực tế.

Hàm tuyến tính so với phi tuyến

Hàm tuyến tính so với phi tuyến. Nguồn: DataCamp

Các hàm kích hoạt cho phép mạng nơ-ron học các mối quan hệ bằng cách đưa hành vi phi tuyến vào. Nói cách khác, hàm kích hoạt tạo ra một ngưỡng số để quyết định có kích hoạt một nơ-ron hay không, đưa vào mức linh hoạt then chốt để mạng nơ-ron mô hình hóa dữ liệu phức tạp và tinh vi.

ReLU là gì?

Một trong những hàm kích hoạt phổ biến và được dùng rộng rãi nhất là ReLU (rectified linear unit). Tương tự các hàm kích hoạt khác, nó cung cấp tính phi tuyến cho mô hình để hiệu quả tính toán tốt hơn. 

Hàm kích hoạt ReLU có dạng:

f(x) = max(0, x)

Hàm ReLU xuất ra giá trị lớn nhất giữa đầu vào và 0, như đồ thị minh họa. Với đầu vào dương, đầu ra bằng chính đầu vào. Với đầu vào âm nghiêm ngặt, đầu ra bằng 0.

Hàm kích hoạt Rectified Linear Unit (ReLU).

Hàm kích hoạt Rectified Linear Unit (ReLU). Nguồn: DataCamp

Ưu điểm khi dùng ReLU

Một trong những ưu điểm đáng kể nhất của ReLU là giúp giảm thiểu vấn đề biến mất gradient (vanishing gradient). Đây là thách thức xảy ra khi huấn luyện mạng nơ-ron sâu bằng lan truyền ngược. Nó xuất hiện khi gradient dùng để cập nhật trọng số của mạng trở nên rất nhỏ hoặc "biến mất" khi truyền ngược qua các tầng. Điều này ngăn cản việc cập nhật trọng số đúng cách, có thể làm chậm hoặc dừng quá trình học. Bạn có thể đọc giải thích đầy đủ về vấn đề biến mất gradient trong khóa học Giới thiệu Học sâu với PyTorch của chúng tôi.

Vì hàm ReLU không có cận trên và gradient không hội tụ về 0 khi x lớn, ReLU vượt qua vấn đề biến mất gradient, vốn thường gặp khi dùng sigmoid và softmax. Xem bài viết riêng của chúng tôi để khám phá các hàm kích hoạt phổ biến khác.

Hơn nữa, do ReLU cho ra 0 với mọi đầu vào âm, nó tự nhiên dẫn đến các kích hoạt thưa (sparse activations). Nói cách khác, chỉ một tập con nơ-ron được kích hoạt trong quá trình huấn luyện, giúp tính toán hiệu quả hơn.

Cuối cùng, hành vi này cho phép mạng mở rộng lên nhiều tầng mà không làm tăng đáng kể gánh nặng tính toán so với các hàm phức tạp hơn như tanh hoặc sigmoid. Điều này khiến ReLU trở thành hàm kích hoạt mặc định phổ biến nhất và thường là lựa chọn tốt nếu bạn chưa chắc nên dùng hàm nào cho mô hình của mình.

Triển khai ReLU trong PyTorch

Triển khai ReLU trong PyTorch khá dễ. Bạn chỉ cần dùng hàm nn.ReLU() để tạo hàm và thêm vào mô hình.

Trong ví dụ sau, chúng ta áp dụng ReLU cho một nơ-ron đơn giản và tính gradient trong trường hợp giá trị âm.

# Create a ReLU function with PyTorch
relu_pytorch = nn.ReLU()

# Apply your ReLU function on x, and calculate gradients
x = torch.tensor(-1.0, requires_grad=True)
y = relu_pytorch(x)
y.backward()

# Print the gradient of the ReLU function for x
gradient = x.grad
print(gradient)
>>> tensor(0.)

Lưu ý rằng giá trị đầu vào là -1 và hàm ReLU trả về 0. Nhớ rằng với các giá trị x âm, đầu ra của ReLU luôn bằng 0, và thực vậy, gradient bằng 0 ở mọi nơi vì hàm không thay đổi với bất kỳ giá trị âm nào của x.

Các biến thể của ReLU

ReLU có lẽ là hàm kích hoạt được dùng nhiều nhất, nhưng đôi khi nó có thể không phù hợp với vấn đề bạn đang giải quyết. May mắn thay, các nhà nghiên cứu học sâu đã phát triển một số biến thể ReLU đáng để thử trong mô hình của bạn. Dưới đây là những lựa chọn thay thế phổ biến nhất

Leaky ReLU

Leaky ReLU có dạng:

f(x) = max(0.01x, x)

Mục tiêu của Leaky ReLU là giải quyết vấn đề "ReLU chết" (dying ReLU). Chúng ta đã đề cập rằng ReLU luôn cho ra giá trị 0 với đầu vào âm. Khi điều này xảy ra, gradient của các nút có giá trị âm sẽ bị đặt về 0 trong phần còn lại của quá trình huấn luyện, khiến tham số đó không học được nữa. Để vượt qua thách thức này, Leaky ReLU dùng một hệ số nhân cho đầu vào âm. Kết quả là hàm không bằng 0 mà sẽ có một độ dốc âm nhỏ, như thể hiện trong đồ thị sau:

Hàm kích hoạt Leaky ReLU.

Hàm kích hoạt Leaky ReLU. Nguồn: DataCamp

Parametric ReLU (PReLU)

Leaky ReLU đưa vào một hệ số nhân để vượt qua vấn đề ReLU chết. Parametric ReLU (PReLU) tiến thêm một bước, cung cấp một tham số có thể học được (a) thay vì hằng số đơn giản để tính giá trị cho đầu vào âm: 

f(x) = max(ax, x)

Trong khi PReLU mang lại cải thiện so với ReLU và Leaky ReLU về độ chính xác và khả năng thích ứng (đặc biệt phù hợp để nắm bắt mẫu trong các tác vụ phức tạp như thị giác máy tính hoặc nhận dạng giọng nói), nó cũng làm tăng độ phức tạp của mô hình. Việc huấn luyện tham số này tốn thời gian và đòi hỏi tinh chỉnh, regularization cẩn thận. 

Hàm kích hoạt Parametric ReLU

Hàm kích hoạt Parametric ReLU. Nguồn: DataCamp

Exponential Linear Unit (ELU)

Một lựa chọn tuyệt vời khác cho ReLU là Exponential Linear Unit (ELU), với công thức sau:

Trái ngược với ReLU, ELU có giá trị âm, cho phép đẩy trung bình kích hoạt của đơn vị tiến gần về 0 hơn, nhờ đó ít dễ bị biến mất gradient. Ngoài ra, việc có trung bình kích hoạt gần 0 còn giúp học nhanh hơn và hội tụ tốt hơn.

Hàm kích hoạt ELU

Hàm kích hoạt ELU. Nguồn: DataCamp

Các vấn đề thường gặp với ReLU

ReLU là một hàm kích hoạt tuyệt vời, nhưng không phải "thuốc chữa bách bệnh". Cụ thể, ReLU có thể gặp hai vấn đề nổi tiếng.

Thứ nhất là vấn đề ReLU chết. Như đã nói, ReLU luôn cho ra 0 với đầu vào âm. Điều này có thể khiến trọng số được cập nhật theo cách mà nơ-ron sẽ không bao giờ kích hoạt lại với bất kỳ điểm dữ liệu nào. 

Nếu điều này xảy ra, gradient chảy qua đơn vị đó sẽ mãi bằng 0 từ thời điểm đó trở đi, ngăn tham số này học. Các biến thể ReLU như Leaky ReLU và PReLU được tạo ra để giải quyết vấn đề này.

Gradient không ổn định cũng có thể xảy ra theo chiều ngược lại. Vấn đề nổ gradient (exploding gradients) xuất hiện khi gradient ngày càng lớn, dẫn đến các cập nhật tham số khổng lồ và huấn luyện phân kỳ. 

Khi đó, các sai số gradient lớn tích lũy và trọng số mô hình trở nên quá lớn. Vấn đề này có thể gây kéo dài thời gian huấn luyện và hiệu năng mô hình kém. Có một số kỹ thuật để xử lý nổ gradient, bao gồm cắt gradient (gradient clipping) và chuẩn hóa theo lô (batch normalization). 

Ứng dụng của ReLU trong mạng nơ-ron

Nhờ những đặc tính riêng, ReLU đã trở thành hàm kích hoạt phổ biến nhất, là lựa chọn mặc định trong các framework như PyTorch và TensorFlow, và được dùng rộng rãi trong nhiều ứng dụng học sâu, bao gồm:

  • Nhận dạng hình ảnh: ReLU là thành phần quan trọng trong mạng nơ-ron tích chập (CNN), các mạng chuyên dụng thường dùng để trích xuất đặc trưng và xử lý ảnh.
  • NLP: ReLU cũng được dùng trong nhiều tác vụ Xử lý ngôn ngữ tự nhiên (NLP). Hàm kích hoạt này đã được dùng thành công để đưa phi tuyến tính vào các lĩnh vực như nhận dạng giọng nói và xử lý âm thanh.
  • Hệ thống gợi ý: ReLU được dùng trong hệ thống gợi ý để cung cấp đề xuất cá nhân hóa. 

Kết luận

Chúng ta đã khám phá vai trò then chốt của các hàm kích hoạt ReLU trong quá trình huấn luyện mạng nơ-ron. Dù đơn giản, ReLU là một trong những hàm kích hoạt hiệu quả nhất hiện có, và có lẽ là phổ biến nhất. 

Khi mạng nơ-ron tiếp tục phát triển, việc khám phá các hàm kích hoạt chắc chắn sẽ mở rộng, có thể bao gồm những dạng mới giải quyết các thách thức cụ thể của kiến trúc mới nổi. 

Việc lựa chọn hàm kích hoạt là một sự cân bằng—kết hợp giữa hiểu biết khoa học và trực giác tinh tế—có thể ảnh hưởng đáng kể đến hiệu năng của mạng nơ-ron. 

Muốn tìm hiểu thêm về học sâu? Hãy xem các tài liệu chuyên đề của chúng tôi và sẵn sàng cho một trong những công nghệ chuyển đổi mạnh mẽ nhất trong AI:

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

Điều gì khiến ReLU khác với các hàm kích hoạt sigmoid và tanh?

ReLU khác với sigmoid và tanh vì nó không nén đầu ra vào một khoảng cố định (ví dụ, [0,1] với sigmoid hoặc [-1,1] với tanh). Thay vào đó, nó trả về chính đầu vào cho các giá trị dương và 0 cho các giá trị âm. Sự đơn giản này giúp ReLU hiệu quả về tính toán và hỗ trợ giải quyết vấn đề biến mất gradient thường gặp với sigmoid và tanh.

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

ReLU là lựa chọn mặc định tuyệt vời cho hầu hết các tầng ẩn trong mạng nơ-ron sâu, đặc biệt khi huấn luyện các mô hình lớn hoặc xử lý tập dữ liệu có quan hệ phi tuyến phức tạp. Tuy nhiên, nếu bạn gặp các vấn đề như "ReLU chết" hoặc mô hình hoạt động kém, hãy cân nhắc thử các biến thể như Leaky ReLU, PReLU hoặc ELU.

Có thể dùng ReLU ở tầng đầu ra của mạng nơ-ron không?

ReLU thường không được dùng ở tầng đầu ra của mạng nơ-ron vì miền giá trị của nó không bị chặn trên, có thể khiến việc diễn giải đầu ra trở nên khó khăn. Các lựa chọn phổ biến cho tầng đầu ra gồm:

  • Sigmoid: Cho bài toán phân loại nhị phân.
  • Softmax: Cho phân loại đa lớp.
  • Kích hoạt tuyến tính: Cho các bài toán hồi quy.
ReLU tạo ra kích hoạt thưa như thế nào và tại sao điều đó quan trọng?

ReLU góp phần tạo ra các kích hoạt thưa bằng cách xuất ra 0 cho mọi đầu vào âm, nghĩa là chỉ một tập con nơ-ron hoạt động tại một thời điểm. Kích hoạt thưa giúp giảm chi phí tính toán, ngăn quá khớp và khuyến khích mạng tập trung vào những đặc trưng liên quan nhất của dữ liệu.

Một số mẹo thực tế để gỡ lỗi các vấn đề do ReLU gây ra trong quá trình huấn luyện là gì?

Dưới đây là một vài mẹo:

  • Kiểm tra vấn đề ReLU chết: Theo dõi các kích hoạt trong quá trình huấn luyện. Nếu số lượng lớn nơ-ron liên tục cho ra 0, hãy cân nhắc dùng Leaky ReLU hoặc PReLU.
  • Dùng batch normalization: Có thể giúp ổn định gradient và ngăn các vấn đề như nổ gradient, vốn có thể xảy ra khi ReLU cho ra các giá trị dương lớn.
  • Cắt gradient: Nếu xảy ra nổ gradient, cắt có thể giới hạn độ lớn gradient ở một giá trị nhất định, cải thiện độ ổn định.
  • Thử nghiệm khởi tạo trọng số: Khởi tạo phù hợp (ví dụ, khởi tạo He) có thể giảm khả năng xuất hiện nơ-ron chết hoặc hội tụ chậm.
Javier Canales Luna

Tác giả

Javier Canales Luna

Tôi là một chuyên viên phân tích dữ liệu tự do, hợp tác với các công ty và tổ chức trên toàn thế giới trong các dự án khoa học dữ liệu. Tôi cũng là giảng viên khoa học dữ liệu với hơn 2 năm kinh nghiệm. Tôi thường xuyên viết bài về khoa học dữ liệu bằng tiếng Anh và tiếng Tây Ban Nha; một số bài đã được đăng trên các trang uy tín như DataCamp, Towards Data Science và Analytics Vidhya. Là một nhà khoa học dữ liệu có nền tảng khoa học chính trị và luật, mục tiêu của tôi là làm việc tại giao điểm giữa chính sách công, pháp luật và công nghệ, tận dụng sức mạnh của ý tưởng để thúc đẩy các giải pháp và cách tiếp cận mới nhằm giúp chúng ta đối mặt với những thách thức cấp bách, đặc biệt là khủng hoảng khí hậu. Tôi xem mình là người tự học, không ngừng trau dồi và là một người ủng hộ vững chắc cho tính đa ngành. Không bao giờ là quá muộn để học điều mới.

Chủ đề

Liên quan