BasicRNNCell 偏差没有得到训练

BasicRNNCell biases do not get trained

我的网络在训练时卡在了大约 70% 的准确率,而验证准确率刚刚超过 50%(这是一个两个 class class 化的问题)。我正在调试它并想排除以下原因。

除其他外,网络由 BasicRNNCell:

rnn_cell = tensorflow.contrib.rnn.BasicRNNCell(100)

tensorflow 为这个 RNN 层创建权重和偏差,我可以使用 tf.trainable_variables():

找到它
<tf.Variable 'network/rnn/basic_rnn_cell/kernel:0' shape=(200, 100) dtype=float32_ref>,
<tf.Variable 'network/rnn/basic_rnn_cell/bias:0' shape=(100,) dtype=float32_ref>

在训练过程中,kernel:0 的值会按照我的预期改变每一步,另一边的 bias 的值都是零并且不会改变。我正在使用 AdagradOptimizer:

optimizer = tf.train.AdagradOptimizer(learning_rate=learning_rate).minimize(cost)

根据我的理解,偏差应该像权重一样在每个训练步骤中更新。

这是预期的行为吗?难道这就是让我的学习停滞不前的原因吗?

根据我的经验,我不会关注那样的细节。从您提供的内容很难说是否应该存在 non-zero 偏见。使用 RNN 时,最好使用裁剪梯度。我已经看到使用这个

在训练方面有很大的改进
    optimizer = tf.train.AdamOptimizer(learning_rate)

    # Calculate and clip gradients
    params = tf.trainable_variables()
    gradients = tf.gradients(rnn.loss, params)
    clipped_gradients, _ = tf.clip_by_global_norm(
        gradients, FLAGS.max_gradient_norm)
    train_op = optimizer.apply_gradients(zip(clipped_gradients,params), global_step=global_step)

通常 max_gradient_norm 介于 1 和 5 之间效果最佳。我也更喜欢 adamOptimizer。希望对您有所帮助!