PRML系列:1.1 多项式函数拟合

前言

此系列关于Pattern Recognition and Machine Learning的总结,博文记录一些在阅读过程中遇到的难点和自己的感悟。话不多说,直接进入正题吧。

正文

第一章第一节的内容关于多项式函数的拟合,假设我们给出了一系列的坐标点(x,y)们,可能是某个函数生成的,比如: y=sin(2πx) ,如下图:

这里写图片描述

模式识别的目标是,根据给定的坐标点,去预测背后可能的假设(函数),即由蓝色点去预测绿色曲线 y=sin(2πx) 。后续的主题都围绕这个最基本的目标,但如何去预测呢?一个办法是通过假设一个函数 f(x,w) ,其中 w 是该函数的参数,然后让它去拟合图中每个蓝色点。

泰勒展开式告诉我们,任何函数都可以由任意M个多项式产生,所以可以用多项式和来进行拟合,于是有:

f(x,w)=w0+w1x+w2x2++wMxM=j=0Mwjxj

只要根据给定的点的集合(x, y)求出所有的 w 即可。于是我们定义误差函数,直观上可以理解为,当前参数w对数据的拟合程度,拟合程度越高(误差越小),那么它就有可能越接近真实的函数 y=sin(2πx) .

误差函数如下:

E(w)=12n=1N(f(xn,w)tn)2

tn 表示第n个样例的真实值,而 f(xn,w) 表示第n个样例的预测值。最小二乘法损失函数连续可微,在求导上有很好的性质,为了求得每个参数 wi ,我们可以对其求导 Ewi

求偏导的好处在于:对于每个参数 wi 而言,偏导为0,代表损失函数取得极值。在 E(w) 中,我们显然需要极小值,即损失越小,拟合程度越高。

于是对于M个参数,可以求得M个偏导,M个方程,自然能够求得一个解析解,我也很好奇为啥是解析解,自己推导了一波,发现对于第i个参数 wi ,都有形如:

λ1iw1+λ2iw2++λMiwm=ci

所以书中的一维多项式能够通过求偏导的方式得到全局唯一的最优解。

那是否意味着M越大越好?直观上来看,泰勒展开式如果M的值越大,那么对真实函数的近似能力越强,但在数据推得假设 f(x) 时,并不是如此。如书中所示:

这里写图片描述

需要指出的是,在这些由 y=sin(2πx) 函数生成的点中,还有个别点是噪声,所谓噪声可以理解为随机夹杂在数据集中的搅屎棍。它们的出现或多或少将影响分类器的学习性能。

从图中可以看出:M较小时,如M = 0,1时,函数的拟合程度很弱,当M = 9时,也出现了拟合程度较弱(why?)。这是很有趣的现象,机器学习界叫这现象为过拟合。我给个定义吧:由于函数的表达能力太强(模型复杂),它的表达能力远超真实数据所表现的这种“结构”,甚至把噪声的特性都学进来,从而离真实函数相差甚远。

产生的原因?
我很难从数学的角度去解释为什么M大,就会产生过拟合现象。但从直观上来看,可以这么理解,M的个数就好比一条长度为M的绳子,M越大,绳子越长(代表的是模型描述点的能力)。在一定的长度内,比如M = 3,为了让绳子尽可能符合大多数样本的规律,只能舍弃某些跳脱的很厉害的点(大多数这样的点为噪声)。而当M = 9时,因为绳子对于数据集而言太长了,它有这样的能力使得模型去符合每个点,自然就把噪声点给考虑进来了。

所以书中给出了一个很重要的结论:

We see that, for a given model complexity,
the over-fitting problem become less severe as the size of the data set increases.

如果所给的数据集越庞大(噪声比例降低!),同样的M = 9时,则不会出现过拟合现象。如下图所示:
这里写图片描述

所以本节提出了三种解决方案:
1. 增大数据集的量
2. 采用交叉验证的方法(机器学习中常用来避免过拟合)
3. 采用正则化方法来约束参数

第一种在前面已经提过了,就不再赘述了。交叉验证的思想是把所给数据集分成训练集和测试集,在训练集训练的模型,拿到测试集去测量误差,两者的误差都很小时,则认为假设模型离真实函数越接近。

测试误差函数为RMS: ERMS=2E(w)/N

其中N表示数据集中样例的个数,目的是为了归一化,因为训练集和测试集的个数常常不等,且 E(w) 没做归一化处理,所以在 ERMS 中做掉。其余的系数2和开根号是为了得到真实的“线性”的误差,貌似没啥特别作用,不加也可以。测试结果如下图所示:
这里写图片描述

可以看到M = 9在测试集上表现相当糟糕,在M 在3到8表现都不错,根据奥卡姆剃刀原则,可以选择简单模型M = 3作为最终的模型。

那么为什么采用交叉验证能够有效的解决模型过拟合问题呢?我的思考,仅供参考。

因为噪声的产生,越复杂的模型的学习能力越强,所以函数出现过拟合现象是因为学得了每个点的特性(包括噪声),在图中反映的就是该函数忽上忽下,所以测试集中稍微有一些偏移就能导致极大的偏差。从训练的 w 也可以观察得到:

这里写图片描述

M = 9时,大多数的 wi 都特别大,所以 x 的稍微扰动都可能产生一个极大极小的值。

这也就产生了第三种解决方案,利用正则化。说白了,正则化是给定M来约束参数w的学习,即让 w 尽量不要出现特别大的值,如上表所示。所以有了新的损失函数定义:

E^(w)=12n=1N(f(xn,w)tn)2+λ2||w|||2

其中 ||w||2=w20+w21++w2M ,让损失函数和每个 wi 相关。对M = 9, 但不同的 λ 能够得到如下图所示的结果:

这里写图片描述

对应的 w 也有了变化:

这里写图片描述

不过值得思考的并不是这些表面结果,而是为什么让 w 尽可能小,能够有更好的拟合效果?

我的猜测是大多数真实数据都会产生或多或少的左右偏移和上下偏移,以及跟采集器的周遭环境相关,有少量噪声产生。正如前文所说,由于上下偏移,越复杂的模型在小数据集中表达的更精准,那么求局部导数来看,它们更有可能产生一个冲击(无穷大的导数值),而无穷大是由所有 w 来表示的,那么自然 w 中都可能存在非常大或者非常小的值。所以 w 越大,假设函数的振幅越明显,所以才会选择更小的 w 来让假设函数更平滑(而非突变)。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐