1

我在 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。

4

4 回答 4

2

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

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

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

于 2016-10-28T16:51:27.677 回答
1

正在报告的培训措施仅根据该步骤中使用的“小批量”示例(在您的情况下为 200)计算。评估措施报告在整个评估集上。

因此,小批量训练统计数据会非常嘈杂。

于 2016-10-28T23:43:07.743 回答
1

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

于 2016-11-01T05:46:47.250 回答
1

RE: Train acc/loss 和 Eval acc/loss 之间的差距

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

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

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

我们将提供更新的样本,以一致的方式计算训练和评估集的损失。令人惊讶的是,即使在最初更新后,评估集的准确度也比训练集更高——可能所有数据都没有正确打乱并随机分成训练集和评估集——评估集包含稍微“更容易”的数据子集。在更多的训练步骤之后,分类器开始过度拟合训练数据并且训练集的准确度超过了评估集的准确度。

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

于 2016-11-01T23:33:55.860 回答