machine learning,

Các hàm kích hoạt (activation function) trong neural network

Việt Anh Việt Anh Bài viết Sep 22, 2019 · 7 phút đọc
Các hàm kích hoạt (activation function) trong neural network
Chia sẻ

Hàm kích hoạt (activation function) mô phỏng tỷ lệ truyền xung qua axon của một neuron thần kinh. Trong bài viết này, chúng ta sẽ cùng tìm hiểu các hàm kích hoạt phổ biến nhất và các ưu, nhược điểm của chúng.

Trước hết hãy bắt đầu với một hình vẽ hết sức thú vị để hiểu rõ hơn về sự tương quan giữa neuron thần kinh sinh học và cấu trúc mô phỏng chúng ta tạo ra trong máy tính. Mình xin phép được lấy hình vẽ từ tài liệu của khoá học CS231n.

Cấu trúc neuron sinh học Cấu trúc nơ-ron não người
Cấu trúc neuron trong học máy Cấu trúc nơ-ron học máy

Giống như trong mô hình sinh học, các xung thần kinh được truyền qua axon với một tỷ lệ nào đó. Ở mô hình học máy mô phỏng chúng ta xây dựng, các hàm kích hoạt sẽ điều chỉnh tỷ lệ truyền này. Các hàm này thường là các hàm phi tuyến.

Dưới đây là các hàm kích hoạt thường dùng kèm theo giải thích về ưu và nhược điểm của chúng.

1. Sigmoid

Công thức:

Đồ thị hàm Sigmoid

Hàm Sigmoid nhận đầu vào là một số thực và chuyển thành một giá trị trong khoảng (0;1) (xem đồ thị phía trên). Đầu vào là số thực âm rất nhỏ sẽ cho đầu ra tiệm cận với 0, ngược lại, nếu đầu vào là một số thực dương lớn sẽ cho đầu ra là một số tiệm cận với 1. Trong quá khứ hàm Sigmoid hay được dùng vì có đạo hàm rất đẹp. Tuy nhiên hiện nay hàm Sigmoid rất ít được dùng vì những nhược điểm sau:

1. Hàm Sigmoid bão hào và triệt tiêu gradient: Một nhược điểm dễ nhận thấy là khi đầu vào có trị tuyệt đối lớn (rất âm hoặc rất dương), gradient của hàm số này sẽ rất gần với 0. Điều này đồng nghĩa với việc các hệ số tương ứng với unit đang xét sẽ gần như không được cập nhật (còn được gọi là vanishing gradient).

2. Hàm Sigmoid không có trung tâm là 0 gây khó khăn cho việc hội tụ.

Tại sao lại thế? $$ f=\sum w_ix_i+b $$ $$ \frac{df}{dw_i}=x_i $$ $$ \frac{dL}{dw_i}=\frac{dL}{df}\frac{df}{dw_i}=\frac{dL}{df}x_i $$ Vì \( x_i>0 \) nên \( \dfrac{dL}{dw_i} \) cùng dấu với \( \dfrac{dL}{df} \).

Để trực quan hơn, hãy xét trường hợp có 2 trọng số \( w_1 \) và \( w_2 \) cần được tối ưu. Khi gradient luôn có cùng dấu, chúng ta sẽ chỉ có thể di chuyển hướng đông bắc hoặc hướng tây nam trong đồ thị phía dưới để đến được điểm tối ưu. Nếu điểm tối ưu nằm ở phía tây bắc như hình dưới, chúng ta sẽ cần đi đường zig zag để đến đó.

Zig Zag Sigmoid

Rất may chúng ta có thể giải quyết vấn đề này bằng cách chuẩn hoá dữ liệu về dạng có trung tâm là 0 (zero centered) với các thuật toán batch/layer normalization.

2. Tanh

Công thức:

Đồ thị hàm Tanh

Hàm \( \tanh \) nhận đầu vào là một số thực và chuyển thành một giá trị trong khoảng (-1; 1). Cũng như Sigmoid, hàm Tanh bị bão hoà ở 2 đầu (gradient thay đổi rất ít ở 2 đầu). Tuy nhiên hàm Tanh lại đối xứng qua 0 nên khắc phục được một nhược điểm của Sigmoid.

Hàm \( \tanh \) còn có thể được biểu diễn bằng hàm sigmoid như sau:

\( \tanh(x) = 2 \sigma(2x) -1 \).

3. ReLU

Công thức:

Đồ thị hàm ReLU

Hàm ReLU đang được sử dụng khá nhiều trong những năm gần đây khi huấn luyện các mạng neuron. ReLU đơn giản lọc các giá trị < 0. Nhìn vào công thức chúng ta dễ dàng hiểu được cách hoạt động của nó. Một số ưu điểm khá vượt trội của nó so với Sigmoid và Tanh:

  • (+) Tốc độ hội tụ nhanh hơn hẳn. ReLU có tốc độ hội tụ nhanh gấp 6 lần Tanh (Krizhevsky et al.). Điều này có thể do ReLU không bị bão hoà ở 2 đầu như Sigmoid và Tanh.

  • (+) Tính toán nhanh hơn. Tanh và Sigmoid sử dụng hàm exp và công thức phức tạp hơn ReLU rất nhiều do vậy sẽ tốn nhiều chi phí hơn để tính toán.

  • (-) Tuy nhiên ReLU cũng có một nhược điểm: Với các node có giá trị nhỏ hơn 0, qua ReLU activation sẽ thành 0, hiện tượng đấy gọi là “Dying ReLU“. Nếu các node bị chuyển thành 0 thì sẽ không có ý nghĩa với bước linear activation ở lớp tiếp theo và các hệ số tương ứng từ node đấy cũng không được cập nhật với gradient descent. => Leaky ReLU ra đời.

  • (-) Khi learning rate lớn, các trọng số (weights) có thể thay đổi theo cách làm tất cả neuron dừng việc cập nhật.

4. Leaky ReLU

Công thức:

với \( \alpha \) là hằng số nhỏ.

Đồ thị hàm Leaky ReLU

Leaky ReLU là một cố gắng trong việc loại bỏ “dying ReLU”. Thay vì trả về giá trị 0 với các đầu vào <0 thì Leaky ReLU tạo ra một đường xiên có độ dốc nhỏ (xem đồ thị). Có nhiều báo cáo về việc hiệu Leaky ReLU có hiệu quả tốt hơn ReLU, nhưng hiệu quả này vẫn chưa rõ ràng và nhất quán.

Ngoài Leaky ReLU có một biến thể cũng khá nổi tiếng của ReLU là PReLU. PReLU tương tự Leaky ReLU nhưng cho phép neuron tự động chọn hệ số \( \alpha \) tốt nhất.

5. Maxout

Khi đến với Maxout, chúng ta sẽ không sử dụng công thức dạng \( f(w^Tx + b) \) nữa. Một dạng khá phổ biến là Maxout neuron (giới thiệu bởi Goodfellow et al.)) được tính bằng công thức: \( \max(w_1^Tx+b_1, w_2^Tx + b_2) \). Leaky ReLU và ReLU là các dạng đặc biệt của công thức này (Với ReLU, áp dụng công thức với \( w_1, b_1 = 0 \)). Maxout có tất cả ưu điểm của Leaky ReLU, ReLU. Tuy vậy, nó khiến mạng phải sử dụng gấp đôi số tham số (parameter) cho mỗi neuron, vì thế làm tăng đáng kể chi phí cả về bộ nhớ và tính toán - một điều cần suy xét khi huấn luyện mạng deep learning ở hiện tại.

6. Vậy lựa chọn thế nào giữa các hàm kích hoạt?

Có một số lời khuyên đã được chứng minh qua thực nghiệm như sau:

  • Sử dụng ReLU trước tiên. Chú ý tinh chỉnh learning rate và theo dõi tỷ lệ dead unit (các node bị die do rơi vào khoảng < 0 của ReLU).

  • Có thể thử Leaky ReLU, PReLU, Maxout. Tanh cũng có thể là một lựa chọn, dù không tốt lắm. Không dùng Sigmoid.

  • Chú ý chuẩn hoá dữ liệu đầu vào. Điều này sẽ làm tăng đáng kể hiệu quả huấn luyện.

  • Sigmoid và Tanh không thể được sử dụng training các mạng có nhiều lớp (mạng deep learning) do vấn đề vanishing gradient.

Tham khảo:

Đăng ký nhận bài viết mới
Đăng ký nhận bài viết mới qua email