我意识到每次训练时我的模型最终会变得不同,即使我保持TensorFlow随机种子相同 .
我证实了这一点:
-
初始化是确定性的;在第一次更新之前,权重是相同的 .
-
输入是确定性的 . 事实上,包括损失在内的各种前向计算对于第一批来说是相同的 .
-
第一批的渐变是不同的 . 具体来说,我正在比较
tf.gradients(loss, train_variables)
的输出 . 虽然loss
和train_variables
具有相同的值,但某些变量的渐变有时会有所不同 . 差异非常显着(有时单个变量的梯度的绝对差值之和大于1) .
我得出结论,这是导致非确定性的梯度计算 . 我查看了this question,并且在使用 intra_op_parallelism_thread=1
和 inter_op_parallelism_thread=1
的CPU上运行时问题仍然存在 .
当前向传球不是时,后向传球如何是不确定的?我怎么能进一步调试呢?
1 回答
这个答案可能看起来有点明显,但您是否使用某种非确定性正则化,例如辍学?鉴于辍学在训练时随机“掉落”某些连接,可能会导致梯度上的差异 .
Edit: 类似的问题:
How to get stable results with TensorFlow, setting random seed
Tensorflow not being deterministic, where it should