我将扩展@today 的答案。在如何报告一个时期的损失以及如何使用它来确定何时停止训练方面存在一定的平衡。
- 如果您只查看最近批次的损失,这将是对您的数据集损失的一个非常嘈杂的估计,因为可能该批次恰好存储了您的模型遇到问题的所有样本,或者所有难以成功的样本.
- 如果您查看 epoch 中所有批次的平均损失,您可能会得到一个倾斜的响应,因为正如您所指出的,该模型已经(希望)在 epoch 中有所改进,因此初始批次的性能没有那么有意义与后期批次的性能相比。
准确报告 epoch loss 的唯一方法是将模型退出训练模式,即修复所有模型参数,然后在整个数据集上运行模型。这将是对您的时代损失的无偏计算。然而,总的来说这是一个糟糕的主意,因为如果你有一个复杂的模型或大量的训练数据,你会浪费很多时间来做这件事。
因此,我认为通过报告N个小批次的平均损失来平衡这些因素是最常见的,其中N大到足以消除单个批次的噪声,但又不会大到模型性能在第一个和第一个批次之间无法比较最后一批。
我知道你在 Keras,但这里有一个 PyTorch 示例清楚地说明了这个概念,在这里复制:
for epoch in range(2): # loop over the dataset multiple times
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# get the inputs; data is a list of [inputs, labels]
inputs, labels = data
# zero the parameter gradients
optimizer.zero_grad()
# forward + backward + optimize
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# print statistics
running_loss += loss.item()
if i % 2000 == 1999: # print every 2000 mini-batches
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
print('Finished Training')
您可以看到他们累积了N = 2000 个批次的损失,报告了这 2000 个批次的平均损失,然后将运行损失归零并继续前进。