【问题标题】:Non-deterministic Gradient Computation非确定性梯度计算
【发布时间】:2017-07-13 18:02:54
【问题描述】:

我意识到我的模型每次训练时都会有所不同,即使我保持 TensorFlow 随机种子相同。

我证实:

  • 初始化是确定性的;第一次更新前的权重是相同的。
  • 输入是确定性的。事实上,包括损失在内的各种前向计算对于第一批都是相同的。
  • 第一批的梯度不同。具体来说,我正在比较tf.gradients(loss, train_variables) 的输出。虽然losstrain_variables 具有相同的值,但某些变量的梯度有时不同。差异非常显着(有时单个变量梯度的绝对差异之和大于 1)。

我的结论是梯度计算导致了不确定性。 我查看了this question,当在具有intra_op_parallelism_thread=1inter_op_parallelism_thread=1 的CPU 上运行时,问题仍然存在。

如果向前传球不是,向后传球怎么可能是不确定的?我该如何进一步调试?

【问题讨论】:

    标签: tensorflow non-deterministic


    【解决方案1】:

    这个答案可能看起来有点明显,但是您是否使用了某种非确定性正则化,例如 dropout?鉴于 dropout 在训练时会随机“丢弃”一些连接,这可能会导致梯度上的差异。

    编辑:类似问题:

    编辑 2: 这似乎是 TensorFlow 实现的问题。请参阅 GitHub 中的以下未解决问题:

    【讨论】:

    • 如果是这样的话,前向计算也会不同,对吧?此外,(静态)种子不应该确定哪些连接被丢弃吗?
    • 您是指在训练时还是在评估时进行前向计算?通常的做法是在验证时禁用 dropout。它是如何在您的代码中实现的?是的,随机种子应该确定哪些连接被丢弃。也许您遇到了与this 问题中提到的类似的问题。
    • 我的意思是在训练时进行前向计算。我使用tf.nn.dropout(),但我刚刚检查过,即使使用keep_prob == 1,问题仍然存在。我还检查了只有一个图被实例化(tf.Graph() 实际上从未在代码中调用)。
    • 能否请您提供其余代码以帮助您更好地诊断问题?
    • 恐怕这是我为硕士论文开发的一个巨大模型。我们正在查看数百个 LOC,分布在几个类中。我认为这不会有帮助...
    猜你喜欢
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多