2016-10-12 15 views
6

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)

+2

Ý 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. –

+0

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

Trả lời

0

Bạn có thể sử dụng trang trí custom_gradient để tạo phiên bản tf.identity để làm nổi bật độ dốc phát trung gian.

`` ` từ TFE tensorflow.contrib.eager.python nhập khẩu

@ tfe.custom_gradient def gradient_clipping_identity (tensor, max_norm): result = tf.identity (tensor)

def grad (dresult): trở tf.clip_by_norm (dresult, max_norm), Không

kết quả trả về, grad `` `

Sau đó, sử dụng gradient_clipping_identity như bạn thường sử dụng danh tính và gradient của bạn sẽ được cắt bớt trong đường chuyền ngược.

Các vấn đề liên quan