Python 使用TF估计器时Tensorflow分布训练的损失和学习率缩放策略

Python 使用TF估计器时Tensorflow分布训练的损失和学习率缩放策略,python,tensorflow,keras,deep-learning,distributed,Python,Tensorflow,Keras,Deep Learning,Distributed,对于那些不想了解整个故事的人: TL;DR:当使用TF估计器时,我们是否必须根据增加批量的因素来衡量学习率(我知道这是正确的方法,我不确定TF是否在内部处理)?类似地,我们是否必须按全局批处理大小(每个副本的批处理大小*副本数量)来扩展每个示例的损失 关于Tensorflow分布式学习的文档令人困惑。我需要澄清以下几点 现在可以理解,如果将批量大小增加一个系数k,则需要将学习率增加一个系数k(参见和论文)。然而,关于分布式学习的Tensoflow官方页面并没有对此做出明确的评论。他们确实提到学习

对于那些不想了解整个故事的人:

TL;DR:当使用
TF估计器时,我们是否必须根据增加批量的因素来衡量学习率(我知道这是正确的方法,我不确定TF是否在内部处理)?类似地,我们是否必须按全局批处理大小(每个副本的批处理大小*副本数量)来扩展每个示例的损失

关于Tensorflow分布式学习的文档令人困惑。我需要澄清以下几点

  • 现在可以理解,如果将批量大小增加一个系数
    k
    ,则需要将学习率增加一个系数
    k
    (参见和论文)。然而,关于分布式学习的Tensoflow官方页面并没有对此做出明确的评论。他们确实提到学习率需要调整。他们是否自行处理学习率缩放?更复杂的是,Keras和tf.Estimator的行为是不同的(见下一点)。当我使用
    tf.Estimator
    时,是否应该将LR增加系数K

  • 普遍认为,每个示例的损失应按
    global\u batch\u size=batch\u size\u per\u replica*副本数量来衡量。Tensorflow提到了这一点,但在说明如何使用tf.估计器实现这一点时,他们要么忘记了,要么不需要通过
    global\u batch\u size
    进行缩放。请参见,在代码片段中,loss的定义如下

  • 据我所知,
    BATCH_SIZE
    是根据副本批次大小定义的

    更为复杂的是,如果您使用Keras,则会自动处理缩放(出于我永远无法理解的原因,最好保持所有内容的一致性)

  • 全局步长不会自动调整学习速率。正如你所说,他们甚至建议你可能需要调整学习率,但也只是在某些情况下,所以这不是默认值。我建议你手动提高学习速度

  • 如果我们看一看简单的
    tf.Estimator
    tf.Estimator.DNNClassifier
    (),默认的
    loss\u reduction
    loss\u utils.ReductionV2.SUM\u OVER\u BATCH\u SIZE
    。如果我们得到了
    减少量
    (),我们会发现这是一个如何将单个样本的损失组合在一起的策略。在一台机器上,我们只使用
    tf.reduce_mean
    ,但不能在分布式设置中使用它(如下一个链接中所述)。
    缩减
    引导我们,它向您展示了1)如何实施全局步骤的实现,以及2)解释了原因。正如他们告诉您应该自己实现它一样,这意味着它不是由
    tf.Estimator
    处理的。还请注意,您可以在
    reduce
    页面上找到一些解释,它们说明了
    Keras
    Estimator
    s之间关于这些参数的差异


  • 我不知道分布式,但非分布式确实是可扩展的,我可以链接源代码。不过,您可以自己相当轻松地验证这种缩放:1)修复所有随机种子;2) 喂入N个相同的样品,记录重量的变化;3) 重启训练(重启Python内核);4) 喂入2*N相同的样品,记录重量变化。如果(2)==(4),它是自动缩放的。或者,一个可重复性最低的代码将更容易检查。我们应该自己修改LR。2.损失应按全局批量大小进行缩放,因为默认减少是添加来自不同机器的损失。关于第2点,您是否知道或能给我指出一段代码片段,其中提到了
    多工作镜像策略的缩减策略
    ?他们一直说,
    RING
    NCCL
    ,但我找不到该政策的明确实施。
    loss = tf.reduce_sum(loss) * (1. / BATCH_SIZE)