考虑示例代码。
我想知道如何在这个网络的RNN上应用梯度裁剪,以防止梯度爆炸的可能性。
tf.clip_by_value(t, clip_value_min, clip_value_max, name=None)
这是一个可以使用的示例,但我在哪里引入这个呢?在RNN的定义中
lstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0) # 因为RNN单元需要一个输入列表用于RNN内部循环,所以拆分数据 _X = tf.split(0, n_steps, _X) # n_stepstf.clip_by_value(_X, -1, 1, name=None)
但这没有意义,因为张量_X是输入而不是需要裁剪的梯度,对吗?
我是否需要为此定义自己的优化器,还是有更简单的选项?
回答:
梯度裁剪需要在计算梯度之后,但在应用它们更新模型参数之前进行。在您的示例中,这两件事都是由AdamOptimizer.minimize()
方法处理的。
为了裁剪您的梯度,您需要明确地计算、裁剪并应用它们,如TensorFlow的API文档中的这一部分所述。具体来说,您需要用以下内容替换对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)