Exploding Gradient là gì?
Exploding gradient (gradient bùng nổ) là hiện tượng giá trị gradient trong lúc huấn luyện mạng nơ-ron tăng vọt lên mức cực lớn, thay vì dao động ổn định quanh một giá trị nào đó. Gradient to bất thường khiến bước cập nhật trọng số của mô hình bị văng khỏi vùng tối ưu, hàm mất mát (loss) lao dốc hoặc trả về NaN chỉ sau vài vòng lặp.
Nói cho dễ hình dung: mô hình đang học tử tế thì đột nhiên “choáng” và đầu ra thành rác. Đây là anh em song sinh với vanishing gradient, khác nhau mỗi chiều: bên kia gradient teo dần về không, bên này phình to ra vô cùng.

Exploding gradient xảy ra như thế nào?
Đây là hệ quả trực tiếp của backpropagation. Khi lan truyền lỗi từ lớp đầu ra ngược về lớp đầu vào, gradient đi qua từng lớp bằng phép nhân chuỗi theo quy tắc đạo hàm hàm hợp. Nếu các hệ số trong chuỗi nhân đó lớn hơn 1 thì càng đi sâu, giá trị càng phình to theo cấp số nhân.
Mình hay ví hiện tượng này giống lãi kép: một lớp nhân thêm vài phần trăm thì không đáng kể, nhưng nhân chục lần liên tiếp thì con số phóng lên khỏi tầm kiểm soát. Mạng càng sâu, chuỗi nhân càng dài, rủi ro càng cao.
RNN là “vùng dịch” của exploding gradient. Vì loại mạng này dùng chung bộ trọng số qua từng bước thời gian, một câu dài vài trăm từ đồng nghĩa với việc lặp lại chuỗi nhân gradient đó cả vài trăm lần. Đó là lý do các mô hình ngôn ngữ đời cũ hay “chết” giữa chừng khi xử lý văn bản dài.
Dấu hiệu nào cho biết mô hình đang bị exploding gradient?
Ba triệu chứng dưới đây xuất hiện gần như mọi lần, ai mới train model cũng nên thuộc lòng:
- Loss nhảy loạn hoặc thành NaN: đường loss đang giảm đều tự nhiên vọt lên, hoặc báo NaN ngay mà không có dấu hiệu báo trước.
- Trọng số có giá trị vô lý: kiểm tra weights thấy các con số hàng triệu, hoặc inf, thay vì dao động quanh giá trị nhỏ.
- Predictions vỡ hoàn toàn: mô hình chạy vài epoch đẹp mắt rồi output toàn giá trị rác, mất hẳn ý nghĩa thống kê.
NaN là tín hiệu rõ ràng nhất. Mình từng ngồi cả buổi tối nhìn loss thành NaN ngay epoch thứ hai mà không hiểu chuyện gì xảy ra, đến khi in gradient norm ra thì thấy nó vượt mức bình thường cả nghìn lần. Từ đó hình thành thói quen log gradient norm mỗi lần train mô hình mới.
Cách khắc phục exploding gradient hiệu quả nhất là gì?
Gradient clipping là giải pháp số một. Bạn đặt một ngưỡng, ví dụ 1.0, bất kỳ gradient nào vượt ngưỡng sẽ bị co lại đúng bằng ngưỡng đó. Chỉ một dòng code trong PyTorch (clip_grad_norm_) là xử lý được đa số ca. Kỹ thuật này mình có viết riêng trong bài gradient clipping.
Giảm learning rate. Gradient lớn kết hợp learning rate cao là thảm họa kép: sai số được nhân rồi cộng thẳng vào trọng số, mô hình không kịp hấp thụ bài học nào. Hạ learning rate xuống vài lần giúp mô hình bớt rung lắc, mối liên hệ này được giải thích kỹ trong bài learning rate.
Dùng chuẩn hóa lớp. Batch normalization hoặc layer normalization giữ phân phối giá trị đầu vào của từng lớp ổn định, tránh việc gradient tích lũy sai lệch khi xuyên qua các tầng sâu của mạng.
Kiểm tra dữ liệu đầu vào. Đôi khi nguyên nhân không nằm ở kiến trúc mà ở dữ liệu: đặc trưng chưa chuẩn hóa, có outlier cực lớn, hoặc nhãn sai giá trị. Dọn sạch dữ liệu trước khi đổ lỗi cho mô hình là thứ tự làm việc đúng.
Exploding gradient khác vanishing gradient chỗ nào?
Hai hiện tượng này cùng gốc là gradient mất ổn định khi lan truyền qua mạng sâu, nhưng biểu hiện và hướng xử lý trái ngược nhau hoàn toàn:
- Hướng đi: vanishing gradient teo dần về 0, exploding gradient phình to lên vô cùng.
- Mạng hay gặp: vanishing thường xuất hiện ở mạng sâu dùng sigmoid hoặc tanh, exploding hoành hành chủ yếu ở RNN với chuỗi đầu vào dài.
- Triệu chứng: vanishing khiến mô hình học đứng yên, gần như không cải thiện thêm; exploding khiến loss loạn nhịp và sinh NaN ầm ầm.
- Cách xử lý: vanishing cần đổi sang ReLU, thêm residual connection hoặc dùng LSTM; exploding thường chỉ cần gradient clipping là gần như dứt điểm.
Góc nhìn cá nhân của mình: exploding gradient trông đáng sợ hơn nhưng thực ra dễ chữa hơn hẳn, thêm một dòng clipping là xong. Vanishing gradient mới là con bệnh lì lợm, nó âm thầm khiến mô hình ngừng học mà không thèm báo lỗi gì rõ ràng.
Nên ghi nhớ gì về exploding gradient?
Exploding gradient là hiện tượng gradient tăng vọt trong lúc huấn luyện, đẩy trọng số mô hình ra giá trị vô lý và làm loss thành NaN. Nguyên nhân nằm ở phép nhân chuỗi qua nhiều lớp trong backpropagation, đặc biệt nặng ở RNN xử lý chuỗi dài.
Khi gặp NaN lần đầu, đừng hoảng loạn. Kiểm tra theo đúng trình tự: xem đường loss, in gradient norm ra, thêm gradient clipping, cuối cùng mới hạ learning rate. Chín trên mười ca dừng ở bước thứ ba. Đây là một trong những bài học “rẻ tiền” nhất của deep learning: lỗi nhìn kinh hoàng nhưng cách sửa chỉ vỏn vẹn một dòng code.
