我从事机器学习业务已有很长时间了,但这个基本事实仍然让我感到困惑,因为每篇论文、文章和/或书籍都描述了验证和测试集的不同用途。我的目标是让我在这个问题上永远放心:
假设我有一个相对较小的卷积神经网络,我想在 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 样本的变化。
所以,我不确定使用验证测试集的最终正确方法是什么。什么是有效的 - 合乎逻辑的方法?