BasicRNNCell的偏置未被训练

我的网络在训练时卡在了大约70%的准确率,验证准确率仅略高于50%(这是一个二分类问题)。我在调试中,希望排除以下原因。

网络中包括一个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)

据我所知,偏置应该像权重一样在每次训练步骤中更新。

这是预期的行为吗?这是否可能是我学习停滞的原因?


回答:

根据我的经验,我不会关注这样的细节。从你提供的信息来看,很难判断是否应该有非零偏置。在使用RNN时,采用梯度裁剪是一种很好的做法。我看到使用这种方法在训练中有了很大的改进

    optimizer = tf.train.AdamOptimizer(learning_rate)    # 计算并裁剪梯度    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)

通常,最大梯度范数在1到5之间效果最好。我也更喜欢使用AdamOptimizer。希望这对你有帮助!

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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