【发布时间】:2020-09-11 14:28:47
【问题描述】:
对于那些不想阅读整个故事的人:
TL; DR:当使用TF Estimator 时,我们是否必须通过增加批量大小的因素来缩放学习率(我知道这是正确的方法,我不确定 TF 是否在内部处理这个问题)?同样,我们是否必须按全局批量大小(batch_size_per_replica * 副本数)来缩放每个示例损失?
有关 TensorFlow 分布式学习的文档令人困惑。我需要澄清以下几点。
现在可以理解,如果将批大小增加
k的系数,则需要将学习率增加k(参见this 和this 论文)。但是,关于分布式学习的 Tensoflow 官方页面没有对此做出澄清评论。他们确实提到 here 需要调整学习率。他们自己处理学习率缩放吗?更复杂的是,Keras 和 tf.Estimator 的行为是不同的(见下一点)。当我使用tf.Estimator时,我是否应该将 LR 增加 K 倍?普遍认为,每个示例的损失应该按
global_batch_size = batch_size_per_replica * number of replicas缩放。 Tensorflow 提到了它here,但是当说明如何使用 tf.Estimator 实现这一点时,他们要么忘记了,要么不需要通过global_batch_size进行缩放。见here,在sn-p代码中,loss定义如下。
loss = tf.reduce_sum(loss) * (1. / BATCH_SIZE)
据我所知,BATCH_SIZE 是根据副本批量大小在上面定义的。
更复杂的是,如果您使用 Keras,缩放会自动处理(出于我永远无法理解的原因,最好保持一切一致)。
【问题讨论】:
-
我不知道分布式,但非分布式确实是缩放的,我可以链接源代码。但是,您可以自己很容易地验证这种缩放:1)修复所有随机种子; 2)喂N个相同个样本,记录权重变化; 3)重启训练(重启Python内核); 4)喂2 * N 相同个样本,记录权重变化。如果 (2) == (4),它会自动缩放。
-
另外,最低限度可重现的代码会更容易检查。
标签: python tensorflow keras deep-learning distributed