Vấn đề: một RNN rất dài ròngCó cách nào để cắt gradient nổ trung gian trong tensorflow
N1 -- N2 -- ... --- N100
Đối với một Optimizer như AdamOptimizer
, các compute_gradient()
sẽ cho gradient để tất cả các biến đào tạo.
Tuy nhiên, nó có thể phát nổ trong một số bước.
Phương thức như trong how-to-effectively-apply-gradient-clipping-in-tensor-flow có thể cắt độ dốc cuối cùng lớn.
Nhưng cách cắt những phần trung gian đó?
Một cách có thể được làm bằng tay từ backprop từ "N100 -> N99", clip gradient, sau đó "N99 -> N98" vv, nhưng điều đó quá phức tạp.
Vì vậy, câu hỏi của tôi là: Có phương pháp nào dễ dàng hơn để cắt các gradient trung gian không? (Tất nhiên, nghiêm túc nói, chúng không phải là gradient nữa theo nghĩa toán học)
Ý tưởng thô - quấn từng lớp của bạn vào một py_func sử dụng gradient tùy chỉnh là xong [ở đây] (https://gist.github.com/harpone/3453185b41d8d985356cbe5e57d67342). Chức năng gradient tùy chỉnh sẽ lấy vector của các giá trị ngược và trả về phiên bản đã cắt bớt. –
trọng lượng cắt và/hoặc kích hoạt cũng có thể giúp ngăn ngừa độ dốc lớn – gizzmole