繁体   English   中英

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 优化器,但真的有可能看到训练损失持续大幅减少,而实际上网络没有学习任何有用的泛化吗?

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

特别地,假设我们想要最小化||A(x, z) - y||^2 wrt z 然后当我们执行反向传播时,我们需要评估这个计算图:

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

现在,如果我们为此添加一个“评估损失”并更新参数之前评估损失,计算图将如下所示

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

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

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

因此,如果我们在更新后评估损失,我们需要计算A(x, z)两次,而如果我们在更新前计算它,我们只需要计算一次。 因此,在更新之前计算它的速度是原来的两倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM