文章目录
前言
这篇文章是李宏毅老师《机器学习2021》第3期视频(链接在这里(需要翻墙))的学习笔记。
正文
这期视频讲的是如何完成课堂作业,取得更高的分数。但实质上,本期视频介绍的是如何在给定数据上,选择最好的模型,并且介绍了过拟合、优化不足和model bias的表现、识别和解决方法,因此非常值得学习。
具体来说,本期视频教的是如何根据模型(们)的结果,对模型(们)进行优化和选择,以及如何识别一些可能存在的障碍。讲述了如何利用模型在训练集和测试集上的表现,判断模型出现的问题,并介绍了可能存在的问题及解决方案。
补充说明一点,由于本期视频形式上是对做作业进行教学,因此必须先介绍这门课的作业是什么形式,否则接下来的内容
本文剩余部分结构如下:
- 作业说明
- 在训练集上的损失函数大
- 在训练集上的损失函数小
作业说明
这门课的作业是给你一个给定的数据集(不允许自己找数据),进行预测,数据分成三部分:训练集、public测试集和private测试集。之所以要把测试集分成两部分,是为了防止有人在测试集上一直测试结果,选取最好的模型上传,这样可能会有随机因素,而非模型更好。因此,学生只能看自己在public测试集上的分数,只有当作业提交结束后才能看见在private测试集上的分数。
每次作业,助教会给出一份代码,这个代码跑出来就可以得到一个基本的分数。分数评级分成三级,在private测试集上的损失函数越小,则最后的分数越高。因此,学生实际上要做的是改进或更换助教的模型,从而提高分数。
这也算是某种意义上的背景知识了hhh,有了这些之后,才能更好地理解接下来的调优步骤。正因为学生一开始就有一个基础的模型,调优的第一步才是看训练集上的损失函数。
在训练集上的损失函数大
对于一个跑通了的模型,我们要做的第一件事不是看测试集上的分数(事实上李宏毅老师认为测试集上的分数看都不要看,原因后面会提到),而是看训练集上的分数。
如果一个模型在训练集上的损失函数就很大(或者说比其他模型大),那么说明这个模型“学习”就没学好,可能的原因有两个:
- model bias
- 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!因为训练集上的数据,当然都在训练集里能找到对应的输出。但是在测试集上,他的表现会很差,因为完全是随机生成的。
虽然这个废物模型很极端,但是过拟合问题某种程度上,就是尽全力拟合到了每一个训练数据,但是从而也变成了一种奇怪的模型(其实我觉得可能是因为训练数据本身也有随机成分在,加上数据本身特征也不可能完全提取出来,当然了李宏毅老师没有深究这些,我也不懂,就只在表象上学学就好了,为的是能解决问题)。
第二个例子更加具体,假设我们在二次函数曲线上随机取三点,然后使用一个非常强、弹性非常大的模型,那么他可能会完美覆盖这三点,但是在这三点之外的地方自由发挥,从而导致他在训练集上效果很好,但是在测试集上效果很差,如图:

过拟合的解决办法
那么怎么解决过拟合问题呢?从上面的例子(尤其是第二个),我们可以看出两种思路。
第一条思路,数据不足。
我们提到过,过拟合是这个非常强的模型,在没有训练数据的地方自由发挥产生的。那么如果有更多的训练数据,让他自由发挥的空间越来越小,过拟合问题就会降低。
为了解决数据不足,我们可以使用两种办法:
- 增加训练数据(在作业中不使用)。
- 数据增强(如图像识别问题,我们可以将图像旋转、翻转,创造更多数据)。但是这种方法需要你对真实的数据有足够的了解。(比如完全把图片倒过来,可能就没有意义,因此一般不会把180度旋转)
第二条思路,限制模型
同样地,由于过拟合问题是由模型自由发挥产生的,那么如果我们对他加以限制,可能效果会更好。
例如,对于第二个例子,如果把模型限制成二次函数的形式,那么可能就能找到真正的那条曲线(初中生就能找到了)。
这种限制,同样需要你对问题有足够多的理解。例如,经济学家知道消费和收入一般是线性关系,那么他就可以把模型设置成线性的模式。
具体限制的方法主要有:
- 减少神经元,共用参数(见日后课程)
- 减少特征
- early stopping
- regulaization
- 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 bias或optimization问题,前者由于模型太简单,可以通过增加神经元、特征或神经网络层数解决;后者则是由于优化算法不够好。二者分辨的方法是比较不同复杂程度的模型,如果复杂模型效果在训练数据上反而效果更差,则是optimization,反之就说明简单模型有model bias问题。注意,optimization是复杂模型在训练和测试数据上效果都不好,不要和过拟合弄混了。
如果其在训练数据上的损失函数很小,但在测试数据上的损失很大,则可能存在过拟合或mismatch问题。过拟合问题是由于模型弹性太强,导致在训练数据之外的地方过度自由发挥,从而在测试数据上表现不佳,可以通过增加训练数据、数据增强和限制模型的方式解决。至于把模型限制到哪一步,如何权衡取舍,可以使用Validation的方法进行比较选择。而mismatch问题则是由于训练数据和测试数据分布不同,不能通过增加训练数据的数量解决,解决方法以后会说。
本文是李宏毅《机器学习2021》课程的第三部分学习笔记,主要探讨如何根据模型在训练集上的表现选择最佳模型。内容涉及过拟合、优化不足(model bias)和识别这些问题的方法。介绍了训练集损失函数大时可能是model bias或optimization问题,以及训练集损失函数小时可能出现的过拟合或mismatch问题。过拟合的解决方法包括增加数据和限制模型,如数据增强、正则化等。
学习笔记 03&spm=1001.2101.3001.5002&articleId=128147774&d=1&t=3&u=4daf216fd41e487a86277e00fd3a7aa8)
5003

被折叠的 条评论
为什么被折叠?



