Keras 批量训练:训练损失是在每个优化步骤之前还是之后计算的?

Keras training with batches: Is the training loss computed before or after each optimization step?

这可能是一个非常基本的问题,但我找不到答案: 当我使用批次使用 Keras 训练网络时,控制台输出显示并不断更新每个训练时期训练集的当前损失值的显示。据我了解,这个损失值是在当前批次上计算的(作为整体损失的代表),并且可能与为前几个批次计算的损失值进行平均。 但是获取当前batch的loss值有两种可能:要么在更新参数之前,要么在更新参数之后。谁能告诉我这两者哪个是正确的?根据我的观察,我宁愿猜测它是在优化步骤之后。

我问这个问题的原因:我正在训练一个网络,发现训练损失(两个嵌入的 MSE)会按预期减少(几个数量级),但验证损失保持不变。首先我认为这可能是由于过度拟合。因此,由于训练数据集非常大(200k 图像),我决定减小 epoch 大小以便能够看到更频繁地评估验证集,从而导致 epoch 小于 trainingSetSize/batchSize。即便如此,我还是看到训练损失从一个时期到另一个时期都在减少(验证损失仍然保持不变),我发现这很有趣,因为网络仍处于它第一次看到训练数据的阶段。在我的理解中,这意味着要么我的设置中存在一些讨厌的错误,要么在采取优化步骤后显示训练损失。否则,新的、从未见过的批次和验证集的损失应该至少相似。

即使我假设损失是在每个优化步骤之后计算的:假设我的网络没有按照验证集评估的建议取得有用的进展,它在看到一个新的、从未见过的批次时也应该表现得很随意。然后,整个训练损失的减少将仅归因于优化步骤(这对手头的批次非常好,但对其他数据则不是,显然,这也是一种过度拟合)。这意味着,如果训练损失持续减少,则每批次的优化步骤会变得更加有效。我正在使用 Adam 优化器,我知道它是自适应的,但是否真的有可能看到训练损失持续大幅减少,而实际上网络没有学习任何有用的泛化?

损失是在优化步骤之前计算的。这样做的原因是效率,并且与 back-propagation 的工作方式有关。

特别是,假设我们要最小化 ||A(x, z) - y||^2 w.r.t。 z。那么当我们执行back-propagation时,我们需要评估这个计算图:

A(x, z) -> grad ||. - y||^2 -> backpropagate

现在,如果我们向其中添加一个 "evaluate loss" 并在 更新参数之前评估损失 ,计算图将如下所示

           >  grad ||. - y||^2 -> backpropagate
         /
A(x, z) 
         \
           >  ||. - y||^2

另一方面,如果我们在 更新它们之后评估损失 ,则图表将如下所示

A(x, z) -> grad ||. - y||^2 -> backpropagate -> A(x, z) -> ||. - y||^2

因此,如果我们在更新后评估损失,我们需要计算 A(x, z) 两次,而如果我们在更新前计算它,我们只需要计算一次。因此,在更新之前计算它变得快两倍。