5.3 超参数和验证集
大多数机器学习算法都有超参数,可以设置来控制算法行为。超参数的值不是通过学习算法本身学习出来的(尽管我们可以设计一个嵌套的学习过程,一个学习算法为另一个学习算法学出最优超参数)。
在图5.2所示的多项式回归示例中,有一个超参数,即多项式的次数,作为容量超参数。控制权重衰减程度的λ是另一个超参数。
有时一个选项被设为学习算法不用学习的超参数,是因为它太难优化了。更多的情况是,该选项必须是超参数,因为它不适合在训练集上学习。这适用于控制模型容量的所有超参数。如果在训练集上学习超参数,这些超参数总是趋向于最大可能的模型容量,导致过拟合(见图5.3)。例如,相比低次多项式和正的权重衰减设定,更高次的多项式和权重衰减参数设定λ=0总能在训练集上更好地拟合。
为了解决这个问题,我们需要一个训练算法观测不到的验证集(validation set)样本。
早先我们讨论过和训练数据相同分布的样本组成的测试集,它可以用来估计学习过程完成之后的学习器的泛化误差。其重点在于测试样本不能以任何形式参与到模型的选择中,包括设定超参数。基于这个原因,测试集中的样本不能用于验证集。因此,我们总是从训练数据中构建验证集。特别地,我们将训练数据分成两个不相交的子集。其中一个用于学习参数。另一个作为验证集,用于估计训练中或训练后的泛化误差,更新超参数。用于学习参数的数据子集通常仍被称为训练集,尽管这会和整个训练过程用到的更大的数据集相混。用于挑选超参数的数据子集被称为验证集。通常,80%的训练数据用于训练,20%用于验证。由于验证集是用来“训练”超参数的,尽管验证集的误差通常会比训练集误差小,验证集会低估泛化误差。所有超参数优化完成之后,泛化误差可能会通过测试集来估计。
在实际中,当相同的测试集已在很多年中重复地用于评估不同算法的性能,并且考虑学术界在该测试集上的各种尝试,我们最后可能也会对测试集有着乐观的估计。基准会因之变得陈旧,而不能反映系统的真实性能。值得庆幸的是,学术界往往会移到新的(通常会更巨大、更具挑战性)基准数据集上。
5.3.1 交叉验证
将数据集分成固定的训练集和固定的测试集后,若测试集的误差很小,这将是有问题的。一个小规模的测试集意味着平均测试误差估计的统计不确定性,使得很难判断算法A是否比算法B在给定的任务上做得更好。
当数据集有十万计或者更多的样本时,这不会是一个严重的问题。当数据集太小时,也有替代方法允许我们使用所有的样本估计平均测试误差,代价是增加了计算量。这些过程是基于在原始数据上随机采样或分离出的不同数据集上重复训练和测试的想法。最常见的是k-折交叉验证过程,如算法5.1所示,将数据集分成k个不重合的子集。测试误差可以估计为k次计算后的平均测试误差。在第i次测试时,数据的第i个子集用于测试集,其他的数据用于训练集。带来的一个问题是不存在平均误差方差的无偏估计(Bengio and Grandvalet,2004),但是我们通常会使用近似来解决。
算法5.1 k-折交叉验证算法。当给定数据集对于简单的训练/测试或训练/验证分割而言太小难以产生泛化误差的准确估计时(因为在小的测试集上,L可能具有过高的方差),k-折交叉验证算法可以用于估计学习算法A的泛化误差。数据集包含的元素是抽象的样本z(i)(对于第i个样本),在监督学习的情况代表(输入,目标)对z(i)=(x(i),y(i)),或者无监督学习的情况下仅用于输入z(i)=x(i)。该算法返回中每个示例的误差向量e,其均值是估计的泛化误差。单个样本上的误差可用于计算平均值周围的置信区间(式(5.47))。虽然这些置信区间在使用交叉验证之后不能很好地证明,但是通常的做法是只有当算法A误差的置信区间低于并且不与算法B的置信区间相交时,我们才声明算法A比算法B更好。
Define KFoldXV(,A,L,k):
Require:为给定数据集,其中元素为z(i)
Require:A为学习算法,可视为一个函数(使用数据集作为输入,输出一个学好的函数)
Require:L为损失函数,可视为来自学好的函数f,将样本映射到中标量的函数
Require:k为折数
将分为k个互斥子集i,它们的并集为
for i from 1 to k do
for z(j)in i do
end for
end for
Return e
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论