更新时如何在Tensorflow中检查渐变中的NaN?

Iss*_*sac 5 machine-learning mathematical-optimization deep-learning tensorflow

所有,

当您使用大量样本训练大型模型时,某些样本可能会在参数更新时导致NaN梯度.

我想找出这些样品.同时我不希望这批样本的梯度更新模型的参数,因为它可能导致模型的参数为NaN.

所以任何人都有好主意处理这个问题?

我的代码如下:

    # 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))
Run Code Online (Sandbox Code Playgroud)

yue*_*ngz 10

您可以通过以下方式检查您的渐变是否具有NaN 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))
Run Code Online (Sandbox Code Playgroud)

如果clipped_gradients是NaN或无穷大,grad_check则会抛出InvalidArgument.

tf.control_dependencies可确保grad_check在应用梯度之前评估.

另见tf.add_check_numerics_ops().