Datawhale X 李宏毅苹果书 AI夏令营 ————损失过大的进一步全面分析与优化

学习链接:Datawhale

    在前面两篇学习笔记中,我们学习了基本的线性模型、优化(梯度下降)以及采用激活函数和深度学习等方法来优化模型,有了这么多方法,如果在kaggle上测试结果不太好,到底是因为哪方面的原因?本篇笔记主要就此问题展开讨论。

通常训练结果不理想的原因主要有下面几种,我们将分布讨论。

模型偏差

正如我们在task2中学到的,如果一个模型传入的参数过小,这个模型损失肯定要比更为复杂的模型所得损失要大,那么测试结果不太好当然有可能是模型灵活性不够的问题,我们可能可以通过重新设置一个模型,给模型更大的灵活性,或者我们使用深度学习,也可以给模型更大的灵活性。可实际上,损失过大的原因并不一定是因为模型的灵活性不够,也有可能是优化做的不好。

优化问题

我们在前两个task中学到的优化算法主要就是梯度下降,这里就拿梯度下降来说,梯度下降肯定有可能会遇到局部最小值问题,这时候其实不是我们的模型做的不够好,模型已经涵盖了最优答案,但是梯度下降算法由于局部最小值问题是无法计算出最优解的,也就是优化问题

那么问题来了:如果我们在kaggle或者其他平台上训练效果不好,如何判断是由于模型偏差问题还是优化做的不好呢?

分析问题的方法

    李宏毅教授在课上引用了一个残差网络论文"Deep Residual Learning for Image Recognition"中的  一个例子。这篇论文在测试集上测试了两个网络,一个网络有20层,一个网络有56层,同时给出了一张图来表示迭代次数和测试误差之间的关系。

    从图中我们可以看到,明明56层的模型有着更深的学习深度,也就意味着更大的灵活性,但是56层的模型无论是测试误差还是训练误差都要比20层的模型要来的大。可能一些人看到这里会觉得是过拟合的原因,但是过拟合一般是表现为测试误差很小而实际误差很大,过拟合也会放在文章后面讲解。所以这里不是过拟合的问题,就是因为虽然56层的模型已经有了足够的灵活性,但是优化还不给力,导致误差不减反增。

    解决问题的方法是我们可以先尝试一些比较小的、比较浅的网络,或者用一些不是深度学习的方法比如单纯的线性模型、支持向量机(Support Vector Machine SVM)。SVM是比较容易做优化的,比较不会有优化失败的问题,支持向量机会放在后续的笔记说明,也可以自行搜索了解。然后我们再使用一个比较深的模型,如果灵活性更大的模型反而没有办法比浅的模型有更小的损失就代表着梯度下降不给力,这就需要我们对梯度下降进行进一步优化或者用更好的方法来优化。

过拟合

  我们在训练过程中也有可能出现这样的问题,不同于上面案例中训练数据和测试数据中模型都有着较大的偏差,有时可能会出现模型在训练数据上表现很好,但是在实际测试数据中偏差突然变得很大,这可能就真的是过拟合问题了。

  首先分析这种情况是如何产生的,假设我们的训练数据是在一个真实数据分布中的采样所得,然后我们有这样一个模型:他的灵活性很大,所以可以拟合出各式各样的函数,这个函数很复杂变化很大,通过足够的参数,使得函数在训练数据上损失非常小,但正因为模型的灵活性太大,可能这个函数通过很复杂的变化达到训练数据很小的损失,可实际上真实数据分布和模型差的很远,这就是过拟合(如下图)。

那么如何解决过拟合?

    一个是可以通过增加训练集,更多的采样点当然也能让模型进行更好的训练来降低损失。实际上我们不会去找更多的测试集数据,这本就和我们用模型来得到答案的初衷相违背。但是我们可以使用数据增强(data augmentation)技术,比如模型的测试数据集是一堆图片,我们可以通过左右反转图片或者对图片进行裁剪等技术,通过已有的数据集来产生更多的训练数据,当然这种变化不能是随意的,比如把图片上下颠倒或者进行很奇怪的拉伸,所得到的图片本就不是我们想要的测试数据,再把它为给模型计算,得到结果可能也不会好。

    另一个方法是给模型一些限制,让模型不要有太大的灵活性,比如对于深度学习,本来每层有几千个神经元导致过拟合,我们就把每一层的神经元数量减少;或者让模型公用参数,让一些参数有一样的数值。全连接网络(fully-connected netword)其实是一个比较有灵活性的架构,而卷积神经网络(Convolutional Neural Network,CNN)是一个比较有限制的架构。卷积神经网络的灵活性要比全连接网络差,但他可以避免很多的过拟合问题,CNN所找出来的函数,其实是包含在全连接网络中的,但就是因为CNN给了模型更大的限制,他在图像的方面反而表现会更为出色。

  同时我们还有别的方法比如早停(early stopping)正则化(regularization)丢弃法(dropout method)等方法避免过拟合。

交叉验证

    k折交叉验证就是把训练数据分成k等份,然后我们每一份中,都拿出一些数据当训练集,一部分数据当验证集,每一份中训练数据和验证数据的位置是不同的,这样可以保证随机性。

  然后我们把不同的几个模型在这三个设置下把训练和验证的数据集上面都跑一遍,再把结果平均,看看谁的结果最好。比如我们现在是把训练集分成三份测试,然后得出模型1的平均结果最好,那么我们就说在3折交叉验证下,模型1最好。

不匹配

   并不是什么时候我们都能通过上面几种方法来达到缩小拟合情况的,有时会出现这样的结果:一个预测电视台某个频道观看人数的模型预测在二月二十六这天频道观看人数是一个很高的值,可实际上一定不是——这天是春节。春节这种特殊情况是不不能通过增加模型灵活性或者是优化来完成的。我们把这种训练集再增加也没有帮助的训练姐和测试及的分布不同的情况称为不匹配,这种问题要怎么解决要看对数据本身的理解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值