为调试代码和理解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。