如何在张量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()
)在这里 。