张量流梯度更新中的确定性?

Spa*_*cey 7 random floating-point precision random-seed tensorflow

所以我有一个用Tensorflow编写的非常简单的NN脚本,我很难找到一些"随机性"来自哪里.

我记录了

  • 权重,
  • 渐变,
  • Logits

当我训练时,我的网络,并且在第一次迭代中,很明显一切都是从一开始.我有一个SEED值,用于读取数据的方式,以及用于初始化网络权重的SEED值.那些我永远不会改变.

我的问题是,比如我每次重新运行的第二次迭代,我开始看到渐变发散,(少量,比如说,1e-6左右).然而,随着时间的推移,这当然会导致不可重复的行为.

这可能是什么原因?我不知道任何可能的随机来源可能来自哪里......

谢谢

Yar*_*tov 7

如果你在CPU(export CUDA_VISIBLE_DEVICES=)上运行你的网络,在Eigen线程池(tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=1))中使用单线程,一个Python线程(没有你从ops获得的多线程队列运行器),你很有可能获得确定性结果tf.batch,以及一个明确定义的操作订单.inter_op_parallelism_threads=1在某些情况下,也可以使用帮助.

一个问题是浮点加法/乘法是非关联的,因此获得确定性结果的一种万​​无一失的方法是使用整数算术或量化值.

除此之外,您可以隔离哪个操作是非确定性的,并尽量避免使用该操作.例如,有一个tf.add_nop,它没有说明它对值进行求和的顺序,但是不同的顺序会产生不同的结果.

获得确定性结果是一场艰苦的战斗,因为决定论与绩效相冲突,而绩效通常是获得更多关注的目标.尝试在重新运行时使用完全相同的数字的另一种方法是关注数值稳定性 - 如果算法稳定,那么即使精确的参数值可能略有不同,您也会获得可重现的结果(即,相同数量的错误分类)