如何正确使用验证集和测试集进行神经网络训练?

机器算法验证 机器学习 神经网络 卷积神经网络 验证 火车
2022-03-26 05:37:26

我从事机器学习业务已有很长时间了,但这个基本事实仍然让我感到困惑,因为每篇论文、文章和/或书籍都描述了验证和测试集的不同用途。我的目标是让我在这个问题上永远放心:

假设我有一个相对较小的卷积神经网络,我想在 MNIST 数据集上对其进行训练。自然地,我想学习给定 CNN 的最佳超参数,例如权重衰减系数、学习率等。自然地,MNIST 有 60K 训练图像和 10K 测试图像。基本做法是分配 10K 的训练集作为 MNIST 的验证集。λα

假设我们正在对超参数进行网格搜索,并假设我们已经修复了对。然后我们开始使用 SGD 训练 CNN,使用 50K 训练集并在每个 epoch 结束时测量 10K 验证集的性能(完全通过 50K 训练集)。通常,如果固定的 epoch 预算已经耗尽,我们要么停止训练,要么开始失去验证集的准确性。然后,仅CNN 的训练过程中使用λα(λ,α)(λ,α)对,我们在测试集上测量真实性能。我们选择性能最好的那个。这种用法很直观,不会导致网络在测试集上不公平地过拟合。但问题是,我们在使用 SGD 的实际训练中从未使用过 10K 验证集。

那么,现在,在这里使用验证集的正确方法是什么?对完成训练后,无论是用完允许的 epoch 还是由于验证集过拟合而提前退出,我们是否应该合并验证集和训练集,并训练一些时代更多?此时,由于逐渐衰减,我们的学习率可能已经非常小了。我们是否应该使用 60K 训练 + 验证集从头开始训练所有内容,将学习率设置为其初始值?(λ,α)

考虑到我们的网格搜索,另一种选择可能是使用每个对来训练 CNN,仅使用 SGD 中的 50K 训练样本和 10K 验证样本来测量准确性。不允许与测试集交互。假设在我们用每个对进行训练后,我们选择在验证集上产生最高准确率的对。然后我们用挑选的超参数从头开始训练 CNN,这次直接在 SGD 中使用 60K 训练 + 验证样本,进行一定数量的固定 epoch。训练结束后,我们一劳永逸地使用测试集来声明我们最终的准确度表现。(λ,α)(λ,α)

在我看来,这种方法会导致以下问题:我们选择的超参数将是 50K 训练样本的最佳超参数!由于我们使用了实际训练集的较小子集,因此模型很可能更容易过度拟合,看到较低的数据变化,因此我们的超参数搜索可能倾向于找到更高的有了这个,该模型将无法补偿额外 10K 样本的变化λλλ

所以,我不确定使用验证测​​试集的最终正确方法是什么。什么是有效的 - 合乎逻辑的方法?

1个回答

底线是:

一旦您使用部分数据来选择哪个模型表现更好,您就已经使您的模型偏向于该数据。1

机器学习一般

在一般机器学习场景中,您将使用交叉验证来找到超参数的最佳组合,然后修复它们并在整个训练集上进行训练。最后,您将在测试集上进行评估,只是为了了解它在新的、看不见的数据上的表现

如果您随后要训练一个不同的模型并选择其中一个在测试集上表现更好的模型,那么您已经将测试集用作模型选择循环的一部分,因此您还需要一个新的、独立的测试集来评估测试性能。

神经网络

神经网络有点特殊,因为它们的训练通常很长,因此不经常使用交叉验证(如果训练需要 1 天,那么在单台机器上进行 10 倍交叉验证已经需要一周多的时间) . 此外,重要的超参数之一是训练时期的数量。训练的最佳长度随着不同的初始化和不同的训练集而变化,因此将 epoch 数固定为一个数字,然后针对这个固定数字对所有训练数据(训练+验证)进行训练并不是很可靠的方法。

相反,正如您所提到的,使用了某种形式的提前停止:可能会长时间训练模型,定期保存“快照”,最终选择在某些验证集上具有最佳性能的“快照”。要启用此功能,您必须始终将验证数据的一部分保留在一边2因此,您永远不会在所有样本上训练神经网络。

最后,还有很多其他超参数,例如学习率、权重衰减、辍学率,还有网络架构本身(深度、单元数、卷积核大小等)。您可能使用用于提前停止的相同验证集来调整这些,但是再一次,您通过使用它进行提前停止来过度拟合该集合,因此它确实给您一个有偏差的估计。然而,理想的情况是使用另一个单独的验证集。一旦你修复了所有剩余的超参数,你可以将第二个验证集合并到你的最终训练集中。


总结一下:

  1. 将所有数据拆分为training+ validation 1+ validation 2+testing
  2. 训练网络trainingvalidation 1用于提前停止
  3. 评估validation 2,更改超参数,重复 2。
  4. training从 3. 中选择最佳超参数组合,在+上训练网络validation 2validation 1用于提前停止
  5. 上评价testing这是您的最终(真实)模型性能。

1这正是 Kaggle 挑战有 2 个测试集的原因:一个公共的和私有的。您可以使用公共测试集来检查模型的性能,但最终重要的是私有测试集的性能,如果您过度拟合公共测试集,您就会失败。

2阿马里等人。(1997) 在他们的文章Asymptotic Statistical Theory of Overtraining and Cross-Validation中建议将用于提前停止的样本比率设置为,其中是训练集的大小。1/2NN