Gradient biến mất và bùng nổ
Gradient biến mất và bùng nổ
Mạng càng sâu, gradient càng phải đi qua nhiều lớp trước khi tới lớp đầu. Xem nó tóp về 0 hay vọt lên.
Để học, mạng nơ ron phải biết mỗi trọng số nên chỉnh theo hướng nào, và câu trả lời đó là gradient. Lan truyền ngược tính gradient bắt đầu từ lớp ra rồi đẩy dần về lớp đầu. Vấn đề là ở mỗi lớp gradient bị nhân với một hệ số, nên khi mạng sâu, con số đó bị nhân đi nhân lại rất nhiều lần trước khi chạm tới những lớp gần đầu vào.
Hệ số nhân mỗi lớp bằng đạo hàm của hàm kích hoạt tại chỗ nơ ron đang đứng nhân với độ lớn trọng số. Chỗ đang đứng ấy là điểm làm việc x, và nó quan trọng hơn vẻ ngoài: tanh có đạo hàm tối đa bằng 1, nhưng nó chỉ đạt đúng 1 tại một điểm duy nhất là x = 0, còn ReLU giữ đạo hàm đúng bằng 1 trên cả nửa trục dương. Lấy trần đạo hàm thay cho giá trị thật là cách đọc lạc quan nhất có thể, và nó xoá mất đúng chỗ hai hàm khác nhau. Nếu hệ số nhỏ hơn 1, nhân dồn qua vài chục lớp sẽ ép gradient về gần 0: các lớp đầu gần như không nhận được tín hiệu nào để học, đó là gradient biến mất. Nếu hệ số lớn hơn 1, nhân dồn lại thổi gradient lên rất lớn, các bước cập nhật nhảy loạn, đó là gradient bùng nổ. Chỉ khi hệ số quanh 1 thì gradient mới giữ nguyên độ lớn xuyên suốt.
Thử ngay
Thử điều này:
- Trạng thái mở bài là
sigmoid, sâu15, weight scale1.0, điểm làm việcx = 1: hệ số mỗi lớp0.1966và gradient tới lớp 1 chỉ còn1.29e-10. Kéo độ sâu lên30thì nó xuống tận3.27e-21. - Giữ nguyên mọi thứ, đổi sang
ReLU: hệ số nhảy lên đúng1.0000và mọi cột phẳng ngang đường vàng, gradient giữ nguyên1từ lớp ra về lớp đầu. Đây là cả nội dung của mục dưới. - Vẫn để
ReLUrồi đẩy weight scale lên2.0: các cột dựng đứng vượt lên trên đường vàng, gradient bùng nổ theo cấp số nhân. - Kéo riêng điểm làm việc
x, để nguyêntanh. Ởx = 0thì đạo hàm đúng1và các cột phẳng nhưReLU; nhích lênx = 1nó còn0.4200, tớix = 2chỉ còn0.0707. Cùng một hàm, cùng một mạng, khác nhau ở chỗ nơ ron đang đứng. - Chỗ hay bị nhớ ngược. Ở
x = 0thìtanh(1.0000) đúng là hơn hẳnsigmoid(0.2500). Nhưng từx = 1.67trở đi thì đảo chiều: ởx = 2sigmoid cho0.1050còn tanh chỉ còn0.0707, tức tanh mới là hàm teo mạnh hơn. Con số này khớp với bài Hàm kích hoạt, nơi ởx = 1.5sigmoid cho0.14914645207033286và tanh cho0.18070663892364858. Cùng một công thức, hai bài tính ra cùng một số. - Chỉ có
ReLUlà bất biến theoxtrên cả dải: kéoxtừ0tới3mà hệ số vẫn đứng nguyên1.0000.
Vì sao ReLU giúp
Với một nơ ron đang hoạt động, đạo hàm của ReLU đúng bằng 1 ở mọi điểm làm việc dương, chứ không phải chỉ ở một điểm như tanh, nên nó chuyển gradient qua nguyên vẹn thay vì cắt bớt như sigmoid (tối đa chỉ 0.25 mỗi lớp, và càng ra xa gốc càng nhỏ hơn nữa). Nhờ vậy gradient không bị tóp dần khi mạng sâu, và các lớp gần đầu vào vẫn nhận được tín hiệu để học. Đây là một lý do lớn khiến ReLU thay thế sigmoid ở các lớp ẩn của mạng sâu.
Gradient bị nhân dồn qua từng lớp, nên hệ số nhỏ hơn 1 sẽ làm nó biến mất và lớn hơn 1 sẽ làm nó bùng nổ khi mạng đủ sâu.
- 1Chọn sigmoid và kéo độ sâu lên 30, các cột ở những lớp gần đầu vào trông ra sao?
- 2Với ReLU và weight scale bằng 1.0, gradient thay đổi thế nào khi đi từ lớp ra về lớp đầu?
- 3Điều gì làm gradient bùng nổ khi truyền ngược qua mạng sâu?