如何在张量stream中有效地应用梯度裁剪?

考虑到示例代码 。

我想知道如何在RNN上的这个networking上应用梯度剪切,在这种情况下可能出现梯度分解。

tf.clip_by_value(t, clip_value_min, clip_value_max, name=None) 

这是一个可以使用的例子,但我在哪里介绍这个? 在RNN的def

  lstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0) # Split data because rnn cell needs a list of inputs for the RNN inner loop _X = tf.split(0, n_steps, _X) # n_steps tf.clip_by_value(_X, -1, 1, name=None) 

但是,这是没有意义的,因为张量_X是input,而不是什么被裁剪的gradle生?

我必须为此定义我自己的优化器还是有一个更简单的选项?

计算梯度后需要进行渐变裁剪,但在应用它们更新模型参数之前,需要进行裁剪。 在你的例子中,这两个东西都是由AdamOptimizer.minimize()方法处理的。

为了剪切你的渐变,你需要明确地计算,剪切和应用它们,如TensorFlow的API文档中的本节所述。 具体来说,你需要用下面的代码将这个调用replace为minimize()方法:

 optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) gvs = optimizer.compute_gradients(cost) capped_gvs = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gvs] train_op = optimizer.apply_gradients(capped_gvs) 

尽pipe似乎很受欢迎,你可能想要通过其全球规范来剪辑整个渐变:

 optimizer = tf.train.AdamOptimizer(1e-3) gradients, variables = zip(*optimizer.compute_gradients(loss)) gradients, _ = tf.clip_by_global_norm(gradients, 5.0) optimize = optimizer.apply_gradients(zip(gradients, variables)) 

分别剪切每个梯度matrix可以改变它们的相对尺度,但也可以:

 optimizer = tf.train.AdamOptimizer(1e-3) gradients, variables = zip(*optimizer.compute_gradients(loss)) gradients = [ None if gradient is None else tf.clip_by_norm(gradient, 5.0) for gradient in gradients] optimize = optimizer.apply_gradients(zip(gradients, variables)) 

这实际上是在文档中正确解释的。 :

调用minim()负责计算梯度并将其应用于variables。 如果你想在应用它们之前处理梯度,你可以用三个步骤来使用优化器:

  • 使用compute_gradients()计算渐变。
  • 按照您的意愿处理渐变。
  • 使用apply_gradients()应用已处理的渐变。

而在他们提供的例子中,他们使用了这3个步骤:

 # Create an optimizer. opt = GradientDescentOptimizer(learning_rate=0.1) # Compute the gradients for a list of variables. grads_and_vars = opt.compute_gradients(loss, <list of variables>) # grads_and_vars is a list of tuples (gradient, variable). Do whatever you # need to the 'gradient' part, for example cap them, etc. capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars] # Ask the optimizer to apply the capped gradients. opt.apply_gradients(capped_grads_and_vars) 

这里MyCapper是任何限制你的渐变的函数。 有用的function列表(除了tf.clip_by_value() )在这里 。