2

我正在与 Adam 在 PyTorch 中训练 CNN,初始学习率为 1e-5。我的 epoch 中有 5039 个样本,batch size 为 1。我观察到,在一个 epoch 结束时,我有一个规律的训练损失峰值模式。这是训练损失的图: 在此处输入图像描述

从图中可以看到清晰的尖峰模式,这些尖峰恰好发生在时代结束时。我的时代包含 5039 个样本。有趣的是,尖刺不仅会击落,有时还会向上击落。

我不认为是:

  • 如果没有对数据集进行洗牌,这些峰值可能会得到解释。但是,我在每个时期都对我的数据集进行洗牌。

  • 当 epoch 的最终批次小于其他批次时会发生这种行为,这会导致不同程度的损失(为什么我的训练损失有规律的尖峰?)。但是,这不是我的情况,因为我的批量大小是 1。

一种潜在的技巧可能是在更新步骤之前应用渐变裁剪。但是,对我来说,这似乎不是处理这个问题的好方法。

  1. 您对这种峰值模式的原因有何看法?
  2. 有这样的模式有多糟糕?
4

1 回答 1

0

我能想到的两种可能性:

  1. 重置每个时期的损失记录方法。
  2. 小数据集。

一种可能性:您记录损失的方式。例如,如果您在每个步骤中累积损失、记录平均值并在 epoch 结束时重置损失,那么第一批可能会影响您在 epoch 结束时的损失。如果您在 epoch 结束时重置损失计数器,那么您可能会看到性能的飞跃。

all_losses = []
for e in range(epochs):
    epoch_losses = [] # <- jump in performance when you discard earlier losses
    for i, batch in enumerate(data_loader):
        batch_loss = ...
        epoch_losses.append(batch_loss)
        all_losses.append(np.mean(epoch_losses))

plot(losses)

另一种可能性是您的数据集非常小,以至于在每个 epoch 开始时性能都有明显的跳跃,因为您现在已经看到了一个额外的时间的一整批项目。对于较大的数据集,在训练过程中会有更多的噪音(后来的批次抵消了第一批取得的进展),因此您看不到这种跳跃。

于 2022-01-15T20:59:17.530 回答