gpt4 book ai didi

random - tensorflow 梯度更新中的确定性?

转载 作者:行者123 更新时间:2023-12-04 10:47:39 26 4
gpt4 key购买 nike

所以我有一个用 Tensorflow 编写的非常简单的 NN 脚本,我很难追踪一些“随机性”来自哪里。

我已经记录了

  • 重量,
  • 渐变,
  • 登录

  • 我训练时的网络,对于第一次迭代,很明显,一切都是一样的。我有一个关于如何读入数据的 SEED 值,以及一个用于初始化网络权重的 SEED 值。那些我永远不会改变的。

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

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

    谢谢

    最佳答案

    如果您在 CPU ( export CUDA_VISIBLE_DEVICES= ) 上运行网络,使用本征线程池中的单线程 ( tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=1) ),一个 Python 线程(没有多线程队列运行器),则很有可能获得确定性结果来自诸如 tf.batch 之类的操作),以及一个明确定义的操作顺序。还使用 inter_op_parallelism_threads=1在某些情况下可能会有所帮助。

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

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

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

    关于random - tensorflow 梯度更新中的确定性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39938307/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com