之前的博客介绍了在数据为线性可分的情况下,如何用SVM对数据集训练,从而得到一个线性分类器,也就是超平面 WX+b=0 W X + b = 0 . 但是我已经强调过多次,线性可分的情况有相当的局限,所以SVM的终极目标还是要解决数据线性不可分的情况。解决这种线性不可分的情况基本的思路有两种:
本篇博客的全部内容就是介绍这两种思路如何在数据线性不可分的情况下训练分类器的。
所谓线性不可分,说得形象一些,就是“你中有我,或者我中有你”,我们找不到一个超平面,恰好能把两类数据严格地分开。举个例子,Fig.1(a)中,白色数据元组中有一个点比较“另类”(我用文字标了出来),它跑到人家黑色元组的区域中去了,显然,如果这个点直接被忽略掉,那么分类效果是很好的(比如Fig.1(a)中的蓝色虚线),但是现在的情况就让人很难受,因为我们找不到一个超平面,恰好能把黑白两类数据分开。
还有一种情况也比较有意思,就是现在数据还是线性可分的,比如Fig.1(b),但是存在一个“异常点”(SVM中称之为outlier),如果忽略它,最佳分离超平面的效果非常好,但是如果按正常的套路训练的话,我们只能得到一个“差强人意”的结果。如Fig.1(b)所示,有它或没它,超平面的训练效果是有很鲜明对比的。
针对上面这两种情况,最直接的解决思路就是能不能适当的放宽数据点和边缘侧面之间的关系?还记得之前线性可分情况下的约束条件是这样的:
现在放宽一些,变成下面的形式:
其中 ξi ξ i 为元组 Xi X i 对应的松弛变量,它实际上是这个元组距离它原本的边缘所超出的权重距离,也就是Fig.1两个子图中黑色虚线的权重长度(权重是 W W )。这样做的结果相当于是放宽了约束要求。通过在约束条件中加入松弛变量,使得一些原本不在相应边缘外部的点,被“拉”回了相应的侧面上,我给出松弛变量形式化的定义如下:
定义1-松弛变量:指数据元组关于侧面的离差的长度。离差有两种类型:
从大小离差的定义,我们也能确定松弛变量的取值范围:大离差 ξi≥1 ξ i ≥ 1 ;小离差 1>ξi>0 1 > ξ i > 0 . 当然如果一个元组正确地落在它该在的位置上,那就是没有离差,即 ξi=0 ξ i = 0
离差的存在帮助我们在一定的容错率下获取最佳分离超平面,但问题在于目标函数中离差的大小如何确定?显然,如果太小了,分离超平面就计算不出来了,或者只能计算一个“不佳”的分离超平面;而如果太大了,那任何一个超平面都是分类器了,也不行。所以,一定要采取措施,“控制”松弛变量。
控制的方法是加入“惩罚因子”。定义惩罚因子之前,我们先定义“软误差”:
定义2-软误差:指所有数据元组的松弛变量的和, ∑ni=1ξi ∑ i = 1 n ξ i
定义3-惩罚因子:是一个大于0的系数(记为 C C ),软误差乘该系数后,加入目标函数,使之成为新的目标函数,如下:
其中 C C 的取值用来在数据拟合之间找到平衡。显然, C C 越大,则分类器越不愿意分类错误,它要按“最正确”的来,那就会得到一个过拟合的分类器;而如果 C C 越小,那么分类器就越“不在乎”错误,得到一个过于泛化的分类器,也就是欠拟合了。
现在,加入松弛变量和惩罚因子后,新的优化问题诞生了,它是我在上一篇博客。。。的公式(1)的基础上加入松弛变量和惩罚因子的结果:
注意,这里 ξi≥0 ξ i ≥ 0 也是约束条件
拉格朗日方程变为:
其中, μi μ i 为新加入的拉格朗日乘子。
得到拉格朗日方程后,就可以进入我们在上一篇博客 SVM解释:三、线性可分的情况 中解决此类问题的“套路”了。具体地说,
现在的优化问题相当于求解:
转换成对偶问题:
先求解 minW,b,ξL(W,b,α,ξ,C,μ) min W , b , ξ L ( W , b , α , ξ , C , μ ) :
将以上的结果带入拉格朗日函数,那么对偶问题 d∗ d ∗ 就是要计算:
其实这里的 μ μ 不用考虑了,因为现在的式子里没有 μ μ 存在了。
最后来看看这个对偶问题的约束条件:
前两个条件怎么来的,上一篇博客中推导过了(可以参考上一篇博客中的公式(3)),至于第3点,那是因为在上面求偏导的过程中(本篇博客的公式(2)),存在下式:
综上,加入松弛变量和惩罚因子后的SVM问题最终转化为下面的带约束条件的凸优化问题:
上面这个优化问题,就是SVM中SMO算法主要要解决的问题。我在下一篇博客 SVM解释:五、SMO算法 中对SMO算法的介绍全部基于这个优化问题,所以这里大家注意一下,有个印象。
解得 α α 后进一步得到 W W 和 b b ,最终得到分类器:
分类器在形式上与没有加入松弛变量和惩罚因子时是一样的。
最后,我们分析一下训练元组 Xi X i 在分类器中的位置。上一篇博客中,我最后讲到了可以根据 αi α i 的取值判断训练元组是否为支持向量,再根据支持向量即可计算出分类器 WX+b=0 W X + b = 0 的常数项 b b 的值。先来简单回顾一下当时的分析:
与线性可分的情况相比,加入松弛变量和惩罚因子后,分析会变得更复杂。具体如下:
我们先看最原始的,公式(1)中的优化问题。当然,其最优解当然要满足KKT条件(参见我的第2篇博客 SVM解释:二、SVM的数学基础),因此根据KKT条件的第三项,可以得到以下结论:
分下列情况讨论:
0<αi<C 0 < α i < C 时:
因为 αi>0 α i > 0 ,所以 1−ξi−yi(WXi+b)=0 1 − ξ i − y i ( W X i + b ) = 0 ;因为 αi+μi=C α i + μ i = C ,且 αi<C α i < C ,所以 μi>0 μ i > 0 ;因为 μiξ=0 μ i ξ = 0 ,所以 ξ=0 ξ = 0 ;因为 ξ=0 ξ = 0 ,所以 ξ=0 ξ = 0 且 1−ξi−yi(WXi+b)=0 1 − ξ i − y i ( W X i + b ) = 0 ,所以 yi(WXi+b)=1 y i ( W X i + b ) = 1 ;
αi=C α i = C 时:
因为 αi>0 α i > 0 ,所以 1−ξi−yi(WXi+b)=0 1 − ξ i − y i ( W X i + b ) = 0 ;因为 αi+μi=C α i + μ i = C 且 αi=C α i = C ,所以 μi=0 μ i = 0 , ξ≥0 ξ ≥ 0 且无其他限制;因为 1−ξi−yi(WXi+b)=0 1 − ξ i − y i ( W X i + b ) = 0 ,所以 yi(WXi+b)≤1 y i ( W X i + b ) ≤ 1 ;
αi=0 α i = 0 时:
因为 αi=0 α i = 0 且 αi+μi=C α i + μ i = C ,所以 μi=C μ i = C ,因为 μiξ=0 μ i ξ = 0 ,所以 ξ=0 ξ = 0 ,因为 1−ξi−yi(WXi+b)≤0 1 − ξ i − y i ( W X i + b ) ≤ 0 ,所以 yi(WXi+b)≥1 y i ( W X i + b ) ≥ 1 ;
综上,在最优点处,所有样本必须满足公式(4):
由公式(4),我们还能推测出以下规律:
总结出这样的规律是很有用的,我们可以根据优化结果中 αi α i 的取值确定支持向量,再用支持向量解出 W W 和 b b ,最终确定一个有容错的SVM分类器。同时,这里的公式(4)大家注意一下,我在下一篇博客讲解SMO算法中,讲到选择优化变量的时候,也会用到这个公式。
好了,到现在为止,我一共用了之前的2篇博客,以及本文的一半讲SVM,对于线性可分的情况和线性不可分的情况其实我们已经有所了解了。现在终于要介绍SVM的重头戏“核函数”了。跟它的名字一样,这一块的知识也是“核”级别的,它非常重要。
加入松弛变量和惩罚因子,使得我们可以解决在训练数据线性不可分的情况下计算分类器的问题。但是好像还是不那么令人满意,因为它对训练数据都有一定的容错率,接下来自然要思考的问题是,存不存在一种方法,能够学习得到更为复杂的一个曲面(而不是超平面),从而对于线性不可分数据训练效果更佳。这就要用到所谓的“核技巧”了,和之前的线性模型不同,它是一种非线性模型。
定义4-核技巧:如果数据线性不可分,则可以对特征向量进行映射,将他们转化到更高维的空间,使得数据在高维空间是线性可分的。这种思路被称为“核技巧”。
我曾看到过一篇文章,作者对于核技巧有一个非常形象的描述:现在有一堆黑球,白球放在桌面上,线性不可分,所谓核技巧就是一拍桌子,将这些球拍到空中去,在空中我们插入一个板子,将两类球分开。其实通过这个描述你也大致能总结出非线性分类器学习步骤:
假设现在有映射函数 ϕ() ϕ ( ) 将数据映射到空间 z z :
根据上一篇博客中的公式(4),如果在 z z 空间中数据是线性可分的,那么决策超平面的方程是:
自然地,最终的决策规则可以用训练点和测试点的内积得到:
其中, X∗ X ∗ 为测试元组。
想象一下,如果有一种方式可以在原始空间中直接计算映射后的高维空间的向量内积 ϕ(Xi)Tϕ(Xj) ϕ ( X i ) T ϕ ( X j ) ,就不需要把原始空间中的数据映射到新空间中了。那也就是说,可以将上面的两个步骤融合到一起建立一个非线性的学习器。这样直接计算法的方法称为核函数方法。
形式化地,核函数 K(,) K ( , ) 对于原始空间中的数据元组 Xi,Xj X i , X j ,有下式成立:
在介绍几种常用的核函数之前,首先明确一个问题:为什么SVM的非线性分类模型要用核函数?
我在这里以July在博文 支持向量机通俗导论 中的例子来说明一下。
Fig.2中,两类数据以圆环型分布,那我们当然可以预测,一个合理的决策面也是圆环型的(而不是平面),而且就在这两类数据之间。
如果以 x1,x2 x 1 , x 2 为当前这个二维平面的两个坐标的话,二次曲线(圆环也是二次曲线)的方程可以写成如下形式:
但是和之前线性可分的情况下我们构造的超平面 WX+b=0 W X + b = 0 相比,现在这种曲面无法用线性分类模型处理。那我们考虑能不能把原始空间映射到高维空间,再考虑当前这个曲面。方法是构造一个5维空间,空间的每个坐标这样设置:
那么在新的高维空间中,之前的二次曲线变成了一个超平面:
到这一步之后,似乎直接根据之前讲的SVM的线性分类模型直接处理就OK了。但是你会发现,直接这样做是有问题的,我刚才对二维空间内的曲面(其实是曲线)进行处理,把一阶、二阶的坐标组合后,映射到了5维空间,那如果对三维空间映射呢?就会映射到一个19维的空间上,这个空间维数的数量级是爆炸式增长的。会给高维空间中线性分类模型的计算造成很大困难。关于这个问题的解释,July在其博客中说的非常详细,读者可自行翻看其博客中的2.2.2节。
这个问题怎么解决呢?就要用到核函数了。
先观察一下训练分类器用到的计算和分类时用到的计算,可以参考上一篇博客中的公式(3)和公式(4):
训练时:就是解决如下的凸优化问题(这是经过转换之后最终得到的拉格朗日对偶问题):
分类时,是计算如下函数的正负性:
不难发现,不论是训练过程还是分类过程,主要涉及的关于数据的运算都是内积计算。而核函数的作用,就是在不把数据映射到高维空间的前提下(实际上是不显式地写出映射后的结果),直接在低维空间中计算映射后向量的内积。综上,训练和分类的计算在核函数的帮助下,可以整理成如下形式:
训练
分类
对于任意一个映射,我们自己构造出对应的核函数是困难的,因此,一般会从几种常见的核函数中选择。常见的核函数大致有4种。我画了一个表格,展示出了他们的公式:
核函数 | 公式 |
---|---|
线性核 | K(X1,X2)=XT1X2 K ( X 1 , X 2 ) = X 1 T X 2 |
多项式核 | K(X1,X2)=(XT1X2+1)q K ( X 1 , X 2 ) = ( X 1 T X 2 + 1 ) q |
高斯核(径向基函数) | K(X1,X2)=exp(−‖X1−X2‖22s2) K ( X 1 , X 2 ) = exp ( − ‖ X 1 − X 2 ‖ 2 2 s 2 ) |
sigmoid核(S形函数) | K(X1,X2)=tanh(XT1X2+1) K ( X 1 , X 2 ) = t a n h ( X 1 T X 2 + 1 ) |
我简单说一下多项式核与高斯核:
1. 多项式核: q q 是由用户选择的,比如处理上面那两个圆环型分布的点集分类,因为在二维空间中,所以我们可以选择 q=2 q = 2 。向量 X1,X2 X 1 , X 2 映射到5维空间后,其内积为:
而如果我们选择 q=2 q = 2 时的多项式核函数 K(X1,X2)=(XT1X2+1)2 K ( X 1 , X 2 ) = ( X 1 T X 2 + 1 ) 2 ,计算结果是这样的:
你发现他俩个有点像,但又不太一样。实际上,只要把新的5维空间的几个维度缩放一下,再加上一个常数维,就是一样的了。也就是说,核函数计算的向量内积其实是原始空间中的向量被映射到下面的空间中的内积:
从核函数的公式你能清晰地感受到核函数的神奇,它就是直接在原始空间计算,达到在高维空间计算的效果。需要说明的是,当 q=1 q = 1 时,多项式核就是线性核。
2. 高斯核:参数 s s 由用户设定,这个参数 s s 实际上是平衡分类计算的因子。具体地说,如果 s s 太大,那相当于高斯核只是将原始空间映射到一个不是那么高维的新空间中,不一定能执行线性分类;而如果 s s 太小,理论上可以将任意的数据映射为线性可分的,但是这样一来就可能存在过拟合的问题。不过,只要参数得当,高斯核可以非常完美的解决线性不可分数据的SVM分类问题,所以也是应用最为广泛的。关于高斯核函数映射,有张非常形象的示意图,如下:
大多时候,面对线性不可分的数据,我们先用核函数将数据映射到高维空间中(其实并非真正映射,只是可以计算出映射后向量的内积),再通过加入松弛变量和惩罚因子让映射后的数据在线性模型下求解。这样,线性不可分情况下完整的SVM就展现在我们眼前了,它就是求解下面的凸优化问题:
上面的公式(5)其实是上一篇博客中的公式(4)在线性不可分的情况下,应用核函数,加入松弛变量和惩罚因子后的“终极”优化问题。
注意,因为这个优化问题从结构上比上一篇博客中的公式(3)要更复杂,但是他们的解法是一致的,所以在下一篇博客讲解SMO算法时,我会以这个优化问题举例,因为难的解决了,简单的不也就容易了吗。
至此,如何处理数据线性不可分的情况下的SVM分类就算是基本说完了。最后我们看一个例子,这也是July在博文中写到的,我觉得很形象,直接抄在底下:
“假设现在你是一个农场主,圈养了一批羊群,但为预防狼群袭击羊群,你需要搭建一个篱笆来把羊群围起来。但是篱笆应该建在哪里呢?你很可能需要依据牛群和狼群的位置建立一个“分类器”,比较下图这几种不同的分类器,我们可以看到SVM完成了一个很完美的解决方案。”
其实,任何监督学习最终的目的都是要最小化预测结果与真实结果之间的误差。这种误差一般用“风险”来评估。很显然,风险对于一个监督学习算法来说是很重要的,它所评估的误差大小直接说明了算法的好坏。监督学习系统中有结构化风险和经验风险两种。既然说到了SVM的损失函数,就一并将两种风险做个简要介绍。
设决策函数为f(),对于给定的输入X,它的预测结果(计算得到的类标记或者预测数值)为f(X),真实结果为Y,那么常用的损失函数有如下几种:
0-1损失函数:
L(Y,f(X))={1,Y≠f(X)0,Y=f(X)
平方损失函数:
L(Y,f(X))=(Y−f(X))2
绝对损失函数:
L(Y,f(X))=|Y−f(X)|
对数损失函数:
L(Y,p(Y|X))=−logp(Y|X)
如果给定一个训练集{(X1,Y1),(X2,Y2),…,(Xn,Yn)}和损失函数L(Y,f(X)),则经验风险被定义为模型f(X)关于训练集的平均损失:
所以,如果按照经验风险最小的策略设计学习模型,那么实际上是求解下面的优化问题:
经验风险很直观,容易理解。但是有个缺点就是当样本容量较小时,容易产生过拟合。而依据结构风险的设计策略则可以避免这个问题。
结构风险在经验风险的基础上加入表示模型复杂度的正则化项或罚项,定义如下:
其中 J(f) J ( f ) 为模型复杂度,模型越复杂, J(f) J ( f ) 越大,反之, J(f) J ( f ) 越小。 λ≥0 λ ≥ 0 为惩罚系数。显然,罚项的存在控制了模型的复杂度,能够解决过拟合的问题。按结构风险最小的策略设计的学习模型实际上是求解下面的优化问题:
设计SVM时,我们加入松弛变量其实就是一种结构风险最小的策略,使得分类器不会过拟合。如果尝试从损失函数的角度理解SVM,逻辑回归(LR),提升(Boosting)等算法的话,可能会有不同的收获。
这篇博文和之前的两篇放在一起,我已经解释了SVM中80%的内容,虽然很多数学方面的细节确实不尽详细,好在如果只是掌握SVM的基本思想的话,这点内容还算够。那剩下20%就是要介绍上面说的,解决对偶问题时需要用到的SMO算法了。SMO算法有点复杂,所占篇幅也不小,所以单独列在整个SVM学习笔记的最后(即我关于SVM的最后一篇博客),以方便大家在前面更容易掌握SVM的整体逻辑。