1. ホーム
  2. python

[解決済み] TensorFlowでグラデーションクリッピングを行うには?

2022-10-16 04:09:23

質問

を考えると コード例 .

勾配が爆発する可能性がある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)
    # 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が入力であり、切り取るべきgradではないので、意味をなさないのでは?

このために独自のオプティマイザーを定義しなければならないのでしょうか、それとももっと簡単なオプションがあるのでしょうか?

どのように解決するのですか?

グラデーションクリッピングは、グラデーションを計算した後、モデルのパラメータを更新するためにそれを適用する前に起こる必要があります。あなたの例では、それらの両方が 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)