为什么训练损失会上下波动?

Why is training loss oscilating up and down?

我正在使用 TF2 研究对象检测 API 以及来自 TF2 模型动物园的预训练 EfficientDet D3 模型。在我自己的数据集上训练期间,我注意到总损失在上下跳跃——例如,几步后从 0.5 到 2.0,然后又回到 0.75:

所以总的来说这次训练似乎不是很稳定。我认为问题可能出在学习率上,但正如您在上面的图表中看到的那样,我在训练期间将 LR 设置为衰减,它下降到非常小的值 1e-15,所以我看不出如何这可能是问题所在(至少在训练的后半部分)。

另外,当我在 Tensorboard 中平滑曲线时,如上图 2 所示,可以看到总损失在下降,所以方向是正确的,即使它仍然处于相当高的值。我很想知道为什么我的训练集不能取得更好的结果,但我想那是另一个问题。首先,我真的很想知道为什么总损失在整个训练过程中上下波动如此之大。有什么想法吗?

PS: pipeline.config 我训练的文件 can be found here.

在您的配置中,它指出您的批量大小为 2。这很小,会导致非常不稳定的损失。

尝试大幅增加批量大小;尝试 256512 的值。如果你受内存限制,尝试通过梯度累加来增加它。


梯度累积是通过组合较小的小批量的反向传递来合成较大批量的过程。在更新模型参数之前,您将 运行 多次向后传递。

通常,训练循环会像这样(出于说明目的,我使用类似 pytorch 的语法):

for model_inputs, truths in iter_batches():
    predictions = model(model_inputs)
    loss = get_loss(predictions, truths)
    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

通过梯度累积,您将进行几批处理,然后更新模型。这模拟了一个更大的批量大小,而不需要内存来一次实际处理一个大的批量大小:

accumulations = 10

for i, (model_inputs, truths) in enumerate(iter_batches()):
    predictions = model(model_inputs)
    loss = get_loss(predictions, truths)
    loss.backward()
    if (i - 1) % accumulations == 0:
        optimizer.step()
        optimizer.zero_grad()

阅读