Tensorflow:训练是否取决于先前运行的结果

时间:2018-01-16 04:46:47

标签: multithreading tensorflow dependencies

我试图了解Tensorflow培训如何取决于之前运行的结果。当我们训练模型时,我们将在优化器中指定学习速率,以最低成本训练模型。子时代的学习率不会改变,但是当全局步骤达到子时期的倍数时,学习率会发生变化。

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个不同线程中以相同的学习率训练每个子纪元的数据,并等待所有3个线程在完成下一个纪元训练之前完成吗?

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. 训练取决于具有不同学习率的前一个时期的结果(即上述情景)
  3. 培训完全不依赖于之前的结果
  4. 其他 - 请解释
  5. 因为我不熟悉它是如何工作的,我可能会问一些愚蠢的问题,请随时告诉我上述任何事情是否错误(例如我们不需要等待所有3个线程完成等)< / p>

1 个答案:

答案 0 :(得分:1)

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

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