MNIST 模型分布式版本的输出

Outputs of the distributed version of MNIST model

我正在 CloudML 上玩 MNIST 的分布式版本,我不确定是否理解训练阶段显示的日志:

INFO:root:Train [master/0], step 1693: Loss: 1.176, Accuracy: 0.464 (760.724 sec) 4.2 global steps/s, 4.2 local steps/s
INFO:root:Train [master/0], step 1696: Loss: 1.175, Accuracy: 0.464 (761.420 sec) 4.3 global steps/s, 4.3 local steps/s
INFO:root:Eval, step 1696: Loss: 0.990, Accuracy: 0.537
INFO:root:Train [master/0], step 1701: Loss: 1.175, Accuracy: 0.465 (766.337 sec) 1.0 global steps/s, 1.0 local steps/s

我一次随机批处理 200 多个示例。

为什么 Train acc/loss 和 Eval acc/loss 之间存在这样的差距,eval 集的指标明显高于 train 集,而通常恰恰相反?

还有,全局步骤和局部步骤有什么区别?

我说的代码是here。 task.py 正在调用 model.py,创建图表的文件。

当你进行分布式训练时,你可以有超过 1 个工人。这些工作人员中的每一个都可以计算参数的更新。因此,每次工作人员计算一次更新都算作 1 个本地步骤。根据训练的类型,,在实际将更新应用到参数之前,可以以不同的方式组合更新。

例如,每个工作人员都可以更新参数,或者您可以平均每个工作人员的更新,并且只应用一次更新参数。

全局步骤告诉你实际更新参数的次数。因此,如果您有 N 个工作人员并且您应用每个工作人员的更新,那么 N 个局部步骤应该对应于 N 个全局步骤。另一方面,如果您有 N 个工作人员,并且您从每个工作人员那里获取 1 个更新,对它们进行平均,然后更新参数,那么每 N 个局部步骤就有一个全局步骤。

所报告的训练指标仅基于该步骤中使用的 "mini-batch" 个示例(在您的案例中为 200)计算得出。在整个评估集上报告评估措施。

因此,mini-batch 训练统计数据会非常嘈杂。

在进一步研究示例中的代码后,问题在于训练数据报告的准确度是移动平均值。因此,当前步骤报告的平均值实际上受到许多步骤之前的平均值的影响,该平均值通常较低。我们将通过不对前面的步骤进行平均来更新样本。

RE: Train acc/loss 和 Eval acc/loss

之间的差距

这是使用指数移动平均线来平滑批次之间的损失和准确性的结果(否则绘图非常嘈杂)。评估集和训练集的指标计算方式不同:

  • 评估集损失和准确度是使用评估集中所有批次示例的移动指数平均值计算的 - 在每次 运行 评估后重置移动平均值,因此每个点代表单个 运行 - 所有 eval 步骤都是使用一致的检查点(权重的一致值)计算的。

  • 训练集损失和准确率是在训练过程中使用训练集中所有批次示例的移动指数平均值计算的 - 移动平均值永远不会重置,因此它可以长期携带过去的信息时间 - 它不是基于一致的检查点。计算指标的近似值很便宜。

我们将提供更新的样本,以一致的方式计算训练和评估集的损失。令人惊讶的是,即使最初进行了更新,评估集也比训练集获得了更高的准确性——可能所有数据都没有正确洗牌并随机分成训练集和评估集——并且评估集包含轻微的 'easier' 数据子集。经过更多训练步骤后,分类器开始过度拟合训练数据,训练集的准确度超过评估集的准确度。

RE: 全局步骤和局部步骤有什么区别? 局部步数是单个工人处理的批次数(每个工人记录此信息),全局步数是所有工人处理的批次数。当使用单个工人时,这两个数字相等。在分布式设置中使用更多 worker 时,全局步骤 > 局部步骤。