理解过拟合

导言 在进行有监督的机器学习建模时,一般假设数据独立同分布(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可能是相同的,也可能是不同的,为了表示我们拟合的好坏,就用一个函数来度量拟合的程度,比如平方损失:

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

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

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

过拟合和欠拟合

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

图1 欠拟合

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

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

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

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

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

下图是过拟合的示意图:

图2 过拟合

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

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

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

训练集上的表现测试集上的表现结论

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

方差与偏差

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

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

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

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

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

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

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

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

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

正则化

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

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

剪枝

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

数据增广

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

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

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

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

Dropout

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

Early Stopping

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

集成学习

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

原创声明:本文为SIGAI 原创文章,仅供个人学习使用,未经允许,不得转载,不能用于商业目的。

推荐阅读

[1]  机器学习-波澜壮阔40年SIGAI2018.4.13.

[2]  学好机器学习需要哪些数学知识?SIGAI2018.4.17.

[3]  人脸识别算法演化史SIGAI2018.4.20.

[4]  基于深度学习的目标检测算法综述SIGAI2018.4.24.

[5]  卷积神经网络为什么能够称霸计算机视觉领域?SIGAI2018.4.26.

[6] 用一张图理解SVM的脉络 SIGAI2018.4.28.

[7] 人脸检测算法综述SIGAI2018.5.3.

[8] 理解神经网络的激活函数SIGAI2018.5.5.

[9] 深度卷积神经网络演化历史及结构改进脉络-40页长文全面解读SIGAI       2018.5.8.

[10] 理解梯度下降法SIGAI2018.5.11

[11] 循环神经网络综述—语音识别与自然语言处理的利器SIGAI 2018.5.15

[12] 理解凸优化SIGAI2018.5.18

[13]【实验】理解SVM的核函数和参数SIGAI 2018.5.22

[14]【SIGAI综述】 行人检测算法 SIGAI

2018.5.25

[15] 机器学习在自动驾驶中的应用—以百度阿波罗平台为例(上)SIGAI 2018.5.29

[16] 理解牛顿法SIGAI2018.5.31

[17] 【群话题精华】5月集锦—机器学习和深度学习中一些值得思考的问题 SIGAI 2018.6.1

[18] 大话Adaboost算法SIGAI 2018.6.1

[19] FlowNet到FlowNet2.0:基于卷积神经网络的光流预测算法SIGAI 2018.6.4

[20] 理解主成分分析法(PCA)SIGAI 2018.6.6

[21]  人体骨骼关键点检测SIGAI 2018.6.8

[22] 理解决策树SIGAI 2018.6.11

[23] 用一句话总结各种机器学习算法SIGAI 2018.6.13

[24] 目标检测算法之YOLOSIGAI 2018.6.15

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏新智元

【重磅】计算机视觉和 CNN 发展十一座里程碑(附论文下载)

【新智元导读】从AlexNet到ResNet,计算机视觉领域和卷积神经网络(CNN)每一次发展,都伴随着代表性架构取得历史性的成绩。作者回顾计算机视觉和CNN过...

3734
来自专栏机器之心

学界 | 深度神经网络为什么不易过拟合?傅里叶分析发现固有频谱偏差

众所周知,过参数化的深度神经网络(DNN)是一类表达能力极强的函数,它们甚至可以以 100% 的训练准确率记住随机数据。这种现象就提出了一个问题:为什么它们不会...

641
来自专栏PPV课数据科学社区

机器学习算法比较

本文主要回顾下几个常用算法的适应场景及其优缺点!(提示:部分内容摘自网络)。 机器学习算法太多了,分类、回归、聚类、推荐、图像识别领域等等,要想找到一个合适算法...

2869
来自专栏智能算法

长文干货!走近人脸检测:从 VJ 到深度学习(上)

本文分上下两篇,上篇主要介绍人脸检测的基本流程,以及传统的VJ人脸检测器及其改进,下篇介绍基于深度网络的检测器,以及对目前人脸检测技术发展的思考与讨论。为了节省...

3506
来自专栏CVer

CS229 机器学习速查表

本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载

1451
来自专栏人工智能LeadAI

R-CNN 物体检测第一弹

今天,重读了 R-CNN 的 TPAMI 版本,感觉受益颇多。该版相比之前的会议版,在检测流程和实现细节上表述得更为清晰。此外,因为是改投 TPAMI 的关系,...

4276
来自专栏大数据挖掘DT机器学习

SIFT特征提取分析(附源码)

SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest poin...

4445
来自专栏鸿的学习笔记

精确控制数据模型误差(下)

有各种各样的方法试图衡量候选模型和真实模型之间有多少信息丢失的模型误差。当然,真正的模型(实际用于生成数据)是未知的,但是给定某些假设,我们仍然可以获得它与我们...

701
来自专栏机器之心

干货 | 物体检测算法全概述:从传统检测方法到深度神经网络框架

机器之心转载 公众号:阅面科技(ID:readsense) 作者:童志军 物体检测一向是比较热门的研究方向,它经历了传统的人工设计特征+浅层分类器的框架,到基于...

4157
来自专栏SIGAI学习与实践平台

理解过拟合

在进行有监督的机器学习建模时,一般假设数据独立同分布(i.i.d,independently and identically distributed)。即样本数...

1011

扫码关注云+社区