梯度裁剪

减少梯度爆炸问题的一种常用技术是在反向传播过程中简单地剪切梯度,使它们不超过某个阈值(这对于递归神经网络是非常有用的;参见第 14 章)。 这就是所谓的梯度裁剪。一般来说,人们更喜欢批量标准化,但了解梯度裁剪以及如何实现它仍然是有用的。

在 TensorFlow 中,优化器的minimize()函数负责计算梯度并应用它们,所以您必须首先调用优化器的compute_gradients()方法,然后使用clip_by_value()函数创建一个裁剪梯度的操作,最后 创建一个操作来使用优化器的apply_gradients()方法应用裁剪梯度:

  1. threshold = 1.0
  2. optimizer = tf.train.GradientDescentOptimizer(learning_rate)
  3. grads_and_vars = optimizer.compute_gradients(loss)
  4. capped_gvs = [(tf.clip_by_value(grad, -threshold, threshold), var)
  5. for grad, var in grads_and_vars]
  6. training_op = optimizer.apply_gradients(capped_gvs)

像往常一样,您将在每个训练阶段运行这个training_op。 它将计算梯度,将它们裁剪到 -1.0 和 1.0 之间,并应用它们。 threhold是您可以调整的超参数。