@Frankchen
2016-03-10T04:19:51.000000Z
字数 34852
阅读 3328
机器学习
主要是介绍课程的一些相关情况。
如果一个系统能够通过执行某个进程改善它的性能,这就是学习。赫尔伯特·西蒙
何时适用ML:
机器学习的应用极广:已经出现在人们生活(衣食住行)的各个角落。
1.逐个遍历各个point(随机或者按序列),直到找到错误:
2.correct :
3.遍历完毕所有样本点,没有发现错误:
return last (called ) as
证明PLA在线性可分额样本里训练,更新过程一定收敛:
1.wf一定完美区分所有的点(所有的点的向量与之内积为正):
对于样本有噪声,线性不可分的情况,若直接通过计算所有的取错误率最小的那个的方法是可以证明是非常困难的,所以对PLA算法进行加入比较步骤的口袋算法(贪心算法),即每次存储,对于下一次额更新,比较存储的和当前的,取错误更少的保存,继续迭代,直到无法再找到错误更少的,即作为。
按照不同的输出我们可以把ML分为以下几类:
按照数据的不同的标签不同,可以把ML分为以下几类:
按照数据的传输方式,可以把ML分为以下几类:
按照输入空间的不同,可以把ML分为以下几类:
机器学习的大多数情况下是让机器通过现有的训练集(D)的学习以获得预测未知数据的能力,即选择一个最佳的h做为学习结果,那么这种预测是可能的么?为什么在采样数据上得到的h可以认为适用于全局,也就是说其泛化性的本质是什么?通过两个简单的小题目引出这个问题。
课程首先引入一个情景:
如果有一个装有很多(数量很大以至于无法通过数数解决)橙色球和绿色球的罐子,我们能不能推断橙色球的比例?很明显的思路是利用统计中抽样的方法,既然我们无法穷尽数遍所有罐子中的球,不如随机取出几个球,算出其中两种颜色球的比例去近似得到我们要的答案,这样真的可以么?
我们都知道小概率事件也会发生,假如罐子里面大部分都是橙色球,而我们恰巧取出的都是绿色,这样我们就判断错了,那么到底通过抽样得出的比例能够说明什么呢?似乎两者不能直接划等号。
由此,课程中引入了一个非常重要的概念,PAC,要理解这个,先得理解一个超级重要的不等式:Hoeffding's inequality
这些和机器学习有什么关系?其实前文中提到的例子可以和机器学习问题一一对应。
映射中最关键的点是讲抽样中橙球的概率理解为样本数据集D上h(x)错误的概率,以此推算出在所有数据上h(x)错误的概率,这也是机器学习能够工作的本质,即我们为什么在采样数据上得到了一个假设,就可以推到全局呢?因为两者的错误率是PAC的,只要我们保证前者小,后者也就小了。
请注意,以上都是对某个特定的假设,其在全局的表现可以和其在DataSet的表现PAC,保证DataSet表现好,就能够推断其能泛化。可是我们往往有很多假设,我们实际上是从很多假设中挑一个表现最好(Ein最小)的作为最终的假设,那么这样挑的过程中,最小的Ein其泛化能力一定是最好么?肯定不是。
继续用抛硬币的例子说明,很形象,每一个罐子都是一个假设集合,我们默认是挑表现最好的,也就是全绿色(错误率为0)的那个假设。
但是当从众多假设选择时,得到全对的概率也在增加,就像丢硬币一样,当有个150个童鞋同时丢硬币5次,那么这些人中出现5面同时朝上的概率为99%,所以表现好的有可能是小概率事件发生(毕竟对于每个假设其泛化能力是PAC),其不一定就有好的泛化能力(Ein和Eout相同),我们称这次数据是坏数据(可以理解为选到了泛化能力差的假设),在坏数据上,Ein和Eout的表现是差别很大的,这就是那个小概率事件。
Hoeffding's inequality告诉我们,每个h在采样数据上Ein和Eout差别很大的概率很低(坏数据):
复习一下我们机器学习的流程图,我们有两个问题
1.
2. 是否足够小
而M(hypothesis的数目)在其中这两个问题中扮演的角色有:
事实上M往往是over estimated的(各个hypothesis有重叠,union没那么大)。那么怎么解决这个问题呢?
我们以二元分类来阐述怎么解决(当然最后是可以推广到其他学习问题的):
对于一个training example{ x1 }。虽然看起来我们的hypothesis set有无数条线。但实际上这些hypothesis只有两类罢了----把x1分为叉叉的一类和把x1分为圈圈的一类。
这样问题便转化为:
于是我们用dichotomy的的bound取代了的无限bound。但是仍然是一个较大的值,我们继续希望用一个更小的bound取代它。
显然,如果growth function是一个关于N的多形式函数,那么利用之前的hoeffding不等式,我们会得到一个不错的结果。
下面是几个实际的例子:
对于K个输入(K个点),我们知道break point是不能作出shatter的那个最小的K。一旦K是break point,那么大于K的输入也无法shatter(这是显然的,我只要把多出点重叠,就可以reduce到K个点情况了)。
现在假设break point为2,再我们假设4个输入点,显然4个输入点里任意两个点无法被shatter(也就是无法做出一条线使任意的两个点能被分为oo,xx,ox,xo这四种情况)。这样我们这四个点可能出现的组合就被break point大大的限制住了。
总结归纳之前结论:
接下来根据已知的和显而易见的关系来画Table of Bounding Function:
接下来如何呢?我们分析可能会与上表之中的它的上一排有关,所以用计算机计算出了的所有的11种可能情况,再把这十一种情况按照的是否成对出现分为两组一共有个,因为表示的是4个点中不能出现任何三个点shatter的情况,故只考虑的情况下,把(2重复出现只算一半)单独留下来,必然也不会shatter三个点故有
又
成长函数的上界都被bound住了,那我们的成长函数同样也可以被这个bound住,因此对于存在break point k的成长函数而言,有:
而右手边(RHS)实际上是一个最高次项为k-1次的多项式。以2D Perceptrons为例,它的break point k=4,则它的成长函数会被B(N,4)给bound住
故利用有限的来替换无限的大,得到遇到Bad Sample的概率上界:
上式第二行的不等号可以由得到,第三、四行则是贝叶斯公式,联合概率等于先验概率与条件概率之积。
下面来看看不等式的最后一项:
这里就要稍微出动一下前人的智慧了:
为了直观一点就不写了。经过各种去掉绝对值符号又加上绝对值符号的运算,可以发现LHS的两个不等式是RHS那个不等式的充分非必要条件。而LHS第二个不等式是已知的,对于必成立的。因此我们拿LHS这个充分非必要条件去替换RHS这个不等式,继续前面的不等式:
最后一个不等号动用了Hoeffding Inequality:
之前说过对于来说, is forced to pick out,因此。接着把替换为,就成了。则我们可以得到引理中的不等式。
对于,一个比较合理的要求是,譬如我们有400笔资料,想要和相差不超过0.1。注意到这只是一个bound,只要要求不太过分,也不能太宽松即可,适当的宽松一点是OK的。当然这里也是想跟之前所说的 “的一个大概的上界可以是” 当中的2倍有所结合。
所以就有
前面的动作相当于先从总体中抽出笔数据,把这笔数据当成一个比较小的bin,然后在这个bin中抽取笔作为,剩下的笔作为,和之间是没有交集的。在我们想象出来的这个small bin当中,整个bin的错误率为,又因为:
这上面千辛万苦得出来的这个bound就叫做Vapnik-Chervonenkis (VC) bound:
上节课讲到了VC Dimension以及VC Bound。VC Bound所描述的是在给定数据量N以及给定的Hypothesis Set的条件下,遇到坏事情的概率的上界,即与差很远的概率,最多是多少。VC Bound用公式表示就是:
其中为Hypothesis Set的成长函数,有:
因为寻找所有Hypothesis Set的成长函数是困难的,因此我们再利用来bound住所有VC Dimension为的Hypothesis Set的成长函数。所以对于任意一个从中的来说,有:
因此说想让机器真正学到东西,并且学得好,有三个条件:
为什么要费那么大的力气来讲这个VC Bound和VC Dimension呢?因为对于初学者来说,最常犯的错误就是只考虑到了第3点,而忽略掉了前两点,往往能在training set上得到极好的表现,但是在test set中表现却很烂。关于算法的部分会在后续的笔记当中整理,目前我们只关心前面两点。
对于以下几个,由于之前我们已经知道了他们的成长函数(见机器学习笔记-VC Dimension, Part I),因此可以根据,直接得到他们的VC Dimension:
由于convex sets的,不满足上面所说的第1个条件,因此不能用convex sets这个来学习。
但这里要回归本意,通过成长函数来求得没有太大的意义,引入很大的一部分原因是,我们想要得到某个Hypothesis Set的成长函数是困难的,希望用来bound住对应的。对于陌生的,如何求解它的呢?
对于较小的,可以从它最多能够shatter的点的数量,得到,但对于一些较为复杂的模型,寻找能够shatter掉的点的数量,就不太容易了。此时我们可以通过模型的自由度,来近似的得到模型的。
维基百科上有不止一个关于自由度的定义,每种定义站在的角度不同。在这里,我们定义自由度是,模型当中可以自由变动的参数的个数,即我们的机器需要通过学习来决定模型参数的个数。
譬如:
我们一开始就提到,learning的问题应该关注的两个最重要的问题是:1.能不能使与很接近,2.能不能使足够小。
令之前得到的VC Bound为,坏事情发生的概率小于,则好事情发生的概率就大于,这个在统计学中又被称为置信度,或信心水准。
因此、又有下面的关系:
令,即上式的根号项为来自模型复杂度的,模型越复杂,与离得越远。
随着的上升,不断降低,而项不断上升,他们的上升与下降的速度在每个阶段都是不同的,因此我们能够寻找一个二者兼顾的,比较合适的,用来决定应该使用多复杂的模型。
反过来,如果我们需要使用这种复杂程度的模型,并且想保证,置信度,我们也可以通过VC Bound来求得大致需要的数据量。通过简单的计算可以得到理论上,我们需要笔数据,但VC Bound事实上是一个极为宽松的bound,因为它对于任何演算法,任何分布的数据,任何目标函数都成立,所以经验上,常常认为就可以有不错的结果。
我们机器学习的基本过程是,首先,我们认为有一个未知的关系存在于中,而中的就是作用于产生的,虽然我们并不知道,但是我们可以找到一个和差不多的g函数,我们就算学到东西了。但是在现实世界中,我们所观察到的DDD并不是它原本的样子,都会有noise的存在,在learning中,noise主要表现为以下三种形式:
本是一个确定性的模型,但是加上随机的noise,它们共同作用,就是一个概率性的结果:
对于某个样本,理想状态下,应该有,但是由于noise的存在,该noise有30%的可能性转换的结果。因此在中,该样本有70%的几率表现出,有30%的几率表现出。
再举个例子来对比不考虑noise的情况和考虑noise的情况的区别。假设不存在noisede情况下某个在中的错误率。再加上一个的noise,即:
假设中的noise样本有个:
由此可见noise对于是有影响的,在noise存在且较大的情况下,算出的会与实际的有较大差别,故的质量也会影响ML的效果。
我们在把learning的工作交给机器的时候,必须让机器明白你学习的目标,比如你想让什么什么最大化,或者什么什么最小化。通常的做法是把每一个预测值与真实值之间的误差(error)看成一种成本,机器要做的,就是在中,挑选一个能使总成本最低的函数(cost function)。
之前提到的二元分类就是对判断错误的点,记误差为1,判断正确的点,记误差为0:
不管是把y=+1的猜错成−1,或是把y=−1的猜错成+1,其产生的误差都为1。
在实际应用中,这个误差的定义可以很灵活,例如下面两个指纹验证的例子:
1.超市利用指纹识别判断某个人是否是他们的会员,若是会员会给相应的折扣。这种情形下,可能做出两种不同的错误判断,把非会员错认为是会员,把会员错认为是非会员。但对于超市来说,这两种错误的成本应该是不同的。把非会员错认为是会员,无非损失些许的折扣;但若是把会员识别为非会员从而不给折扣,就会导致顾客的不满,从而损失掉了未来的生意。针对这种需求,或许下面这个error的衡量办法会更加合理一些。把+1(会员)错判为-1(非会员)的error为10,把-1错判为+1的error为1。
2.中情局的门禁系统,利用指纹判断是内部工作人员,才允许进入。这种情形下,若是把好人当坏人,代价并不高,无非就是请工作人员多按一次指纹的功夫,但如果把坏人当好人,损失可就大了。针对这种需求,下面这个error的衡量办法可能更加合理。
之前一直说的Ein(h),就是h作用于D中每一笔数据,所产生的成本之和:
对于上面中情局的例子,的定义如下:
这种误差衡量方式称为”pointwise measure”,即对每个点记录误差,总误差为所有点产生的误差之和。在Ng那门课上,这个被称为cost function,通过cost function可以计算出当前作用于所造成的总成本,通过learning找到一个能够使总成本最小的,就完成了学习的过程。
针对不同的问题与不同的使用环境,我们可以设计不同的误差衡量方法,下面是集中常见的误差的定义:
总结一下,先根据问题的不同选择合适的误差衡量方式,0/1 error还是squared error或者是其他针对某一场景特殊设计的error?把作用于中所有点的error加总起来就成了一个cost function,也就是,接着要设计一个最优化算法,它能够从中挑选出能够使最小的方程g,learning就完成了。对于不同类型的cost function,通常会使用不同的最优化算法。对于某些cost function,很容易实现最小,比如之后会说的线性回归。对于某些cost function,寻找最小的是困难的,回忆之前说的PLA,用0/1 error来衡量误差,要minimize 就是个NP Hard问题。
当然除此之外,cost function中还可以增加一些来自于error之外的成本,以达到限制模型复杂度方面的目的,如ridge regression、lasso等,这些以后有机会都会提到。
之前我们利用银行审核顾客信用卡申请的案例引出机器学习的整个框架图,当时我们涉及的是二元分类(是否给予信用卡),也即是输出空间
接下来我们讨论线性回归算法,也即是如何最小化。
对进行展开
1.从数据集中构造输入矩阵 和输出向量
2.计算伪逆矩阵
3.返回
乍一看,线性回归“不算是”机器学习算法,更像是分析型方法,而且我们有确定的公式来求解。
实际上,线性回归属于机器学习算法:
1.对 进行优化。
2.得到 约等于 。
3.本质上还是迭代提高的:pseudo-inverse 内部实际是迭代进行的。
得到了 ,用于未知数据的预测时,
1.对称性
2.幂等性
3.半正定性
且对于有
最后我们讨论线性回归用于线性分类的可行性。上面我们讨论到线性回归的最优化问题是相对容易求解的,而通常来讲直接求解线性分类的最优化问题是很难的,那我们可不可以把线性回归的结果套用sign函数作为线性分类的解呢?答案是肯定的。但是这样做是有一些问题的,我们从图像上比较两者的error function可以看出,均方误差是0/1误差的上限,于是, 通常来讲我们可以把线性回归的解作为线性分类的初始值来求解。
--
当已知病人的体重,血压,胆固醇等等,从这些指标或者说这些特征预测病人心脏病发生的概率是多少;这里就引出了逻辑回归这个话题。其中体重,血压,胆固醇这些因素就是所谓的 ,也就是特征,我们分别赋予这些特征权重 , 就是每个特征的分数,分数越大,心脏病发生的概率就越大。
已知资料 的分布,求它们对应的 的概率分布,我们可以用 的最大似然来估计 或者 :
我们需要让错误最小化:
每一轮更新迭代的过程为:
通过对比我们目前学过的三种线性模型
如果将三者的分类正确性分数命名为
/低的时候,也低
也即是
如果使用/来衡量一个模型分类分得好不好的时候,如果它们认为分得好,那么如果使用,它也会认为分得好。
对比下在处理分类问题时,使用PLA,Linear Regression以及Logistic Regression的优缺点。
PLA:
优点:数据是线性可分时,保证可以降到最低
缺点:数据不是线性可分时,要额外使用pocket技巧,较难做最优化
Linear Regression:
优点:在这三个模型中最容易做最优化
缺点:在ys很大或很小时,这个bound是很宽松的,意思就是没有办法保证能够很小
Logistic Regression:
优点:较容易最优化
缺点:当ys是很小的负数时,bound很宽松
所以我们常常可以使用Linear Regresion跑出的w作为(PLA/Pocket/Logistic Regression)的,然后再使用来跑其他模型,这样可以加快其他模型的最优化速度。同时,由于拿到的数据常常是线性不可分的,我们常常会去使用Logistic Regression而不是PLA+pocket。
我们知道PLA与Logistic Regression都是通过迭代的方式来实现最优化的,即:
我们现在已经有办法使用线性分类器解决二元分类问题,但有的时候,我们需要对多个类别进行分类,即模型的输出不再是0和1两种,而会是多个不同的类别。那么如何套用二元分类的方法来解决多类别分类的问题呢?
利用二元分类器来解决多类别分类问题主要有两种策略,OVA(One vs. ALL)和OVO(One vs. One)。
先来看看OVA,假设原问题有四个类别,那么每次我把其中一个类别当成圈圈,其他所有类别当成叉叉,建立二元分类器,循环下去,最终我们会得到4个分类器。做预测的时候,分别使用这四个分类器进行预测,预测为圈圈的那个模型所代表的类别,即为最终的输出。譬如正方形的那个分类器输出圈圈,菱形、三角形、星型这三个分类器都说是叉叉,则我们认为它是正方形。当然这里可能遇到一个问题,就是所有模型都说不是自己的时候(都输出叉叉),怎么办? 只要让各个分类器都输出是否为自己类别的概率值,即可,然后选择概率值最高的那个分类器所对应的类别,作为最终的输出。
在类别较多的时候,如果使用OVA方法,则又会遇到数据不平衡(unbalance)的问题,拿一个类别作为圈圈,其他所有类别作为叉叉,那么圈圈的比例就会非常小,而叉叉的比例非常高。为了解决这个不平衡的问题,我们可以利用另外一个策略,OVO,即每次只拿两个类别的数据出来建建立分类器。
这个想法类似在打比赛,一笔新数据进来之后,分别使用这六个模型进行预测,得票数最多的那个类别,作为最终的输出。这样做的好处是,有效率,每次只拿两个类别的数据进行训练,每个模型训练数据量要少很多。但是缺点是,由于模型的数量增加了,将消耗更多的存储空间,会减慢预测的速度。
对于线性可分的hypothesis,我们可以用线性分类器来分开,但是当hypothesis比较复杂,不是线性可分的时候,我们就要把非线性空间转换到线性空间,这里需要用到转换函数,然后在线性空间进行分类,具体过程如下:
从而有:
简单来说,一个好的转换函数对应的hypothesis,是能够把X空间中的圈圈叉叉分开,对应到Z空间就是能够把它们线性分开就是一个好的转换函数。
当转换函数是高次项的时候,对应到X空间就是高维度的空间,曲线就会很复杂,那就会产生计算和存储的代价,最主要的是可能会overfit,得不到我们想要的理想的结果。那回到我们最初的问题:
- can we make sure that is close enough to ?
- can we make small enough?
所以正确选择转换函数以及转换函数的复杂度是非常重要的,既要保证不会overfit,也要使得能够得到良好的效果。
什么是过拟合(overfitting)简单的说就是这样一种学习现象: 很小, 却很大。而和 都很大的情况叫做 underfitting。
发生overfitting 的主要原因是:
1.使用过于复杂的模型(很大);
2.数据噪音;
3.有限的训练数据。
这是机器学习中两种常见的问题。
我们可以理解地简单些:有噪音时,更复杂的模型会尽量去覆盖噪音点,即对数据过拟合,这样,即使训练误差很小(接近于零),由于没有描绘真实的数据趋势,反而会更大。即噪音严重误导了我们的假设。
还有一种情况,如果数据是由我们不知道的某个非常非常复杂的模型产生的,实际上有限的数据很难去“代表”这个复杂模型曲线。我们采用不恰当的假设去尽量拟合这些数据,效果一样会很差,因为部分数据对于我们不恰当的复杂假设就像是“噪音”,误导我们进行过拟合。
假设数据是由50次幂的曲线产生的,与其通过10次幂的假设曲线去拟合它们,还不如采用简单的2次幂曲线来描绘它的趋势。
之前说的噪音一般指随机噪音(stochastic noise),服从高斯分布;还有另一种“噪音”,就是前面提到的由未知的复杂函数 产生的数据,对于我们的假设也是噪音,这种是确定性噪音。
可见,数据规模一定时,随机噪音越大,或者确定性噪音越大(即目标函数越复杂),越容易发生overfitting。总之,容易导致overfitting 的因素是:数据过少;随机噪音过多;确定性噪音过多;假设过于复杂(excessive power)。
如果我们的假设空间不包含真正的目标函数f(X)(未知的),那么无论如何H 无法描述f(X) 的全部特征。这时就会发生确定性噪音。它与随机噪音是不同的。
我们可以类比的理解它:在计算机中随机数实际上是“伪随机数”,是通过某个复杂的伪随机数算法产生的,因为它对于一般的程序都是杂乱无章的,我们可以把伪随机数当做随机数来使用。确定性噪音的哲学思想与之类似。
对应导致过拟合发生的几种条件,我们可以想办法来避免过拟合。
- 假设过于复杂(excessive ) => start from simple model
- 随机噪音 => 数据清洗
- 数据规模太小 => 收集更多数据,或根据某种规律“伪造”更多数据
正规化(regularization) 也是限制模型复杂度的,在下一讲介绍。
数据清洗(data ckeaning/Pruning):
将错误的label 纠正或者删除错误的数据。
Data Hinting: “伪造”更多数据, add "virtual examples"
例如,在数字识别的学习中,将已有的数字通过平移、旋转等,变换出更多的数据。
其他解决过拟合的方法在后面几讲介绍。
因为我们在实际操作过程当中经常出现overfit的情况,为了避免或者减小这种情况的发生,我们需要Regularization,通过正则化,相当于踩刹车,就可以减小overfit。
下面举例:同时用二次式和十次式去拟合一条低次的曲线,十次式很容易overfit,它们对应的hypothesis为:
我们在前面学过的VC bound 的通用表达式为:
我们在做二元分类的时候,我们总是要做很多选择,如选择哪一个算法,选择哪个模型等等,那我们根据什么来选择呢?
如果我们根据 来做选择的话,根据我们前面学过的内容,我们会知道很容易产生ovefit 的情况,所以我们应该让一部分资料用来做验证,我们就可以用 来做选择。
validation的大致思路是:给定一部分资料,一部分用来做训练资料,一部分用来做测试资料,经过训练得到的hypothesis,拿去做测试,看效果如何。下面是具体过程:
我们考虑一个极端的情形,就是当验证的资料 的时候,我们怎么算 ,并接近 。
但是其实我们在实际过程当中很少用Leave-One-Out Cross Validation,因为稳定性的原因,我们画出用Leave-One-Out Cross Validation做过的错误函数的图,我们就会发现其实不太稳定。所以下面介绍V-Fold Cross Validation。
本讲主要讲了三个主要的学习原则,林轩田老师主要是通过讲了三个故事来讲这三个机器学习应该要注意的问题。
- The simplest model that fits the data is also the most plausible.
如果简单的模型能够完成我们的目标,那我们为什么还要用更复杂的模型呢?复杂的模型更可能产生overfit。所以我们在选择模型的时候要特别注意这个问题。
- If the data is sampled in a biased way, learning will produce a similarly biased outcome.
我们在对资料进行抽样的过程当中,尽可能的全面,尽可能包括所有的情况,这样才更真实,才能反映客观实际,在预测或推断的过程中才能更准确。
- If a data set has affected any step in the learning process,its ability to assess the outcome has been compromised
我们不能偷看资料,或者说不能拿测试资料当成验证资料,因为这样做毫无意义,这样得到 的hypothesis 拿去预测的话就达不到好的效果。