【问题标题】:Tensorflow: Does the training depend on the result of previous runsTensorflow:训练是否依赖于先前运行的结果
【发布时间】:2018-01-18 03:07:53
【问题描述】:

我试图了解 Tensorflow 训练如何依赖于之前运行的结果。当我们训练一个模型时,我们将在优化器中指定学习率,以最小的成本训练模型。子epoch的学习率不会改变,但是当全局步数达到子epoch的倍数时学习率会改变。

def Train(...):
    epoch = 5
    sub_epoch = 3
    for i in range(epoch):
        for j in range(sub_epoch):
            session.run(optimizer, ...)

因为我不确定 Tensorflow 在训练数据时是如何工作的,如果每次运行都依赖于之前运行的内部结果,我担心将训练分成多个线程,这会导致训练结果不准确。

假设 sub-epoch 为 3,我们可以在 3 个不同的线程中以相同的学习率训练每个 sub-epoch 的数据,并等待所有 3 个线程完成后再进行下一个 epoch 训练吗?

Thread 1, epoch 0, sub-epoch 0: Train(data1, lr1)
Thread 2, epoch 0, sub-epoch 1: Train(data2, lr1)
Thread 3, epoch 0, sub-epoch 2: Train(data3, lr1)
[wait for all 3 threads to complete]
Thread 1, epoch 1, sub-epoch 0: Train(data4, lr2)
Thread 2, epoch 1, sub-epoch 1: Train(data5, lr2)
Thread 3, epoch 1, sub-epoch 2: Train(data6, lr2)
...

我想知道训练依赖,请有人告诉我下面哪个描述是正确的?

  1. 无论学习率如何,训练都取决于之前运行的结果
  2. 训练取决于先前以不同学习率运行的 epoch 的结果(即上述场景)
  3. 训练完全不依赖于之前的结果
  4. 其他 -- 请解释

因为我不熟悉它的工作原理,所以我可能会问一些愚蠢的问题,如果上面描述的任何事情有问题,请随时告诉我(例如,我们不需要等待所有 3 个线程都完成等)

【问题讨论】:

    标签: multithreading tensorflow dependencies


    【解决方案1】:

    您所描述的是异步训练,其中变量更新不协调(即每个工作线程/线程获取每个变量可用的任何值,然后发送其更新)。在这种情况下,session.run 调用没有等效的单线程排序,因为模型“快照”不一致。

    一种流行的替代方法是同步训练,其中每个工作人员为每个变量获取相同的值。这实际上只是为您提供了更大的批量大小。 tf.train.SyncReplicasOptimizer 是进行同步训练的一种方式。

    【讨论】:

    • 当您说“值”时,您是指传递给session.run 的 feed_dict 值吗?为什么我们要传递相同的值(而不是不同的值)来执行同步训练?全局步长何时会增加(对于单个工人,或所有具有相同值的工人完成)?很抱歉问了这么多问题。
    • “值”是指保存在代表模型参数的变量中的数据。由于工人正在改变这些,工人 A 可能会读取变量 X=1。和 Y=-1.,更新 X=2.,然后工人 B 读取 X=2。并且 Y=-1.,A 更新为 X=2。 Y=-2。并继续下一次迭代......但是你是对的,传递给每个工作人员的数据在同步和异步中应该是不同的;是模型参数在同步训练中应该一致,在异步训练中不一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多