机器学习中,一般将样本数据分成独立的三部分:训练集、验证集和测试集。
其中验证集在机器学习中所起到的作用是:开发模型总需要调节模型的参数,而整个调节过程需要在验证集数据上运行训练的模型,从而给出其表现的反馈信号来修改网络模型及参数。
然而在对样本数据的划分上,往往受限于一些过时的规则以及思维定式的限制,在划分验证集以及解决验证集目前存在的一些问题上,面临着比较大的阻碍。
数据科学家 Ray Heberer 专门撰写了一篇文章来介绍验证集目前存在的一些问题,并表达了自己的看法:验证集如今变得不再有新意。
对此,他提出用心理模型来改善验证集当前的困局。
正文内容如下:
研究者们入门数据科学世界时,意识到的第一件事便是,拥有训练和验证机器学习模型的独立数据集,至关重要。但是要实现这一点,很不容易。尽管我们对于为何要对数据集进行划分的背后有一个简单的直觉,然而深入理解这一困扰这个行业的问题,仍存在许多阻碍。
其中一个阻碍便是坚持使用已过时的“拇指规则”(也叫经验法则),例如“ 按 70:30 的比例分割训练集和测试集”(70–30 train-test split)或大数据出现之前的黑暗时代遗留下来的方法。
另一个阻碍是:我们许多人在学习“除了测试集之外,我们还应该有一个独立验证集用于调整超参数”的过程中都会遇到一个问题:如果我们仅通过调整超参数就会导致测试集过拟合,那么就不会导致验证集过拟合吗?然而针对这一问题,研究者们还没有找到一个好的答案。
对于该问题的回答当然是肯定的。这会导致验证集过拟合,并且这已经不是新鲜事了。这里本文我尝试探索一些方法来思考为什么会发生这种情况,并希望通过这样做,还能开辟出一条更深入地理解过拟合和数据划分的道路,而不仅仅是讨论上面这两个人们为准备面试而需要了解的命题陈述。
本文首先将探讨损失曲面(Loss Landscapes)的概念,以及如何利用样本曲面与总体曲面之间的关系理解验证集泄漏。在此过程中,将基于一些简化的假设来开发有用的心理模型(Mental Model )。最后,将通过一个快速的实验来验证我们的理解。
让我们开始吧!
一、损失曲面
双变量函数(GitHub代码地址:https://gist.github.com/rayheberer/bd2d94443e77b9734d52a7a4c736bbf3)
如果你熟悉机器学习,尤其是研究过神经网络和梯度下降算法,以及阅读过下面这篇关于梯度优化算法的(文中有丰富的可视化图片和动画)文章,那么你对损失曲面概念一定不陌生。
具体而言,损失曲面就是将机器学习模型的损失或误差作为其参数的函数。
如果你觉得这个概念过于简单而不必特别关注,我十分能理解。尽管你已经理解了相关基本概念,但“损失曲面”实际上是这类函数的名称,知道它后你可以轻松查阅各种有趣的内容和相关研究。
“曲面”一词唤起了我们的物理直觉。照片由 Fabrizio Conti 在 Unsplash 上提供
损失曲面是可以通过梯度下降或其他方法(例如模拟退火、演化方法)进行遍历的函数。即使你要处理的函数通常位于高维空间中, 这样命名让我们不由得根据物理直觉来思考它。
尽管我们通常将损失曲面视为模型参数函数,但也可将它们视为超参数函数。
需要注意的是:虽然损失可以根据数据和模型参数显式计算,但损失与模型超参数之间联系更不直接。如果你对此感到困惑,不妨回顾下生物学家使用适应度曲面( Fitness Landscapes)将繁殖成功作为遗传因素的函数。必要时你可将超参数函数(和数据)的损失和“模型适应度曲面”的损失,视作相同的。
现在要意识到的关键是,每个数据集分区都会有独立的损失曲面,而训练集、验证集和测试集的损失曲面完全不同。如果数据已经被很好地分割,那么每一组数据就都是一个有代表性但不相同的样本。
最重要的是,所有现有数据的损失曲面与真实环境中的潜在“总体”数据的损失曲面不同。我们之所以同时需要验证集和测试集,是因为如果随着时间的推移验证集确实泄漏了信息,那么我们仍需要一些数据来无偏估计模型在真实环境中的性能。
一种考虑超参数调整的方法是,将遍历验证集数据的损失曲面作为超参数函数。让我们从假设一个“理想”曲面来开始建立直觉。
二、面向心理模型:假设独立的超参数
对于理想的损失曲面,超参数当然是“独立的”,意思是超参数与损失的之间没有相互作用项。这类函数的等高线不会对角突出,如下图所示:
这类的损失曲面之所以理想,是因为在处理它们时,可以将调整许多超参数的问题分解为一次单独调整一个超参数。由于任意一个超参数的最佳值与其他超参数无关,因此我们可以按顺序而不是并行地进行超参数调整。
换句话说,就是将每个超参数视为一个旋钮。我们要做的就是不断调整每个特定旋钮,直到找到最佳位置。
然后关联每个旋钮,就可以得到损失曲面的投影。我们的这部分函数将只有一个自变量:正在不断调整的超参数。
这就是变得有趣的地方:回想一下,每个数据集都有自己的损失曲面。现在想象在调节的每个旋钮之后叠加这些函数的投影。然后让我们选择用于确定最佳超参数值的验证数据的损失曲面,和全部总体数据的假设损失曲面,它是我们期望的模型最优结果,也是测试集的估计(如果采样正确)。
当我们根据验证集数据每次都将旋钮调至最佳值后,会发生什么呢?
可能的结果是验证集和“总体”损失曲面不太一致。当每次我们调整一个超参数值使验证集的损失曲面达到峰值时,我们可能已经越过“总体”损失曲面的峰值。调整得越多,越过的峰值就越多。这将导致验证集和实际性能(由测试集估计)之间的差距越来越大。
就像这样!这就是验证集会变得过时和泄漏信息的原因,或者至少是一种有用的思考方式。
在这里,特别细心的读者可能会问:“如果验证和总体损失曲面没有全部重合,那为什么峰值的重合要少于其他点的重合呢?”这是一个很好的问题,并且开始测试我们开发的心理模型的局限性。
为了回答这个问题,考虑单个超参数的验证性能。现在,将目标函数的每个值都视为获得了来自泛化特征和验证集数据异常的贡献。
随着获得更多的最优值,每一个部分做出贡献的机会就会增加。为了在不降低测试集和真实环境性能的情况下提升验证性能,要求提高验证性能的贡献只来自泛化特征部分。
作为反馈,在这里向大家提出以下问题:如果你要优化的一个超参数实际上不能从数据(例如 random_state)中学习泛化特征,针对这种情况优化验证损失会产生什么影响?
归根结底,我们在此讨论的是一个心理模型,正如 George Box 的著名格言所说的:
-
所有模型都是错的,但有些是有用的。
我希望这是思考验证集过度拟合背后机制的一种有用方法。
三、“弄脏”我们的手:模拟验证集泄漏
作为数据科学家,我们不能不通过实验就阐述一个观点。要求超参数之间没有任何交互作用,是过于严格的。尽管这对于开发心理模型很有用,但最好有一些经验结果表明这种想法能扩展到没那么理想的场景。
接下来进行一个关于梯度提升回归模型(Gradient Boosting Regression Model)上执行的调整量以及验证集和测试集性能之间的差距的快速实验。其中选择使用梯度提升算法的原因,是它是具有大量超参数的主流模型。
根据我们对验证集泄漏的理解,我们期望的结果是:随着调整的增加,验证集和测试集之间的性能差距将不断扩大。在实验中,“更多的”调整定义为通过5个不同的超参数进行更多次的随机搜索迭代。迭代次数越多,就越有可能在验证集上找到更理想的结果。如果心理模型的部分最优值真的来自非泛化的验证数据异常,那么我们期望在测试数据上不要出现这种性能提升。
在展示最终结果之前,需要提前说明一件重要的事:这个实验可能偏向于支持我的论点:
当然,通过使用大型验证集可以减少验证集泄漏的风险,但我使用了小数据来进行训练和验证,即“波士顿的房价”数据集,为的是能够轻松地演示过度调整小的验证集的情况。
你可以怀疑这些结论是否适用于除我选择的特定数据集以外的其它数据集!我鼓励你提出自己的实验并分享你的结果。
如图所示,当我们投入越多的精力用于优化超参数和根据验证集性能选择模型时,验证集和测试集之间的性能差距就越大。
如果我们已经调优了一个超参数子集,然后再调优另一个超参数集,或者尝试切换使用的模型族,验证集和测试集间的性能差距会更加显著。根据数据样本(验证集)做出的每个决策,都会将该样本的随机波动缓慢地编码到结果中。
四、结论
这实际上是我第二次尝试解释超参数调整与验证集过拟合现象之间的关系。而难以置信的是,我们很难清楚地解释相对简单的潜在直觉想法。
我认为部分原因是,“提问-回答”的思维定式仍然主导了我们的集体认知,例如“过度拟合验证数据”和“验证集泄漏信息”没有视觉或经验直觉的支持。
尽管本文是为了更深入、更初级的解释超参数调整和过拟合验证集之间的关系,但我们仍有更多角度空间和思考方式。 Cassie Kozyrkov 最近发布了一篇文章,将教学和《憨豆先生》进行类比,对数据集分割进行了有趣的论述:
很高兴看到数据社区提出一些其它想法! 雷锋网雷锋网雷锋网(公众号:雷锋网)
via:https://towardsdatascience.com/why-machine-learning-validation-sets-grow-stale-69fa043fd547
。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/137763.html