是什么导致了训练准确率的大幅跳跃和时期之间的损失?

What is causing large jumps in training accuracy and loss between epochs?

在 python 中使用 Tensorflow 2.0 训练神经网络时,我注意到训练的准确性和损失在各个时期之间发生了巨大变化。我知道打印的指标是整个时代的平均值,但准确性似乎在每个时代之后显着下降,尽管平均值总是在增加。

损失也表现出这种行为,每个时期显着下降,但平均值增加。这是我的意思的图像(来自 Tensorboard):

我在我自己实现的所有模型上都注意到了这种行为,所以这可能是一个错误,但我想就这是否是正常行为以及如果是是什么意思征求意见?

另外,我使用了一个相当大的数据集(大约 300 万个示例)。批量大小为 32,accuracy/loss 图中的每个点代表 50 个批次(图中的 2k = 100k 个批次)。批次的学习率图为 1:1。

我刚刚在做一个关于对象本地化的项目时遇到了这种问题。就我而言,有三个 main 候选人。

  • 我在训练中没有使用洗牌。这会在每个时期后造成损失增加。

  • 我定义了一个使用IOU计算的新损失函数。有点像;

    def new_loss(y_true, y_pred):
        mse = tf.losses.mean_squared_error(y_true, y_pred) 
        iou = calculate_iou(y_true, y_pred) 
        return mse + (1 - iou)
    

    我还怀疑这种损失可能是一个时代后损失增加的可能候选者。但是,我无法替换它。

  • 我使用的是 Adam 优化器。所以,一个可能的做法是改变它,看看训练是如何影响的。

结论

我刚刚将 Adam 更改为 SGD 并在训练中洗牌了我的数据。损失仍然有一个跳跃,但与没有变化相比,它是如此之小。例如,我的损失尖峰在变化之前是~0.3,现在变成了~0.02。

备注

我需要补充一点,关于这个话题有很多讨论。我尝试使用可能适合我的模型的可能解决方案。

这种现象似乎是因为模型在准确率和损失方面具有较高的批次间方差。如果我用每一步的实际指标而不是整个时期的平均值来绘制模型图,就可以说明这一点:

在这里您可以看到模型可以有很大的不同。 (这张图只是一个epoch,但事实依然如此)。

由于每个时期都报告了平均指标,因此在下一个时期开始时,平均指标很可能会低于之前的平均值,从而导致 运行平均值,如下图红色所示:

如果你把红色图中的不连续性想象成纪元转换,你就会明白为什么你会观察到问题中的现象。

TL;DR 该模型在每批次的输出中具有非常高的方差。