首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >理解过拟合

理解过拟合

作者头像
SIGAI学习与实践平台
发布2018-08-07 11:21:52
5410
发布2018-08-07 11:21:52
举报

SIGAI-AI学习交流群的目标是为学习者提供一个AI技术交流与分享的平台

导言

在进行有监督的机器学习建模时,一般假设数据独立同分布(i.i.d,independently and identically distributed)。即样本数据根据通过一个概率分布采样得到,而且这些样本相互之间独立。我们使用历史数据集去训练模型,使得损失函数最小化,然后用训练得到的模型去预测未知数据。如果一味追求让损失函数达到最小,模型就会面临过拟合问题,导致预测未知数据的效果变差。如何判断自己的模型是否训练正常?怎么解决过拟合问题?大家先来听听我朋友小明的故事。

小明的故事

小明是个机器学习爱好者,他很喜欢吃蛋糕。有一天他突然想到:能不能用蛋糕的直径来预测蛋糕的价格。于是他定了各种不同尺寸的蛋糕,然后把尺寸和价格的数据记录起来,接着使用回归函数来拟合这些训练数据。小明决定使用四次多项式:

和均方差损失函数:

在这里x是蛋糕的尺寸,f(x)是预测的蛋糕价格。四次多项式足够复杂,完全可以拟合这个问题;损失函数的含义是模型预测出的结果和真实值差的平方和求平均,预测越准确,损失函数就越小。接着小明使用随机梯度下降法更新参数。 他一直盯着损失函数的变化曲线,迭代若干次之后损失函数竟然到0了,小明异常兴奋,觉得自己训练出了最完美的模型。

接下来小明迫不及待的又定了几个尺寸的蛋糕,当作测试样本,来验证自己的模型准不准。结果发现测试集的损失函数不是0,而且很大。小明很是困惑。于是他去请教老师这是为什么,老师只说了一句话:把你之前的损失函数加上所有参数的平方和,再训练试试,效果也许会有改观。小明按照老师的意思训练新模型,但是这次之前的损失函数不能优化到0了,效果比之前差。小明心想,老师是不是在忽悠我?但奇怪的是,当他用新的模型去预测新蛋糕时,发现测试集损失函数真的更小了。他十分纳闷,再次去问老师,为什么我训练集的效果变差,预测的效果反而更好呢?

老师说:你一开始损失函数为0的情况叫做过拟合,训练集和测试集是有差异的,过分去拟合了训练集,放大了差异性,衰弱了共性,回归损失函数为0的情况说明你拟合了噪声,最后导致了效果差,换句话说拟合函数的过程中模型需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,但是损失函数附加了参数的平方和,导致整个算法不会让参数变的过大,使得拟合函数波动变小。这个参数的平方和就是一种正则化项,用来解决过拟合问题。损失函数加正则项,一般称为目标函数。小明若有所思,感觉自己认识还是太肤浅了,决定再去整理一下相关知识,下文就是他的笔记:

损失函数

损失函数(loss function)是用来度量模型预测值f(x)与样本真实标签值y的不一致程度。给定输入的样本数据x,模型函数输出一个f(x),这个输出的f(x)与样本的真实值标签值y可能是相同的,也可能是不同的,为了表示我们拟合的好坏,就用一个函数来度量拟合的程度,比如平方损失:

上式中

称为残差,整个式子就是样本的残差平方和,我们的目的是最小化此损失函数。在一些应用中通常会使用均方差(MSE)作为一项衡量标准。对于整个训练集来说,关于训练集的平均损失可以称作经验风险,即:

最小化损失函数,其实就是最小化经验风险,之所以叫经验风险,是因为这是对训练样本集的风险预估,及历史经验。

除了上面这种损失函数之外,还有交叉熵损失函数,对比损失函数,合页损失函数等类型,在这里我们不一一介绍,SIGAI后续的公众号文章中会对它们做全面系统的讲解。

损失函数是一个实值函数,它的值越小,表示模型在训练样本集上拟合地越好。是不是训练集损拟合的越好,模型的效果会更好呢? 答案是No。由于训练样本集和测试数据集是不一样的,在训练集上损失函数越小,并不代表测试集损失函数越小,我们希望模型在训练集上有高准确率的同时在测试集上也有高准确率。衡量这种能力的指标就是泛化能力,这时候不得不提过拟合和欠拟合的概念。

过拟合和欠拟合

欠拟合(under-fitting)也称为欠学习,它的直观表现是算法训练得到的模型在训练集上表现差,没有学到数据的规律。引起欠拟合的原因有:模型本身过于简单,例如数据本身是非线性的但使用了线性模型;特征数太少无法正确的建立统计关系。下图是欠拟合的示意图:

图1 欠拟合

上图中数据是线性不可分的,三角形和圆形这两类样本的分界线是曲线而非直线,但是使用了线性分类器,导致大量的样本被错分类,这时更好的选择是非线性分类器。

过拟合(over-fitting)也称为过学习,它的直观表现是算法在训练集上表现好,但在测试集上表现不好,泛化性能差。过拟合是在模型参数拟合过程中由于训练数据包含抽样误差,在训练时复杂的模型将抽样误差也进行了拟合导致的。所谓抽样误差,是指抽样得到的样本集和整体数据集之间的偏差。直观来看,引起过拟合的可能原因有:

模型本身过于复杂,以至于拟合了训练样本集中的噪声。此时需要选用更简单的模型,或者对模型进行裁剪。

训练样本太少或者缺乏代表性。此时需要增加样本数,或者增加样本的多样性。

训练样本噪声的干扰,导致模型拟合了这些噪声,这时需要剔除噪声数据或者改用对噪声不敏感的模型。

下图是过拟合的示意图:

图2 过拟合

在上图中训练样本存在噪声,为了照顾它们,分类曲线的形状非常复杂,导致在真实测试时会产生错分类。

过拟合是有监督的机器学习算法长期以来需要面临的一个问题。下表给出了实际应用时判断过拟合与欠拟合的准则:

表1 过拟合与欠拟合的判断标准

如果发生了过拟合,需要根据产生过拟合的原因有针对性的采取措施。

方差与偏差

我们也可以从偏差和方差来看待过拟合和欠拟合,模型的泛化误差来自于两部分,分别称为偏差和方差。偏差(bias)是模型本身导致的误差,即错误的模型假设所导致的误差,它是模型的预测值的数学期望和真实值之间的差距。假设样本特征向量为x,标签值为y,要拟合的目标函数为h(x),模型训练出来的函数为

,则偏差为:

根据上面的定义,高偏差意味着模型本身的输出值与期望值差距很大,因此会导致欠拟合问题。方差(variance)是由于对训练样本集的小波动敏感而导致的误差。它可以理解为模型预测值的变化范围,即模型预测值的波动程度。根据概率论中方差的定义,有:

根据定义,高方差意味着算法对训练样本集中的随机噪声进行建模,从而出现过拟合问题。模型的总体误差可以分解为偏差的平方与方差之和:

这称为偏差-方差 分解公式。如果模型过于简单,一般会有大的偏差和小的方差;反之如果模型复杂则会有大的方差但偏差很小。这是一对矛盾,因此我们需要在偏置和方差之间做一个折中。如果我一模型的复杂度作为横坐标,把方差和偏差的值作为纵坐标,可以得到下图所示的两条曲线。

图3 偏差方差与模型复杂度关系图

下面以一个简单的例子来形象的解释偏差和方差的概念。在打靶时,子弹飞出枪管之后以曲线轨迹飞行。

如果不考虑空气的阻力,这是一条标准的抛物线,如果考虑空气阻力,是一条更复杂的曲线。

我们用弹道曲线作为预测模型,在给定子弹初速度的前提下,如果知道靶心与枪口的距离,可以通过调整枪口的仰角来让子弹命中靶心。

如果使用抛物线函数就会产生偏差,因为理论上子弹的落点不会在靶心而是在靶心偏下的位置,此时需要更换弹道曲线模型。

无论选用哪种弹道曲线模型,受风速、枪口震动等因素的影响,即使瞄准的是靶心,子弹还是会随机散布在靶心周围,这就是方差。

正则化

有监督机器学习算法训练的目标是最小化误差函数。以均方误差损失函数为例,它是预测值与样本真实值的误差平方和:

其中yi是样本的标签值,

是预测函数的输出值,

是模型的参数。在预测函数的类型选定之后,我们能控制的就是函数的参数。为了防止过拟合,可以为损失函数加上一个惩罚项对复杂的模型进行惩罚,即强制让模型的参数值尽可能小,加入惩罚项之后损失函数为:

函数的后半部分称为正则化项,这里的目标是让它的值尽可能小,即参数等于0或者接近于0。

为惩罚项系数,是人工设定的大于0的参数。正则化项可以使用L2范数即平方和,也可以使用其他范数如L1范数,即绝对值之和。L2范数在求解最优化问题时计算简单,而且有更好的数学性质,二次函数的导数为:

绝对值函数在0点不可导,如果不考虑这种情况,其导数为符号函数sgn(x)。与L2相比L1正则化能更有效的让参数趋向于0,产生的结果更稀疏。

剪枝

剪枝是决策树类算法防止过拟合的方法。如果决策树的结构过于复杂,可能会导致过拟合问题,此时需要对树进行剪枝,消掉某些节点让它变得更简单。剪枝的关键问题是确定减掉哪些树节点以及减掉它们之后如何进行节点合并。决策树的剪枝算法可以分为两类,分别称为预剪枝和后剪枝。前者在树的训练过程中通过停止分裂对树的规模进行限制;后者先构造出一棵完整的树,然后通过某种规则消除掉部分节点,用叶子节点替代。

数据增广

数据增广是解决过拟合中思想比较朴素的方法。训练集越多,过拟合的概率越小,数据增广是一个比较方便有效屡试不爽的方法,但各类领域的增广方法都不同。

1、在计算机视觉领域中,增广的方式是对图像旋转,缩放,剪切,添加噪声等。

2、 在自然语言处理领域中,可以做同义词替换扩充数据集。

3、语音识别中可以对样本数据添加随机的噪声。

Dropout

Dropout是神经网络中防止过拟合的方法。dropout的做法是在训练时随机的选择一部分神经元进行正向传播和反向传播,另外一些神经元的参数值保持不变,以减轻过拟合。dropout机制使得每个神经元在训练时只用了样本集中的部分样本,这相当于对样本集进行采样,即bagging的做法。最终得到的是多个神经网络的组合。

Early Stopping

提前停止的策略是在验证集误差出现增大之后,提前结束训练;而不是一直等待验证集 误差达到最小。提前停止策略十分简单,执行效率高,但需要额外的空间备份参数。

集成学习

集成学习算法也可以有效的减轻过拟合。Bagging通过平均多个模型的结果,来降低模型的方差。Boosting不仅能够减小偏差,还能减小方差。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SigAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
语音识别
腾讯云语音识别(Automatic Speech Recognition,ASR)是将语音转化成文字的PaaS产品,为企业提供精准而极具性价比的识别服务。被微信、王者荣耀、腾讯视频等大量业务使用,适用于录音质检、会议实时转写、语音输入法等多个场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档