李宏毅机器学习(2021)学习笔记 03

本文是李宏毅《机器学习2021》课程的第三部分学习笔记,主要探讨如何根据模型在训练集上的表现选择最佳模型。内容涉及过拟合、优化不足(model bias)和识别这些问题的方法。介绍了训练集损失函数大时可能是model bias或optimization问题,以及训练集损失函数小时可能出现的过拟合或mismatch问题。过拟合的解决方法包括增加数据和限制模型,如数据增强、正则化等。

前言

这篇文章是李宏毅老师《机器学习2021》第3期视频(链接在这里(需要翻墙))的学习笔记。

正文

这期视频讲的是如何完成课堂作业,取得更高的分数。但实质上,本期视频介绍的是如何在给定数据上,选择最好的模型,并且介绍了过拟合优化不足model bias的表现、识别和解决方法,因此非常值得学习。

具体来说,本期视频教的是如何根据模型(们)的结果,对模型(们)进行优化和选择,以及如何识别一些可能存在的障碍。讲述了如何利用模型在训练集和测试集上的表现,判断模型出现的问题,并介绍了可能存在的问题及解决方案。

补充说明一点,由于本期视频形式上是对做作业进行教学,因此必须先介绍这门课的作业是什么形式,否则接下来的内容

本文剩余部分结构如下:

  1. 作业说明
  2. 在训练集上的损失函数大
  3. 在训练集上的损失函数小

作业说明

这门课的作业是给你一个给定的数据集(不允许自己找数据),进行预测,数据分成三部分:训练集、public测试集和private测试集。之所以要把测试集分成两部分,是为了防止有人在测试集上一直测试结果,选取最好的模型上传,这样可能会有随机因素,而非模型更好。因此,学生只能看自己在public测试集上的分数,只有当作业提交结束后才能看见在private测试集上的分数。

每次作业,助教会给出一份代码,这个代码跑出来就可以得到一个基本的分数。分数评级分成三级,在private测试集上的损失函数越小,则最后的分数越高。因此,学生实际上要做的是改进或更换助教的模型,从而提高分数

这也算是某种意义上的背景知识了hhh,有了这些之后,才能更好地理解接下来的调优步骤。正因为学生一开始就有一个基础的模型,调优的第一步才是看训练集上的损失函数。

在训练集上的损失函数大

对于一个跑通了的模型,我们要做的第一件事不是看测试集上的分数(事实上李宏毅老师认为测试集上的分数看都不要看,原因后面会提到),而是看训练集上的分数

如果一个模型在训练集上的损失函数就很大(或者说比其他模型大),那么说明这个模型“学习”就没学好,可能的原因有两个:

  1. model bias
  2. optimization不好

接下来分别介绍这两个问题是什么和怎么做。

model bias

这个问题在第二期视频其实就有提到过,说白了,就是模型太简单了。比如如果我们取二次函数上的几个点,用线性模型拟合这些点,学习的效果显然不会好。

对于这种问题,我们能做的就是重新设计模型。考虑到这门课里的模型大部分都是神经网络(不考虑那些基础的模型如linear、SVM等),其实要做的就是两件事:增加特征、增加层数或神经元

关于这种问题,李宏毅老师又一个很好的比喻:在大海里捞针,但是针不在大海里…

optimization 不好

其实第一期视频也提到过(但我的学习笔记里好像没有写hhh)。所谓optimization不好,就是没有找到最好的参数组合

拿梯度下降算法举例。第一期提到过,当梯度为0的时候,我们会停止算法,图形上就是当这一点是“平的”,如下图中,最高的点是绿色的点,但是如果我们使用梯度下降算法,在红色的局部最高点,我们就会停下来不再继续优化。
在这里插入图片描述
李宏毅老师举了一个经典论文中的例子。在一个学习任务中,作者发现56层的神经网络,在训练集和测试集上的表现都不如20层的网络。可能有些对深度学习有所了解的朋友会认为,这是过拟合了,层数太多导致效果反而不好,但其实这不是过拟合。过拟合是什么,有什么区别,我们会在后面介绍。这里稍微提一点,过拟合应该是训练的时候表现很好,测试的时候表现不行,而这里是训练和测试表现都不好。

那么为什么56层的神经网络会不如20层的神经网络呢?显然并不是因为层数太多导致模型本身不好(虽然很多人也包括我会经常嘲讽越叠层数越多的神经网络hhh)。可以这样想,对于56层的神经网络,只要前二十层和20层的神经网络参数一样,后36层什么都不做,效果至少也会和20层的一样好。因此,真正的问题在于,层数太多参数太多的情况下,简单的优化算法并没有找到一个好的参数组合

至于这种情况如何解决,这是下一期视频的内容。

同样地这种问题也有一个比喻,针在大海里,但是并没有捞到…

如何分辨?

在介绍如何分辨model bias和optimization问题之前,我们总结一下这两种问题。

model bias是模型太过简单,难以拟合复杂的真实世界。其解决办法是,增加更多的特征或增加更多层数和神经元。optimization问题则是优化算法没有找到最好的参数组合,解决办法这期视频并不讨论。

那么如何分辨这两种问题呢?李宏毅老师给出的办法是:比较。即将模型和比他更简单的模型做对比,如果模型的效果比简单的好,那么问题可能是model bias,反之则是optimization不好。

更具体的建议是,训练模型时,先做一个最基础的模型(如linear或svm等),然后再加上ReLu等激活函数改造。

在训练集上的损失函数小

如果模型在训练集上的损失函数很小,那么说明模型“已经捞到针”了。不管他在测试集上表现如何,他已经做到了在训练集上找到最优(或比较好)的参数,使得损失函数较小。这意味着并不存在model bias问题(模型本身能够很好的拟合所有的训练数据)和optimization问题(找到了比较好的参数组合)。

这时,应该将模型放在测试集上验证,如果在测试集上损失函数仍然很小,那么恭喜你,任务结束了!如果模型在测试集上损失函数较大(明显大于训练集上),说明模型有可能出现了过拟合mismatch问题。

过拟合

什么是过拟合

先说过拟合问题,这应该是所有接触过神经网络的人都或多或少有所了解的名词。通俗地讲,过拟合问题就是模型学习能力太强,导致自己“完全变成了训练集的形状”。

这里要先引入弹性(flexibility)这个概念。具体是什么意思李宏毅老师说留待下次再说,但通俗地说就是模型拥有更多可能。形式上看,模型可能拥有很多层或很多特征。

弹性过强说明模型很强,这应该是一件好事,但其实并非弹性越强模型就越强,有时候还要给模型加上一些限制,来让他的弹性不要那么强,比如大名鼎鼎的CNN便是如此(具体的没说hhh)。

那么模型究竟为什么会出现过拟合问题呢,这里举两个例子。

第一个例子,假设有一个废物模型,他“应付工作”的形式是,在预测测试集时,对于训练集上已有的数据(即测试集的这个数据在训练集里也有),就直接把训练集上的结果输出,如果没有,那么就随机数出一个。形式如下(不想打了直接截个图):
在这里插入图片描述
那么对于这个废物模型(很像期末周突击背重点的我hhh重点里没有的只能蒙),他在训练集上的结果非常好,损失一定是0!因为训练集上的数据,当然都在训练集里能找到对应的输出。但是在测试集上,他的表现会很差,因为完全是随机生成的。

虽然这个废物模型很极端,但是过拟合问题某种程度上,就是尽全力拟合到了每一个训练数据,但是从而也变成了一种奇怪的模型(其实我觉得可能是因为训练数据本身也有随机成分在,加上数据本身特征也不可能完全提取出来,当然了李宏毅老师没有深究这些,我也不懂,就只在表象上学学就好了,为的是能解决问题)。

第二个例子更加具体,假设我们在二次函数曲线上随机取三点,然后使用一个非常强、弹性非常大的模型,那么他可能会完美覆盖这三点,但是在这三点之外的地方自由发挥,从而导致他在训练集上效果很好,但是在测试集上效果很差,如图:
在这里插入图片描述

过拟合的解决办法

那么怎么解决过拟合问题呢?从上面的例子(尤其是第二个),我们可以看出两种思路。

第一条思路,数据不足。

我们提到过,过拟合是这个非常强的模型,在没有训练数据的地方自由发挥产生的。那么如果有更多的训练数据,让他自由发挥的空间越来越小,过拟合问题就会降低。

为了解决数据不足,我们可以使用两种办法:

  1. 增加训练数据(在作业中不使用)。
  2. 数据增强(如图像识别问题,我们可以将图像旋转、翻转,创造更多数据)。但是这种方法需要你对真实的数据有足够的了解。(比如完全把图片倒过来,可能就没有意义,因此一般不会把180度旋转)
第二条思路,限制模型

同样地,由于过拟合问题是由模型自由发挥产生的,那么如果我们对他加以限制,可能效果会更好。

例如,对于第二个例子,如果把模型限制成二次函数的形式,那么可能就能找到真正的那条曲线(初中生就能找到了)。

这种限制,同样需要你对问题有足够多的理解。例如,经济学家知道消费和收入一般是线性关系,那么他就可以把模型设置成线性的模式。

具体限制的方法主要有:

  1. 减少神经元,共用参数(见日后课程)
  2. 减少特征
  3. early stopping
  4. regulaization
  5. dropout

后三种方法以后会介绍。

矛盾与权衡:如何选择模型

其实第二种思路中存在一个很明显的矛盾。一开始我们就举过例子,可能线性函数无法拟合二次曲线,这会产生model bias,但是在刚刚我们又说如果把模型限制成线性的,可能效果会很好。

这就是bias- flexibility trade-off。到底应该把模型限制到什么地步?

直觉做法

一种直觉做法是,我跑若干个不同弹性的模型,然后全都上传到测试数据(注意是public test),看谁表现最好。

这种方法的问题在于随机性。仍然考虑那个极端的废物模型,如果我们生成了10000个废物模型并上传,那么显然总会有一个模型的参数运气比较好,测试的结果比较好。但是这个模型在private test上的效果仍然会很差。

同样地,模型的训练也有随机性,只要训练的次数多,可能烂模型的效果反而比好模型要好,但这并不是我们想要的,因为他在private test上的效果不一定更好。

Cross Validation

更好的做法是,我们将训练数据分成train和validation两部分,用train来训练模型,用validation来做测试,然后选择validation上最好的模型上传。即可能忽略public test。

N-fold Cross Validation

如果你觉得随机生成一份Validation可能不好,那么你可以把train分成N份,然后其中N-1份用来训练,剩下一份用来Validation,然后每一份数据都做一次Validation,训练N次,这样就会得到N个Validation的结果,取平均值。

mismatch

除了过拟合问题,还有一种可能导致模型在训练数据上损失函数很小,但测试时误差很大,这就是mismatch问题。

mismatch问题其实指的是训练数据和测试数据的分布不一致。有些人说这也可以算作过拟合问题,当然这只是定义上的区别,但是之所以把二者分开主要是为了强调,mismatch的解决方案不一样。

如果训练数据和测试数据分布不同,那么就不能通过增加训练数据的方式来解决问题。比如用图像识别训练数据用真实照片,却用来识别动漫图片,那再多的照片可能也学不会识别动漫图片…

这种问题的解决以后再说。

总结

这期视频讲解了一些模型训练中常见到的问题及解决方案,重点包括:model bias、optimization、过拟合的概念原因解决、模型的选择以及mismatch问题。

对于一个模型,如果其在训练数据上的损失函数很大,则说明其可能存在model biasoptimization问题,前者由于模型太简单,可以通过增加神经元、特征或神经网络层数解决;后者则是由于优化算法不够好。二者分辨的方法是比较不同复杂程度的模型,如果复杂模型效果在训练数据上反而效果更差,则是optimization,反之就说明简单模型有model bias问题。注意,optimization是复杂模型在训练测试数据上效果都不好,不要和过拟合弄混了。

如果其在训练数据上的损失函数很小,但在测试数据上的损失很大,则可能存在过拟合mismatch问题过拟合问题是由于模型弹性太强,导致在训练数据之外的地方过度自由发挥,从而在测试数据上表现不佳,可以通过增加训练数据、数据增强和限制模型的方式解决。至于把模型限制到哪一步,如何权衡取舍,可以使用Validation的方法进行比较选择。而mismatch问题则是由于训练数据和测试数据分布不同,不能通过增加训练数据的数量解决,解决方法以后会说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值