Для отладки своего кода и понимания RNN я вручную установил градиенты на 0, как это:
gvs = optimizer.compute_gradients(cost)
gvs[0] = (tf.zeros((5002,2), dtype=tf.float32), tf.trainable_variables()[0])
gvs[1] = (tf.zeros((2,), dtype=tf.float32), tf.trainable_variables()[1])
train_op = optimizer.apply_gradients(gvs)
У меня есть только две обучаемые переменные, поэтому при быстром и грязном подходе все градиенты должны быть установлены на ноль:
tf.trainable_variables()
Out[8]:
[<tf.Variable 'rnn/basic_rnn_cell/kernel:0' shape=(5002, 2) dtype=float32_ref>,
<tf.Variable 'rnn/basic_rnn_cell/bias:0' shape=(2,) dtype=float32_ref>]
Когда я запускаю сеть, потери все еще уменьшаются. Как это может быть? Насколько я понимаю, новые значения переменных должны быть старым значением + скорость обучения * градиенты.
Я использую AdaGradOptimizer.
Обновление : np.sum(sess.run(gvs[0][0]))
и np.sum(sess.run(gvs[1][0]))
оба возвращают 0.