为什么不优化训练数据集的超参数?

Why not optimize hyperparameters on train dataset?

在开发神经网络时,通常将训练数据划分为训练、测试和 Holdout 数据集(很多人分别称它们为训练、验证和测试。相同的东西,不同的名称).许多人建议根据测试数据集中的性能选择超参数。我的问题是:为什么?为什么不最大化训练数据集中超参数的性能,并在我们通过测试数据集中的性能下降检测到过度拟合时停止训练超参数?由于 Train 通常大于 Test,与在 Test 数据集上训练超参数相比,这不会产生更好的结果吗?

2016 年 7 月 6 日更新

术语更改,以匹配下面的评论。在这个 post 中,数据集现在被称为 TrainValidationTest。我不使用测试数据集进行训练。我正在使用 GA 来优化超参数。在外部 GA 训练过程的每次迭代中,GA 选择一个新的超参数集,在训练数据集上训练,并在验证和测试数据集上进行评估。 GA 调整超参数以最大限度地提高训练数据集中的准确性。当检测到网络过度拟合(在验证数据集中)时,迭代内的网络训练停止,当检测到超参数过度拟合时(再次在验证数据集中),外部 GA 训练过程停止。结果是针对 Train 数据集伪优化的超参数。问题是:为什么许多来源(例如 https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf,第 B.1 节)建议优化验证集而不是训练集的超参数?引用 Srivasta、Hinton 等人(上文 link):“在验证集上调整了超参数,以便产生最佳验证错误...

您在这里遗漏了两件事。首先,次要的是,测试集 从未 用于进行任何训练。这是 validation 的目的(测试只是为了评估您的最终测试性能)。主要的误解是它的意思"to use validation set to fit hyperparameters"。这正是你所描述的 - 在训练集上训练具有给定超参数的模型,并使用验证来简单地检查你是否过度拟合(你用它来估计泛化),但是你并没有真正 "train" ,你只需检查你在这个子集上的分数(正如你所注意到的 - 小得多)。

你不能"stop training hyperparamters"因为这不是一个连续的过程,通常超参数只是"possible sets of values",你必须简单地测试很多,没有定义直接训练的有效方法n您感兴趣的实际指标(如准确性)和超参数(如 NN 中隐藏层的大小或什至 SVM 中的 C 参数)之间的过程,因为这两者之间的函数 link 不可微,是高度非凸的通常 "ugly" 进行优化。如果你可以根据超参数定义一个很好的优化过程,而不是它通常不被称为超参数而是参数,那么这个命名约定中的关键区别是很难直接优化 - 我们称超参数为参数,而不是直接优化因此你需要一个"meta method"(就像简单地测试验证集)到select它。

但是,您可以为超参数定义一个 "nice" 元优化协议,但这仍将使用验证集作为估计量,例如超参数的贝叶斯优化就是这样做的 - 它试图拟合一个函数说您的模型在超参数 space 中的表现如何,但是为了让此元方法有任何 "training data",您需要验证集来估计任何给定超参数集(输入到您的元方法)

原因是开发模型总是涉及调整其配置:例如,选择层数或层的大小(称为模型的超参数,以区别于参数,其中是网络的权重)。您通过将模型在验证数据上的性能用作反馈信号来进行此调整。从本质上讲,这种调整是一种学习形式:在某些参数 space 中搜索良好的配置。因此,根据模型在验证集上的性能调整模型的配置会很快导致对验证集的过度拟合,即使您的模型从未直接在其上进行过训练。

这种现象的核心是信息泄露的概念。每次根据模型在验证集上的性能调整模型的超参数时,有关验证数据的一些信息都会泄漏到模型中。如果您只对一个参数执行一次此操作,那么将泄漏很少的信息,并且您的验证集将保持可靠以评估模型。但是,如果你重复多次——运行 一个实验,对验证集进行评估,并作为结果修改你的模型——那么你就会将越来越多的关于验证集的信息泄漏到模型中。

最终,您将得到一个在验证数据上人为表现良好的模型,因为这就是您对其进行优化的目的。您关心的是全新数据的性能,而不是验证数据,因此您需要使用一个完全不同的、前所未见的数据集来评估模型:测试数据集。您的模型不应该访问有关测试集的任何信息,即使是间接的。如果根据测试集性能调整了模型的任何内容,那么您的泛化度量就会有缺陷。

简单回答:我们做

对于简单的前馈神经网络,您必须 select 例如开始时每层的层数和单元数、正则化(以及 non-continuous 参数,如拓扑结构,如果不是前馈和损失函数),您将在这些方面进行优化。

因此,总而言之,您优化了:

  • 普通参数在训练期间但不在验证期间

  • 训练期间的超参数和验证期间的

在验证过程中不要触及许多普通参数(权重和偏差),这一点非常重要。那是因为它们有数千个自由度,这意味着它们可以学习你训练它们的数据。但是该模型也不会泛化到新数据(即使新数据来自相同的分布)。通常控制模型刚性(正则化)的超参数通常只有很少的自由度。

这也适用于决策树、森林等其他机器学习算法。