大家好,
当您使用大量样本来训练一个大模型时,有些样本可能会导致梯度为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))
tf.check_numerics
核函数中有一个张量拷贝:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/check_numerics_op.cc#L60。因此,只需使用tf.check_numerics
添加一些检查即可。如果想使用tf.add_check_numerics_ops()
,则需要额外注意,因为它会对所有浮点类型的张量运行tf.check_numerics
。 - yuefengz