背景:
机器学习可行性分析,这个机器学习的基石已经卡了2,3天了,缕一缕思路,抓了抓头发,是时候一决高下了。本文脉络如此:有没有一个好算法,千秋万载,一统江湖?当我们拿到一个数据集时,我们分析数据、提取特征、确定模型,为什么ML(Machine Learning)可以做到大概率预测结果?
学习问题:
假如我们想学习一个垃圾邮件分类的模型, 通过上帝视角,我们知道必然存在一个目标函数(target function):
和一个样本集:
其中,可看作特征,在垃圾邮件分类下,也许是各种单词:大润发、促销、电话、抢购等,可看作该特征下输出的结果。问题是,我们是否可以通过样本集,让学习算法在假设函数集合中选择比较好的假设函数:
在此,要有一个约束,我们仅仅对二分类(dichotomy)问题进行讨论,符号描述:
其中,称为输入空间,其是一个维向量,就是特征数,在这儿可以看作是用于垃圾邮件分类的特征单词,叫做输出空间。这儿可以表示,可以表示。
上面就是一个学习任务,有一个样本集,那么学习算法能否从假设函数集合中选择一个好的假设函数。
如果学习算法成功找到一个,我们说这个学习是可行的,否则就是不可行的。
如果用图描述下学习的过程,也许会更清晰一点:
注意:本文仅仅对二分类的学习问题可行性进行讨论,但是并非所有的机器学习输出空间都是二值的,其他类型的需要更深入的学习了。
第一部分:NFL(No Free Lunch)理论
有没有一个算法可以千秋万载,一统江湖,来我们一起做个选择题:
好的,你选什么?对于这样的一个没有具体情境的题目,不存在一个好答案,他们作为答案的期望水平都是一样的,也就是。而对于特定情境下的问题,往往某些算法表现很不错。这也就是理论,下面是一段引用:
A number of "no free lunch" (NFL) theorems are presented that establish that for any algorithm, any elevated performance over one class of problems is exactly paid for in performance over another class
———— Wolpert and Macready (1997)
在具体情况下,学习算法对的“偏见”,我们称之为学习算法的归纳偏好。
第二部分:
这一部分主要是引入一个经典的模型,并将其与学习问题联系起来,讨论有限个假设函数的时候,机器学习的可行性。
一、罐子模型
考虑这样一个里面存放红、绿色球的罐子,有如下假设:
假如罐子的原因,对于我们是不得而知,那我们怎么估计。机智的你是否想到了统计学知识?好的,我们对罐子里小球进行取样,保证其独立同分布,并且一次取个。
那么与有什么关系?让我们来看看。此时,我们引入Hoeffding不等式,得到下述式子,可以这么理解:在一次取样数比较大时,在一个容忍度下,是在概率上接近的。
二、联系学习问题
对于罐子,我们未知的是。对于学习问题,我们未知的是,每一个球就是一个样本点,罐子里所有的球形成了样本空间。
学习算法获得一个假设函数,作用于样本空间里每一个样本点,罐中样本就被上色,其绿色代表:,其红色代表:。
对于我们从罐中取个样本(独立同分布),我们定义作如下定义:
样本内错误率:
其中叫指示函数,如为真返回,如为假返回。
样本外错误率:
可以看出,其实就是,就是,于是Hoeffding不等式就变为:
从上,Hoeffding不等式告诉我们,对于一条假设,随着变大,样本上的错误率与样本外错误率是不大的!
但是,它这儿是一条假设,如果固定一条假设函数,那都不需要学习算法了,且这儿更像是验证一个假设函数的预测能力,由于只有一条,没有选择余地,学习算法并不一定能获得一个较小的,尽管其保证了很接近。我们希望的是多条假设以供学习算法选择,而不是一条固定的假设函数。
三、有限条假设函数
为了解决上面一条假设函数带来的问题,我们尝试加入有限的假设函数,希望在一个样本集下,学习算法能从有限假设函数集选择一条作为,此时让我们看看与会不会差很多?
解释下式子,因为是从里面选择出来的,因此上发生偏离的概率必然是小于等于某一个,必然是小于等于所有上发生的概率。
从上面的公式可以看出:在一个容量为样本集下,只要足够大,面对(有限)个假设函数,学习算法可以从假设集合中选择一个比较小的假设函数作为,也就是我们证明了其学习的可行性。
四、小结
我们的问题是:学习算法能否,在假设函数集合中寻找合适的作为,使得
从上文看到,我们要保证两个要点:
1、
2、为了想让 ,希望尽可能小。
其中第一个要点可以通过Hoeffding不等式保证,第二个要点可以通过加入更多的保证。然后我们用概率上一个简单的缩放(Union Bound)搞定了有限的时候。
第三部分:
由上,我们得知有限的时候,学习是可行的。但是,现实中,我们面对的常常是无限的时候,这部分主要讨论无穷大的时候。明显如果真的无穷大,事情将会变得非常复杂,我们希望可以用一个有限的数代替。为此将引入二分类(dichotomies)、成长函数(growth function)、断点(break point)等概念来寻找这个替代值。
第一节我们将从二分类入手,引入二分类的最大数目成长函数。希望成长函数是一个多项式级别,引入了BreakPoint等理论。
第二节解决成长函数和的关系,从一个直观的角度说明成长函数代替?
一、基本概念
让我们分析下为什么会变得无穷大?为了表达方便,我们定义Bad events :
那么Union Bound告诉我们:
原来是这边产生了,那么这个坏事情(Bad events)发生会不会重叠呢?Union Bound财大气粗,造成了Over estimate。我们是不是只要不用Union Bound呢?
1、坏事情发生是会重叠的
让我们来看个PLA(感知器)的例子,下图目标函数,蓝色部分、紫色部分分别是被划分的两类,绿色、红色线分别是我们的假设函数,,显然他们非常接近。我们先看他们的,如果在某一个样本集上出现了偏离。对于,由于,非常接近,面对同一个(这里是理解的关键,他们面对的是同一个!),所以在上出现了偏离情况的概率是非常非常大的。由于,非常接近,他们的也是很接近的,可以看到黄色部分是他们的差。由于两者接近,接近,因此坏事情发生很大概率是存在重叠的,何况这里只是两个接近的线,面对无穷多的假设函数,坏事情发生是存在重叠的,Union Bound是Over estimate!
2、二分类
A dichotomy:对一个假设函数。
number of dichotomies:,其中
让我们解释一下,A dichotomy是什么意思?就是将带入得到这就叫一个二分类。但是我们不关注某一个二分类,我们更加关注的是对于某一个假设函数集合上有多少种这样的二分类。于是引入了,就是将中每一个作用到得到若干不同的二分类,得到一个二分类集合,其集合中不同二分类数:。
注意一点:这个二分类的个数是随变化而变化的。在不同的样本集上的二分类结果是不同的。比如
3、成长函数
由于不同,可得到不同二分类数量,人们想知道在到底多少二分类,终于引入了成长函数,
显然成长函数的天花板:。
成长函数什么意思呢?在任意上最大的二分类个数。
4、打散
如,在上产生了个二分类,那么可以打散。
PLA的例子:此时,,表明其可以产生所有的二分类。如果不能打散,说明对于任意的,在上至少有一种二分类没法实现。
5、断点
人们希望成长函数是多项式级别的,于是引入了断点的概念。
如果大小为的数据集不可以被打散,那么就是一个断点(Break Point)。
PLA例子:其,所以就是断点。
注意:如果是断点,同样也是断点,因为如果上面可以组成所有二分类,遮掉一个点,必然是可以组成所有二分类。
断点给我们的最重要的结论是:如果没有断点,。如果有断点, is polynomial in N,这是一个不错的结论,因为这样的话,如果我想知道你在学习上的预算,我不需要知道、、学习算法,只要你告诉我它的断点是多少。同样,你只要告诉我它的断点存在,我就知道它是可以学习的。
6、一道题目
让我们用一道题目检测下是否理解了上面的概念。我们有三个点,对这个假设集合,其断点是,因此任意两个点不能产生所有的二分类。在这个限制下,问总共可以产生多少个二分类?
答案是个,如果没有断点这个约束,就是个,但是因为有断点这个约束,导致你在添加点的时候,任取两列,其两列不能形成所有的二分类,也就是不能有oo,ox,xo,xx。下图是其中的一种答案:
7、小结:
考虑二分类的学习问题中,为了寻找合适的替代物,我们提出了Dichotomies,为了确定在某一个上Dichotomies的最大值。引入了成长函数,为了说明成长函数是多项式级别, 引入了断点,下一部分我们将说明两个问题:
1、为什么有断点的,成长函数是多项式级?
2、为什么可以用成长函数代替?
二、泛化理论
不得不说,这部分是很理论了,如yaser Abu-Mostafa在caltech课程中所述,勒紧安全带,我们要开始了。
1、有断点的成长函数是多项式级:
为了说明有断点的是多项式类型,我们希望让,于是定义了:在个点上最大的二分类数量,包含了个断点。回忆下成长函数的定义:对某个而言,任意,其最大的二分类数量。在我看来,不就是加入了断点限制的成长函数么?显然如果有断点,下式显然成立:
下面求解具体的的值。
有个点,其断点为,下表是的所有情况,可以看出所有的组合从列上被分成了三类,行上被分为两部分。
表中每一行代表,其中第一类指部分(第一部分)出现过二分类向量仅仅一次,记一类:,其数目记作。第二、三类:出现二分类向量两次且(第二部分)分别记两类:、,其数目是相等的,所以记作,此时:
接下来,我们想用递归的方式对其进行估计:在的第一部分,任取列,不可能可以组成所有的二分类,如果可以就与矛盾了,所以,易得下面式子:
同样,对于的第一部分,任取列,不可能组成所有的二分类,于是得:
举个例子:试想,其组成了所有的二分类组合:oo、ox、xo、xx,当你并且添加第二部分的时候,就组成了ooo、oox、oxo、oxx、xoo、xox、xxo、xxx,如果可以就与矛盾了。
综上,不难得到:
最终得到:
使用归纳法对上公式进行一个证明:
当时,上式成立;
假设上式子成立,我们尝试证明时,
BinGo!我们终于证明了有断点的成长函数是一个多项式级别的。
注意:上述证明倒数第二步的两个组合的合并需要一点技巧,可以利用组合的定义,但是利用组合的意义会快很多。
2、对成长函数代替的简单证明:
此处,我们分成三部分,分别:成长函数如何描述重叠部分、的处理、最后将它们放一起。
2.1、成长函数如何描述重叠部分:
我们缕一缕两点:第一、坏事情(在某一个上,偏离很大)发生是有重叠的,并不是独立的。这一点在Union Bound 为什么Over Estimate 那有详细的解释。
第二点:成长函数是如何描述其重叠部分的呢?成长函数告诉我们,在任意上最大的二分类数目。什么意思呢?对于二分类问题,拿PLA说好了,尽管假设函数无数条,但是面对同一个样本集,很多假设函数返回的是一个完全一样的二分类,因此有很多假设函数在上表现是一致的。因此,成长函数是以一个二分类(尽管很多问题不是二分类,但是可以通过技术手段推广的)的角度告诉我们,坏事情发生不是独立的,是有重叠区域的。
2.2、的处理:
为什么要处理,我们知道取决于整个输入空间。于是用替换掉,其中、是基于两个大小为的样本。那为什么可以替换?因为是和相互影响的,是和相互影响的,所以、也是相互有关的。
2.3、综合:
千呼万唤始出来。最后,我们终于终于得到了著名的:VC不等式。
注意:在使用的时候,已知BreakPoint存在,我们一般用多项式代替成长函数(后面会解释)。
第四部分:
我们已经解决了机器学习的可行性问题,虽然是基于二分类目标函数的,但是推广是可以的,只是技术上的手段。下面主要是一些关于VC的知识,以及VC分析的一些现实意义。
一、VC维
一个假设空间的VC维,是满足的最大整数。换言之:可以打散的最大点数;再言之:可以在某一个最大点数的上实现所有的二分类组合,这个最大点数就是VC维;再或者VC维就是BreakPoint点-1。
两点补充:
二、VC维的解释与泛化边界:
由于VC分析不依赖于学习算法、具体分布、目标函数,加之成长函数使用比较松弛的多项式:,造成VC泛化边界时是一个非常宽松的边界。由于其松弛的边界,我们一般可以用其评估模型好坏。
1、与有效参数
上的参数创建了自由度。代表了二分类下的自由度。
2、与需要的数据量
我们来看下VC不等式:
定义了,可以理解为精度,为概率上的估计。给定一个,假设我们期望泛化误差(与距离)不超过,则
因此,只要确定了实践中,样本数至少
3、泛化边界
在VC不等式中,我们用表示:,于是可以得到:
联系上式子与,得下述解释:我们至少有的把握,使得。
由于通常要大于,于是上式子摇身一变就变成了泛化边界:
我们至少有的把握,
泛化边界告诉我们,不是模型越复杂越好,虽然降低了,但是(可以视之为惩罚)增加了。所以,好的模型要综合考虑这两项(泛化边界也为后面正则化带来了启发)。
后记:
本文是笔者在学习加州理工学院公开课-机器学习与数据挖掘时的笔记。要感谢Yaser Abu-Mostafa、林轩田老师的公开课视频资源,感谢博客园viredery、知乎八汰等人的笔记资料。
参考资料:
[1] Learning From Data(网易公开课).
[2] 林轩田机器学习基石(B站公开课).
[3] No Free Lunch Theorems.
[4] 机器学习为什么可行的上、中、下(知乎八汰).
[5] 机器学习 - 学习理论(博客园viredery).
[6]如何通俗的理解机器学习中的VC维、shatter和break point?(知乎).
[7]台湾大学林轩田机器学习基石课程学习笔记(红色石头).