训练集的识别率一直波动_机器学习验证集为什么不再有新意?

机器学习中,一般将样本数据分成独立的三部分:训练集、验证集和测试集。

其中验证集在机器学习中所起到的作用是:开发模型总需要调节模型的参数,而整个调节过程需要在验证集数据上运行训练的模型,从而给出其表现的反馈信号来修改网络模型及参数。

然而在对样本数据的划分上,往往受限于一些过时的规则以及思维定式的限制,在划分验证集以及解决验证集目前存在的一些问题上,面临着比较大的阻碍。

数据科学家 Ray Heberer 专门撰写了一篇文章来介绍验证集目前存在的一些问题,并表达了自己的看法:验证集如今变得不再有新意。

对此,他提出用心理模型来改善验证集当前的困局。

正文内容如下:

研究者们入门数据科学世界时,意识到的第一件事便是,拥有训练和验证机器学习模型的独立数据集,至关重要。但是要实现这一点,很不容易。尽管我们对于为何要对数据集进行划分的背后有一个简单的直觉,然而深入理解这一困扰这个行业的问题,仍存在许多阻碍。

其中一个阻碍便是坚持使用已过时的“拇指规则”(也叫经验法则),例如“ 按 70:30 的比例分割训练集和测试集”(70–30 train-test split)或大数据出现之前的黑暗时代遗留下来的方法。

另一个阻碍是:我们许多人在学习“除了测试集之外,我们还应该有一个独立验证集用于调整超参数”的过程中都会遇到一个问题:如果我们仅通过调整超参数就会导致测试集过拟合,那么就不会导致验证集过拟合吗?然而针对这一问题,研究者们还没有找到一个好的答案。

对于该问题的回答当然是肯定的。这会导致验证集过拟合,并且这已经不是新鲜事了。这里本文我尝试探索一些方法来思考为什么会发生这种情况,并希望通过这样做,还能开辟出一条更深入地理解过拟合和数据划分的道路,而不仅仅是讨论上面这两个人们为准备面试而需要了解的命题陈述。

本文首先将探讨损失曲面(Loss Landscapes)的概念,以及如何利用样本曲面与总体曲面之间的关系理解验证集泄漏。在此过程中,将基于一些简化的假设来开发有用的心理模型(Mental Model )。最后,将通过一个快速的实验来验证我们的理解。

让我们开始吧!

一、损失曲面

96f65cd793adbf914c9d83cdf66a9e5d.png

双变量函数(GitHub代码地址:https://gist.github.com/rayheberer/bd2d94443e77b9734d52a7a4c736bbf3)

如果你熟悉机器学习,尤其是研究过神经网络和梯度下降算法,以及阅读过下面这篇关于梯度优化算法的(文中有丰富的可视化图片和动画)文章,那么你对损失曲面概念一定不陌生。

  • 文章地址:https://ruder.io/optimizing-gradient-descent/#visualizationofalgorithms

具体而言,损失曲面就是将机器学习模型的损失或误差作为其参数的函数。

如果你觉得这个概念过于简单而不必特别关注,我十分能理解。尽管你已经理解了相关基本概念,但“损失曲面”实际上是这类函数的名称,知道它后你可以轻松查阅各种有趣的内容和相关研究。

  • 相关阅读参考:https://arxiv.org/abs/1712.09913

ba4b4637e3275768769962e25daeb128.png

“曲面”一词唤起了我们的物理直觉。照片由 Fabrizio Conti 在 Unsplash 上提供

损失曲面是可以通过梯度下降或其他方法(例如模拟退火、演化方法)进行遍历的函数。即使你要处理的函数通常位于高维空间中, 这样命名让我们不由得根据物理直觉来思考它。

尽管我们通常将损失曲面视为模型参数函数,但也可将它们视为超参数函数。

需要注意的是:虽然损失可以根据数据和模型参数显式计算,但损失与模型超参数之间联系更不直接。如果你对此感到困惑,不妨回顾下生物学家使用适应度曲面( Fitness Landscapes)将繁殖成功作为遗传因素的函数。必要时你可将超参数函数(和数据)的损失和“模型适应度曲面”的损失,视作相同的。

现在要意识到的关键是,每个数据集分区都会有独立的损失曲面,而训练集、验证集和测试集的损失曲面完全不同。如果数据已经被很好地分割,那么每一组数据就都是一个有代表性但不相同的样本。

最重要的是,所有现有数据的损失曲面与真实环境中的潜在“总体”数据的损失曲面不同。我们之所以同时需要验证集和测试集,是因为如果随着时间的推移验证集确实泄漏了信息,那么我们仍需要一些数据来无偏估计模型在真实环境中的性能。

一种考虑超参数调整的方法是,将遍历验证集数据的损失曲面作为超参数函数。让我们从假设一个“理想”曲面来开始建立直觉。

二、面向心理模型:假设独立的超参数

对于理想的损失曲面,超参数当然是“独立的”,意思是超参数与损失的之间没有相互作用项。这类函数的等高线不会对角突出,如下图所示:

9fc3bc89cc6f9ca0ab28a0368a7a9bb8.png

这类的损失曲面之所以理想,是因为在处理它们时,可以将调整许多超参数的问题分解为一次单独调整一个超参数。由于任意一个超参数的最佳值与其他超参数无关,因此我们可以按顺序而不是并行地进行超参数调整。

换句话说,就是将每个超参数视为一个旋钮。我们要做的就是不断调整每个特定旋钮,直到找到最佳位置。

然后关联每个旋钮,就可以得到损失曲面的投影。我们的这部分函数将只有一个自变量:正在不断调整的超参数。

4f038e7cf79a6e599682f5c3c8517c63.png

这就是变得有趣的地方:回想一下,每个数据集都有自己的损失曲面。现在想象在调节的每个旋钮之后叠加这些函数的投影。然后让我们选择用于确定最佳超参数值的验证数据的损失曲面,和全部总体数据的假设损失曲面,它是我们期望的模型最优结果,也是测试集的估计(如果采样正确)。

当我们根据验证集数据每次都将旋钮调至最佳值后,会发生什么呢?

可能的结果是验证集和“总体”损失曲面不太一致。当每次我们调整一个超参数值使验证集的损失曲面达到峰值时,我们可能已经越过“总体”损失曲面的峰值。调整得越多,越过的峰值就越多。这将导致验证集和实际性能(由测试集估计)之间的差距越来越大。

61e23686e00782a37bc4cfde229ad94d.png

就像这样!这就是验证集会变得过时和泄漏信息的原因,或者至少是一种有用的思考方式。

在这里,特别细心的读者可能会问:“如果验证和总体损失曲面没有全部重合,那为什么峰值的重合要少于其他点的重合呢?”这是一个很好的问题,并且开始测试我们开发的心理模型的局限性。

为了回答这个问题,考虑单个超参数的验证性能。现在,将目标函数的每个值都视为获得了来自泛化特征和验证集数据异常的贡献。

随着获得更多的最优值,每一个部分做出贡献的机会就会增加。为了在不降低测试集和真实环境性能的情况下提升验证性能,要求提高验证性能的贡献只来自泛化特征部分。

作为反馈,在这里向大家提出以下问题:如果你要优化的一个超参数实际上不能从数据(例如 random_state)中学习泛化特征,针对这种情况优化验证损失会产生什么影响?

归根结底,我们在此讨论的是一个心理模型,正如 George Box 的著名格言所说的:

  • 所有模型都是错的,但有些是有用的。

我希望这是思考验证集过度拟合背后机制的一种有用方法。

三、“弄脏”我们的手:模拟验证集泄漏

作为数据科学家,我们不能不通过实验就阐述一个观点。要求超参数之间没有任何交互作用,是过于严格的。尽管这对于开发心理模型很有用,但最好有一些经验结果表明这种想法能扩展到没那么理想的场景。

接下来进行一个关于梯度提升回归模型(Gradient Boosting Regression Model)上执行的调整量以及验证集和测试集性能之间的差距的快速实验。其中选择使用梯度提升算法的原因,是它是具有大量超参数的主流模型。

根据我们对验证集泄漏的理解,我们期望的结果是:随着调整的增加,验证集和测试集之间的性能差距将不断扩大。在实验中,“更多的”调整定义为通过5个不同的超参数进行更多次的随机搜索迭代。迭代次数越多,就越有可能在验证集上找到更理想的结果。如果心理模型的部分最优值真的来自非泛化的验证数据异常,那么我们期望在测试数据上不要出现这种性能提升。

在展示最终结果之前,需要提前说明一件重要的事:这个实验可能偏向于支持我的论点:

当然,通过使用大型验证集可以减少验证集泄漏的风险,但我使用了小数据来进行训练和验证,即“波士顿的房价”数据集,为的是能够轻松地演示过度调整小的验证集的情况。

你可以怀疑这些结论是否适用于除我选择的特定数据集以外的其它数据集!我鼓励你提出自己的实验并分享你的结果。

  • 实现代码的GitHub地址:https://gist.githubusercontent.com/rayheberer/dcbaf91e9ca053316755e60991e48da9/raw/29eae8febe4e147b02d72b9624a062e86b4a0cc5/validation-test-perforance-gap-experiment.py

2720eb7b6ec59389a137523cfbfd9f13.png

如图所示,当我们投入越多的精力用于优化超参数和根据验证集性能选择模型时,验证集和测试集之间的性能差距就越大。

如果我们已经调优了一个超参数子集,然后再调优另一个超参数集,或者尝试切换使用的模型族,验证集和测试集间的性能差距会更加显著。根据数据样本(验证集)做出的每个决策,都会将该样本的随机波动缓慢地编码到结果中。

四、结论

这实际上是我第二次尝试解释超参数调整与验证集过拟合现象之间的关系。而难以置信的是,我们很难清楚地解释相对简单的潜在直觉想法。

  • 相关阅读参考:https://medium.com/@rayheberer/black-magic-and-hyperparameter-tuning-ef875eb31712

我认为部分原因是,“提问-回答”的思维定式仍然主导了我们的集体认知,例如“过度拟合验证数据”和“验证集泄漏信息”没有视觉或经验直觉的支持。

尽管本文是为了更深入、更初级的解释超参数调整和过拟合验证集之间的关系,但我们仍有更多角度空间和思考方式。 Cassie Kozyrkov 最近发布了一篇文章,将教学和《憨豆先生》进行类比,对数据集分割进行了有趣的论述:

  • 文章地址:https://towardsdatascience.com/training-validation-and-test-phases-in-ai-explained-in-a-way-youll-never-forget-744be50154e8

很高兴看到数据社区提出一些其它想法! 雷锋网雷锋网雷锋网

via:https://towardsdatascience.com/why-machine-learning-validation-sets-grow-stale-69fa043fd547

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java写一个web聊天工具_javaweb写的在线聊天应用

写这个玩意儿就是想练练手, 用户需要登陆才能在线聊天,不要依赖数据库, 不需要数据库的操作, 所有的数据都是保存在内存中, 如果服务器一旦重启,数据就没有了;登录界面:聊天界面&…

人物角色群体攻击判定(一)

我们制作3D动作游戏的时候,常常主人公是一对多人进行攻击,或者敌人在角色前方一定范围内进行攻击. 我们怎么实现这种效果呢? 1. 使用触发器(多体攻击)方便调试,可视化(推荐)2. 运用点乘和叉乘,判断敌人的角度和位置(单,多)一般3. 使用Physics的Physics.OverlapSpher…

mfc cimage加载显示图片_在微信小程序里实现图片预加载组件

网页中的图片预加载我们知道在 Web 页面中实现图片的预加载其实很简单,通常的做法是在 JS 中使用 Image 对象即可,代码大致如下var image new Image() image.onload function() {console.log(图片加载完成) } image.src"//misc.360buyimg.com/lib…

HDU 2242 双连通分量 考研路茫茫——空调教室

思路就是求边双连通分量&#xff0c;然后缩点&#xff0c;再用树形DP搞一下。 代码和求强连通很类似&#xff0c;有点神奇&#xff0c;_&#xff0c;慢慢消化吧 1 #include <cstdio>2 #include <cstring>3 #include <algorithm>4 #include <vector>5 #…

java注册中心nacos_spring-cloud整合nacos做注册中心

前面讲了spring-cloud整合nacos做配置中心&#xff0c;这节讲一下nacos做注册中心至于注册中心是什么&#xff0c;我就不讲了&#xff0c;不了解的可以去问度娘下面我就直接开始了&#xff0c;也是比较简单的&#xff1a;1.引入依赖1.8Greenwich.SR12.1.0.RELEASEorg.springfra…

Android基于mAppWidget实现手绘地图(二)--概要

离线地图是一张被切成类似瓷砖般格子图像组成&#xff0c;这些被切开的格子组织成多个缩放级别。缩放级别是从0开始。0这个缩放级别&#xff0c;地图图像的尺寸为1*1像素。在每下一个缩放级别&#xff0c;图像尺寸则会两倍递增。 每个地图都是有层和地图对象的。 层是一个抽象的…

java实体字节属性定义_Java字节码方法表与属性表详解

而这些字节其实对应的信息是它&#xff1a;所以问题就来了&#xff0c;aload_0不是助记符信息么&#xff0c;怎么就能够跟字节码文件中的字节对应上呢&#xff1f;所谓助记符其实也就是帮忙我们去记忆的符合&#xff0c;在底层其实也是对应的一个个十六进制的数字的&#xff0c…

允许使用抽象类类型 isearchboxinfo 的对象_此对象非彼对象(面向对象)3

java13面向对象深入3大纲这里没有写面向对象-封装性理解封装( encapsulation)怎么去理解&#xff0c;一台电脑利用一个外壳包裹&#xff0c;保护了里面的电器元件&#xff0c;提供了少量的按键与其对接使用。我要看电视&#xff0c;只需要按一下开关和换台就可以了。有必要了解…

复制url直接能跳过验证_python 爬虫如何突破登录验证

我用 python 做爬虫爬过不少数据&#xff0c;比如在 google play 爬应用信息&#xff1b;在 instragram, 500px 爬图片&#xff1b;当然爬虫的作用不止于此&#xff0c;比如定时去某个网站签到&#xff0c;妈妈再也不用担心我忘记签到了这些网站支持游客访问&#xff0c;但要访…

[2-sat]HDOJ3062 Party

中文题 题意略 学2-sat啦啦啦 2-sat就是 矛盾的 ($x、x’$不能同时取) m对人 相互也有限制条件 取出其中n个人 也有可能是把一件东西分成 取/不取 相矛盾的两种情况 (那就要拆点啦~) 取其中n件 做法是 暴力 和 强连通 两种 重点在于建图&#xff1a; 对于x&#xff0c;记 取…

Winodws live writer

发布一篇试试。 转载于:https://www.cnblogs.com/DotNetCSharp/p/4742956.html

java里面value_「Java基础知识」Java中包含哪些运算符

原标题&#xff1a;「Java基础知识」Java中包含哪些运算符在Java中包含的运算符有&#xff1a;算数运算符&#xff0c;逻辑运算符&#xff0c;关系运算符等。算数运算符也就是我们平时的加减乘除余等操作&#xff1a;在Java中都是将右边的值赋值给左边&#xff0c;所以一般格式…

idea maven创建java项目_新版本IntelliJ IDEA 构建maven,并用Maven创建一个web项目(图文教程)...

之前都没试过用maven来管理过项目&#xff0c;但是手动找包导包确实不方便&#xff0c;于是今天用2016版的IDEA进行了maven的初尝试。打开IDEA&#xff0c;创建新项目&#xff1a;然后选择Maven&#xff0c;以及选择自己电脑的jdk&#xff1a;接下来自定义GroupId以及ArtifactI…

servlet 返回可访问文件_JavaWeb技术(4):Servlet的理解(上)

我们在开发中无时无刻都在与Servlet进行接触&#xff0c;只是因为框架的封装性&#xff0c;我们很少直接地去操作servlet&#xff0c;但再怎么封装&#xff0c;基本的思路都不会变化&#xff0c;变得只是实现的方式&#xff0c;Servlet是什么&#xff1a;网上的回答基本是Servl…

如何设置打印的时候不加上页面链接_excel表格的这10个打印小技巧,办公室财务人员记得收藏...

打印工作表是日常工作中最常见的一个工作&#xff0c;也是Excel在工作中最常用的一个地方&#xff0c;如何做到快速准确地打印文件呢。今天文理会计小编给大家从网上整理了几个打印文件的小技巧。1、打印标题打印的工作表的数据有好多页的时候&#xff0c;为了查看方便&#xf…

rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问

作者&#xff1a;mousycodersegmentfault.com/a/1190000021054802消息队列连环炮项目里怎么样使用 MQ 的&#xff1f;为什么要使用消息队列&#xff1f;消息队列有什么优点和缺点&#xff1f;kafka,activemq,rabbitmq,rocketmq 都有什么去呗&#xff1f;如何保证消息队列高可用…

python 定义变量_第三章(第2节):变量和常量

变量的概念基本上和初中代数的方程变量是一致的&#xff0c;只是在计算机程序中&#xff0c;变量不仅可以是数字&#xff0c;还可以是任意数据类型&#xff0c;比如我们上节课刚刚学过的基本数据类型或者我们后面要学的自定义数据类型。所谓常量就是不能改变的变量&#xff0c;…

pytorch卷积神经网络_资源|卷积神经网络迁移学习pytorch实战推荐

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达一、资源简介这次给大家推荐一篇关于卷积神经网络迁移学习的实战资料&#xff0c;卷积神经网络迁移学习简单的讲就是将一个在数据集上训练好的卷积神经网络模型通过简单的调整快速移…

php 删除服务器上的文件,php如何删除服务器文件

在php中可以使用“ftp_delete”函数删除服务器文件&#xff0c;其语法是“ftp_delete(ftp_connection,file)”&#xff0c;参数“ftp_connection”表示要使用的FTP连接&#xff0c;参数“file”表示要删除的文件的路径。推荐&#xff1a;《PHP视频教程》PHP ftp_delete() 函数定…

java class load 类加载

1:what is it jvm把描述类的数据从class字节码文件加载到内存&#xff0c;并对数据进行校验、解析、初始化&#xff0c;最终成为jvm直接使用的数据类型 1、ClassNotFoundExcetpion   我们在开发中&#xff0c;经常可以遇见java.lang.ClassNotFoundExcetpion这个异常&#xf…