Chuyển tới nội dung chính

Gradient biến mất và bùng nổ

Đổi tham sốTính lại thậtThang log

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

Gradient biến mất và bùng nổ · sâu bao nhiêu thì tắt
f'(x) = 0.1966hệ số/lớp = 0.1966gradient lớp 1 = 1.29e-10dải 1.29e-101.000gradient biến mất
1e61e311e-31e-61e-91e-121e-151e-18lớp 1: gradient ≈ 1.29e-10lớp 2: gradient ≈ 6.56e-10lớp 3: gradient ≈ 3.34e-9lớp 4: gradient ≈ 1.70e-8lớp 5: gradient ≈ 8.63e-8lớp 6: gradient ≈ 4.39e-7lớp 7: gradient ≈ 2.23e-6lớp 8: gradient ≈ 1.14e-5lớp 9: gradient ≈ 5.78e-5lớp 10: gradient ≈ 2.94e-4lớp 11: gradient ≈ 1.49e-3lớp 12: gradient ≈ 7.60e-3lớp 13: gradient ≈ 0.039lớp 14: gradient ≈ 0.197lớp 15: gradient ≈ 1.000gradient = 1lớp 1 · đầu (xa lớp ra)lớp 15 · ra

Thử điều này:

  • Trạng thái mở bài là sigmoid, sâu 15, weight scale 1.0, điểm làm việc x = 1: hệ số mỗi lớp 0.1966 và gradient tới lớp 1 chỉ còn 1.29e-10. Kéo độ sâu lên 30 thì nó xuống tận 3.27e-21.
  • Giữ nguyên mọi thứ, đổi sang ReLU: hệ số nhảy lên đúng 1.0000 và mọi cột phẳng ngang đường vàng, gradient giữ nguyên 1 từ lớp ra về lớp đầu. Đây là cả nội dung của mục dưới.
  • Vẫn để ReLU rồi đẩy weight scale lên 2.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ên tanh.x = 0 thì đạo hàm đúng 1 và các cột phẳng như ReLU; nhích lên x = 1 nó còn 0.4200, tới x = 2 chỉ còn 0.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 = 0 thì tanh (1.0000) đúng là hơn hẳn sigmoid (0.2500). Nhưng từ x = 1.67 trở đi thì đảo chiều: ở x = 2 sigmoid cho 0.1050 còn tanh chỉ còn 0.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.5 sigmoid cho 0.14914645207033286 và tanh cho 0.18070663892364858. Cùng một công thức, hai bài tính ra cùng một số.
  • Chỉ có ReLU là bất biến theo x trên cả dải: kéo x từ 0 tới 3 mà hệ số vẫn đứng nguyên 1.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.

Điều rút ra

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.

Câu hỏi tự kiểm0/3 đúngchưa trả lời
  1. 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?
  2. 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. 3Điều gì làm gradient bùng nổ khi truyền ngược qua mạng sâu?