5

Tất cả,Làm thế nào để kiểm tra NaN trong gradient trong Tensorflow khi cập nhật?

Khi bạn đào tạo một mô hình lớn với số lượng mẫu lớn, một số mẫu có thể gây ra chênh lệch NaN khi cập nhật thông số.

Và tôi muốn tìm các mẫu này. Và trong khi đó tôi không muốn gradient mẫu của lô này cập nhật tham số của mô hình, bởi vì nó có thể là nguyên nhân của tham số của mô hình là NaN.

Vì vậy, bất kỳ ai có ý tưởng tốt để giải quyết vấn đề này?

Mã của tôi là như dưới đây:

# Create an optimizer. 
    params = tf.trainable_variables() 
    opt = tf.train.AdamOptimizer(1e-3) 
    gradients = tf.gradients(self.loss, params) 

    max_gradient_norm = 10 
    clipped_gradients, self.gradient_norms = tf.clip_by_global_norm(gradients, 
                max_gradient_norm) 

    self.optimizer = opt.apply_gradients(zip(clipped_gradients, params)) 

Trả lời

9

Bạn có thể kiểm tra xem gradient của bạn có NaN bởi tf.check_numerics:

grad_check = tf.check_numerics(clipped_gradients) 
with tf.control_dependencies([grad_check]): 
    self.optimizer = opt.apply_gradients(zip(clipped_gradients, params)) 

Các grad_check sẽ ném InvalidArgument nếu clipped_gradients là NaN hay vô cùng.

tf.control_dependencies đảm bảo rằng grad_check được đánh giá trước khi áp dụng gradient.

Đồng thời xem tf.add_check_numerics_ops().

+0

Cảm ơn bạn rất nhiều. Nhưng tôi lại có một câu hỏi. Khi tôi thêm tf.add_check_numerics_ops() trong mã của mình, tôi gặp lỗi Out of Memory. Và loại bỏ dòng này, mọi thứ đều ổn. Mô hình của tôi thực sự lớn, vì vậy tf.add_check_numerics_ops() sẽ phân bổ nhiều bộ nhớ GPU hơn cho các kiểm tra không? – Issac

+0

Có một bản sao tensor trong hạt nhân của 'tf.check_numerics': https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/check_numerics_op.cc#L60. Vì vậy, chỉ cần thêm một vài kiểm tra bằng cách sử dụng 'tf.check_numerics'. Cần lưu ý thêm nếu bạn muốn sử dụng 'tf.add_check_numerics_ops()' chạy 'tf.check_numerics' cho tất cả các tensors nổi được gõ. – yuefengz

0

Bạn có thể sử dụng tf.is_nan kết hợp với tf.cond để chỉ thực thi phần còn lại của mã nếu mất không phải là NaN.

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