如何在TensorFlow中应用梯度裁剪?

考虑示例代码

我想知道如何在这个网络的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)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注