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

2024-04-19 13:50:03 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能是一个非常基本的问题,但是我没有找到答案: 当我使用批处理使用Keras训练网络时,控制台输出显示并不断更新每个训练阶段中训练集的当前丢失值的显示。据我所知,此损失值是在当前批次中计算的(作为总损失的代理),可能与前一批计算的损失值平均。但是有两种方法可以获得当前批次的损失值:更新参数之前或之后。有人能告诉我哪一种是正确的吗?根据我的观察,我宁愿猜测是在优化步骤之后。在

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

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


Tags: 数据方法答案网络代理参数步骤原因
1条回答
网友
1楼 · 发布于 2024-04-19 13:50:03

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

特别是,假设我们要最小化||A(x, z) - y||^2w.r.t.z。当我们执行反向传播时,我们需要计算这个计算图:

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

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

^{pr2}$

另一方面,如果我们对更新后的损失进行评估,则图形将如下所示

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

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

相关问题 更多 >