天天看点

学习SVM

【转载请注明出处】http://www.cnblogs.com/jerrylead
1 简介

支持向量机基本上是最好的有监督学习算法了。最开始接触SVM是去年暑假的时候,老师要求交《统计学习理论》的报告,那时去网上下了一份入门教程,里面讲的很通俗,当时只是大致了解了一些相关概念。这次斯坦福提供的学习材料,让我重新学习了一些SVM知识。我看很多正统的讲法都是从VC 维理论和结构风险最小原理出发,然后引出SVM什么的,还有些资料上来就讲分类超平面什么的。这份材料从前几节讲的logistic回归出发,引出了SVM,既揭示了模型间的联系,也让人觉得过渡更自然。

2 重新审视logistic回归

Logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。

形式化表示就是

假设函数

学习SVM

其中x是n维特征向量,函数g就是logistic函数。

学习SVM

的图像是

学习SVM

可以看到,将无穷映射到了(0,1)。

而假设函数就是特征属于y=1的概率。

学习SVM

当我们要判别一个新来的特征属于哪个类时,只需求

学习SVM

,若大于0.5就是y=1的类,反之属于y=0类。

再审视一下

学习SVM

,发现

学习SVM

只和

学习SVM

有关,

学习SVM

>0,那么

学习SVM

,g(z)只不过是用来映射,真实的类别决定权还在

学习SVM

。还有当

学习SVM

时,

学习SVM

=1,反之

学习SVM

=0。如果我们只从

学习SVM

出发,希望模型达到的目标无非就是让训练数据中y=1的特征

学习SVM

,而是y=0的特征

学习SVM

。Logistic回归就是要学习得到

学习SVM

,使得正例的特征远大于0,负例的特征远小于0,强调在全部训练实例上达到这个目标。

图形化表示如下:

学习SVM

中间那条线是

学习SVM

,logistic回顾强调所有点尽可能地远离中间那条线。学习出的结果也就中间那条线。考虑上面3个点A、B和C。从图中我们可以确定A是×类别的,然而C我们是不太确定的,B还算能够确定。这样我们可以得出结论,我们更应该关心靠近中间分割线的点,让他们尽可能地远离中间线,而不是在所有点上达到最优。因为那样的话,要使得一部分点靠近中间线来换取另外一部分点更加远离中间线。我想这就是支持向量机的思路和logistic回归的不同点,一个考虑局部(不关心已经确定远离的点),一个考虑全局(已经远离的点可能通过调整中间线使其能够更加远离)。这是我的个人直观理解。

3 形式化表示

我们这次使用的结果标签是y=-1,y=1,替换在logistic回归中使用的y=0和y=1。同时将

学习SVM

替换成w和b。以前的

学习SVM

,其中认为

学习SVM

。现在我们替换

学习SVM

为b,后面替换

学习SVM

学习SVM

(即

学习SVM

)。这样,我们让

学习SVM

,进一步

学习SVM

。也就是说除了y由y=0变为y=-1,只是标记不同外,与logistic回归的形式化表示没区别。再明确下假设函数

学习SVM

上一节提到过我们只需考虑

学习SVM

的正负问题,而不用关心g(z),因此我们这里将g(z)做一个简化,将其简单映射到y=-1和y=1上。映射关系如下:

学习SVM
4 函数间隔(functional margin)和几何间隔(geometric margin)

给定一个训练样本

学习SVM

,x是特征,y是结果标签。i表示第i个样本。我们定义函数间隔如下:

学习SVM

可想而知,当

学习SVM

时,在我们的g(z)定义中,

学习SVM

学习SVM

的值实际上就是

学习SVM

。反之亦然。为了使函数间隔最大(更大的信心确定该例是正例还是反例),当

学习SVM

时,

学习SVM

应该是个大正数,反之是个大负数。因此函数间隔代表了我们认为特征是正例还是反例的确信度。

继续考虑w和b,如果同时加大w和b,比如在

学习SVM

前面乘个系数比如2,那么所有点的函数间隔都会增大二倍,这个对求解问题来说不应该有影响,因为我们要求解的是

学习SVM

,同时扩大w和b对结果是无影响的。这样,我们为了限制w和b,可能需要加入归一化条件,毕竟求解的目标是确定唯一一个w和b,而不是多组线性相关的向量。这个归一化一会再考虑。

刚刚我们定义的函数间隔是针对某一个样本的,现在我们定义全局样本上的函数间隔

学习SVM

说白了就是在训练样本上分类正例和负例确信度最小那个函数间隔。

接下来定义几何间隔,先看图

学习SVM

假设我们有了B点所在的

学习SVM

分割面。任何其他一点,比如A到该面的距离以

学习SVM

表示,假设B就是A在分割面上的投影。我们知道向量BA的方向是

学习SVM

(分割面的梯度),单位向量是

学习SVM

。A点是

学习SVM

,所以B点是x=

学习SVM

(利用初中的几何知识),带入

学习SVM

得,

学习SVM

进一步得到

学习SVM
学习SVM

实际上就是点到平面距离。

再换种更加优雅的写法:

学习SVM

学习SVM

时,不就是函数间隔吗?是的,前面提到的函数间隔归一化结果就是几何间隔。他们为什么会一样呢?因为函数间隔是我们定义的,在定义的时候就有几何间隔的色彩。同样,同时扩大w和b,w扩大几倍,

学习SVM

就扩大几倍,结果无影响。同样定义全局的几何间隔

学习SVM
5 最优间隔分类器(optimal margin classifier)

回想前面我们提到我们的目标是寻找一个超平面,使得离超平面比较近的点能有更大的间距。也就是我们不考虑所有的点都必须远离超平面,我们关心求得的超平面能够让所有点中离它最近的点具有最大间距。形象的说,我们将上面的图看作是一张纸,我们要找一条折线,按照这条折线折叠后,离折线最近的点的间距比其他折线都要大。形式化表示为:

学习SVM

这里用

学习SVM

=1规约w,使得

学习SVM

是几何间隔。

到此,我们已经将模型定义出来了。如果求得了w和b,那么来一个特征x,我们就能够分类了,称为最优间隔分类器。接下的问题就是如何求解w和b的问题了。

由于

学习SVM

不是凸函数,我们想先处理转化一下,考虑几何间隔和函数间隔的关系,

学习SVM

,我们改写一下上面的式子:

学习SVM

这时候其实我们求的最大值仍然是几何间隔,只不过此时的w不受

学习SVM

的约束了。然而这个时候目标函数仍然不是凸函数,没法直接代入优化软件里计算。我们还要改写。前面说到同时扩大w和b对结果没有影响,但我们最后要求的仍然是w和b的确定值,不是他们的一组倍数值,因此,我们需要对

学习SVM

做一些限制,以保证我们解是唯一的。这里为了简便我们取

学习SVM

。这样的意义是将全局的函数间隔定义为1,也即是将离超平面最近的点的距离定义为

学习SVM

。由于求

学习SVM

的最大值相当于求

学习SVM

的最小值,因此改写后结果为:

学习SVM

这下好了,只有线性约束了,而且是个典型的二次规划问题(目标函数是自变量的二次函数)。代入优化软件可解。

到这里发现,这个讲义虽然没有像其他讲义一样先画好图,画好分类超平面,在图上标示出间隔那么直观,但每一步推导有理有据,依靠思路的流畅性来推导出目标函数和约束。

接下来介绍的是手工求解的方法了,一种更优的求解方法。

6 拉格朗日对偶(Lagrange duality)

     先抛开上面的二次规划问题,先来看看存在等式约束的极值问题求法,比如下面的最优化问题:

学习SVM

    目标函数是f(w),下面是等式约束。通常解法是引入拉格朗日算子,这里使用

学习SVM

来表示算子,得到拉格朗日公式为

学习SVM

    L是等式约束的个数。

    然后分别对w和

学习SVM

求偏导,使得偏导数等于0,然后解出w和

学习SVM

。至于为什么引入拉格朗日算子可以求出极值,原因是f(w)的dw变化方向受其他不等式的约束,dw的变化方向与f(w)的梯度垂直时才能获得极值,而且在极值处,f(w)的梯度与其他等式梯度的线性组合平行,因此他们之间存在线性关系。(参考《最优化与KKT条件》)

然后我们探讨有不等式约束的极值问题求法,问题如下:

学习SVM

    我们定义一般化的拉格朗日公式

学习SVM

    这里的

学习SVM

学习SVM

都是拉格朗日算子。如果按这个公式求解,会出现问题,因为我们求解的是最小值,而这里的

学习SVM

已经不是0了,我们可以将

学习SVM

调整成很大的正值,来使最后的函数结果是负无穷。因此我们需要排除这种情况,我们定义下面的函数:

学习SVM

    这里的P代表primal。假设

学习SVM

或者

学习SVM

,那么我们总是可以调整

学习SVM

学习SVM

来使得

学习SVM

有最大值为正无穷。而只有g和h满足约束时,

学习SVM

为f(w)。这个函数的精妙之处在于

学习SVM

,而且求极大值。

    因此我们可以写作

学习SVM

    这样我们原来要求的min f(w)可以转换成求

学习SVM

了。    

学习SVM

    我们使用

学习SVM

来表示

学习SVM

。如果直接求解,首先面对的是两个参数,而

学习SVM

也是不等式约束,然后再在w上求最小值。这个过程不容易做,那么怎么办呢?

    我们先考虑另外一个问题

学习SVM

    D的意思是对偶,

学习SVM

将问题转化为先求拉格朗日关于w的最小值,将

学习SVM

学习SVM

看作是固定值。之后在

学习SVM

求最大值的话:

学习SVM

    这个问题是原问题的对偶问题,相对于原问题只是更换了min和max的顺序,而一般更换顺序的结果是Max Min(X) <= MinMax(X)。然而在这里两者相等。用

学习SVM

来表示对偶问题如下:

学习SVM

    下面解释在什么条件下两者会等价。假设f和g都是凸函数,h是仿射的(affine,

学习SVM

)。并且存在w使得对于所有的i,

学习SVM

。在这种假设下,一定存在

学习SVM

使得

学习SVM

是原问题的解,

学习SVM

是对偶问题的解。还有

学习SVM

另外,

学习SVM

满足库恩-塔克条件(Karush-Kuhn-Tucker, KKT condition),该条件如下:

学习SVM

    所以如果

学习SVM

满足了库恩-塔克条件,那么他们就是原问题和对偶问题的解。让我们再次审视公式(5),这个条件称作是KKT dual complementarity条件。这个条件隐含了如果

学习SVM

,那么

学习SVM

。也就是说,

学习SVM

时,w处于可行域的边界上,这时才是起作用的约束。而其他位于可行域内部(

学习SVM

的)点都是不起作用的约束,其

学习SVM

。这个KKT双重补足条件会用来解释支持向量和SMO的收敛测试。

    这部分内容思路比较凌乱,还需要先研究下《非线性规划》中的约束极值问题,再回头看看。KKT的总体思想是将极值会在可行域边界上取得,也就是不等式为0或等式约束里取得,而最优下降方向一般是这些等式的线性组合,其中每个元素要么是不等式为0的约束,要么是等式约束。对于在可行域边界内的点,对最优解不起作用,因此前面的系数为0。

7 最优间隔分类器(optimal margin classifier)

    重新回到SVM的优化问题:

学习SVM

    我们将约束条件改写为:

学习SVM

    从KKT条件得知只有函数间隔是1(离超平面最近的点)的线性约束式前面的系数

学习SVM

,也就是说这些约束式

学习SVM

,对于其他的不在线上的点(

学习SVM

),极值不会在他们所在的范围内取得,因此前面的系数

学习SVM

.注意每一个约束式实际就是一个训练样本。

    看下面的图:

学习SVM

    实线是最大间隔超平面,假设×号的是正例,圆圈的是负例。在虚线上的点就是函数间隔是1的点,那么他们前面的系数

学习SVM

,其他点都是

学习SVM

。这三个点称作支持向量。构造拉格朗日函数如下:    

学习SVM

    注意到这里只有

学习SVM

没有

学习SVM

是因为原问题中没有等式约束,只有不等式约束。

    下面我们按照对偶问题的求解步骤来一步步进行,

学习SVM

    首先求解

学习SVM

的最小值,对于固定的

学习SVM

学习SVM

的最小值只与w和b有关。对w和b分别求偏导数。

学习SVM
学习SVM

    并得到

学习SVM

    将上式带回到拉格朗日函数中得到,此时得到的是该函数的最小值(目标函数是凸函数)

    代入后,化简过程如下:

学习SVM
学习SVM

  最后得到

学习SVM

     由于最后一项是0,因此简化为

学习SVM

    这里我们将向量内积

学习SVM

表示为

学习SVM

    此时的拉格朗日函数只包含了变量

学习SVM

。然而我们求出了

学习SVM

才能得到w和b。

    接着是极大化的过程

学习SVM

学习SVM

    前面提到过对偶问题和原问题满足的几个条件,首先由于目标函数和线性约束都是凸函数,而且这里不存在等式约束h。存在w使得对于所有的i,

学习SVM

。因此,一定存在

学习SVM

使得

学习SVM

是原问题的解,

学习SVM

是对偶问题的解。在这里,求

学习SVM

就是求

学习SVM

了。

    如果求出了

学习SVM

,根据

学习SVM

即可求出w(也是

学习SVM

,原问题的解)。然后

学习SVM

    即可求出b。即离超平面最近的正的函数间隔要等于离超平面最近的负的函数间隔。

    关于上面的对偶问题如何求解,将留给下一篇中的SMO算法来阐明。

    这里考虑另外一个问题,由于前面求解中得到

学习SVM

    我们通篇考虑问题的出发点是

学习SVM

,根据求解得到的

学习SVM

,我们代入前式得到

学习SVM

    也就是说,以前新来的要分类的样本首先根据w和b做一次线性运算,然后看求的结果是大于0还是小于0,来判断正例还是负例。现在有了

学习SVM

,我们不需要求出w,只需将新来的样本和训练数据中的所有样本做内积和即可。那有人会说,与前面所有的样本都做运算是不是太耗时了?其实不然,我们从KKT条件中得到,只有支持向量的

学习SVM

,其他情况

学习SVM

。因此,我们只需求新来的样本和支持向量的内积,然后运算即可。这种写法为下面要提到的核函数(kernel)做了很好的铺垫。这是上篇,先写这么多了。

7 核函数(Kernels)

考虑我们最初在“线性回归”中提出的问题,特征是房子的面积x,这里的x是实数,结果y是房子的价格。假设我们从样本点的分布中看到x和y符合3次曲线,那么我们希望使用x的三次多项式来逼近这些样本点。那么首先需要将特征x扩展到三维

学习SVM

,然后寻找特征和结果之间的模型。我们将这种特征变换称作特征映射(feature mapping)。映射函数称作

学习SVM

,在这个例子中

学习SVM

我们希望将得到的特征映射后的特征应用于SVM分类,而不是最初的特征。这样,我们需要将前面

学习SVM

公式中的内积从

学习SVM

,映射到

学习SVM

至于为什么需要映射后的特征而不是最初的特征来参与计算,上面提到的(为了更好地拟合)是其中一个原因,另外的一个重要原因是样例可能存在线性不可分的情况,而将特征映射到高维空间后,往往就可分了。(在《数据挖掘导论》Pang-Ning Tan等人著的《支持向量机》那一章有个很好的例子说明)

将核函数形式化定义,如果原始特征内积是

学习SVM

,映射后为

学习SVM

,那么定义核函数(Kernel)为

学习SVM

到这里,我们可以得出结论,如果要实现该节开头的效果,只需先计算

学习SVM

,然后计算

学习SVM

即可,然而这种计算方式是非常低效的。比如最初的特征是n维的,我们将其映射到

学习SVM

维,然后再计算,这样需要

学习SVM

的时间。那么我们能不能想办法减少计算时间呢?

先看一个例子,假设x和z都是n维的,

学习SVM

展开后,得

学习SVM

这个时候发现我们可以只计算原始特征x和z内积的平方(时间复杂度是O(n)),就等价与计算映射后特征的内积。也就是说我们不需要花

学习SVM

时间了。

现在看一下映射函数(n=3时),根据上面的公式,得到

学习SVM

也就是说核函数

学习SVM

只能在选择这样的

学习SVM

作为映射函数时才能够等价于映射后特征的内积。

再看一个核函数

学习SVM

对应的映射函数(n=3时)是

学习SVM

更一般地,核函数

学习SVM

对应的映射后特征维度为

学习SVM

。(求解方法参见http://zhidao.baidu.com/question/16706714.html)。

由于计算的是内积,我们可以想到IR中的余弦相似度,如果x和z向量夹角越小,那么核函数值越大,反之,越小。因此,核函数值是

学习SVM

学习SVM

的相似度。

再看另外一个核函数

学习SVM

这时,如果x和z很相近(

学习SVM

),那么核函数值为1,如果x和z相差很大(

学习SVM

),那么核函数值约等于0。由于这个函数类似于高斯分布,因此称为高斯核函数,也叫做径向基函数(Radial Basis Function 简称RBF)。它能够把原始特征映射到无穷维。

既然高斯核函数能够比较x和z的相似度,并映射到0到1,回想logistic回归,sigmoid函数可以,因此还有sigmoid核函数等等。

下面有张图说明在低维线性不可分时,映射到高维后就可分了,使用高斯核函数。

学习SVM

来自Eric Xing的slides

注意,使用核函数后,怎么分类新来的样本呢?线性的时候我们使用SVM学习出w和b,新来样本x的话,我们使用

学习SVM

来判断,如果值大于等于1,那么是正类,小于等于是负类。在两者之间,认为无法确定。如果使用了核函数后,

学习SVM

就变成了

学习SVM

,是否先要找到

学习SVM

,然后再预测?答案肯定不是了,找

学习SVM

很麻烦,回想我们之前说过的

学习SVM

只需将

学习SVM

替换成

学习SVM

,然后值的判断同上。

8 核函数有效性判定

问题:给定一个函数K,我们能否使用K来替代计算

学习SVM

,也就说,是否能够找出一个

学习SVM

,使得对于所有的x和z,都有

学习SVM

比如给出了

学习SVM

,是否能够认为K是一个有效的核函数。

下面来解决这个问题,给定m个训练样本

学习SVM

,每一个

学习SVM

对应一个特征向量。那么,我们可以将任意两个

学习SVM

学习SVM

带入K中,计算得到

学习SVM

。I可以从1到m,j可以从1到m,这样可以计算出m*m的核函数矩阵(Kernel Matrix)。为了方便,我们将核函数矩阵和

学习SVM

都使用K来表示。

如果假设K是有效地核函数,那么根据核函数定义

学习SVM

可见,矩阵K应该是个对称阵。让我们得出一个更强的结论,首先使用符号

学习SVM

来表示映射函数

学习SVM

的第k维属性值。那么对于任意向量z,得

学习SVM

最后一步和前面计算

学习SVM

时类似。从这个公式我们可以看出,如果K是个有效的核函数(即

学习SVM

学习SVM

等价),那么,在训练集上得到的核函数矩阵K应该是半正定的(

学习SVM

这样我们得到一个核函数的必要条件:

K是有效的核函数 ==> 核函数矩阵K是对称半正定的。

可幸的是,这个条件也是充分的,由Mercer定理来表达。

Mercer定理:

如果函数K是

学习SVM
上的映射(也就是从两个n维向量映射到实数域)。那么如果K是一个有效核函数(也称为Mercer核函数),那么当且仅当对于训练样例
学习SVM
,其相应的核函数矩阵是对称半正定的。

Mercer定理表明为了证明K是有效的核函数,那么我们不用去寻找

学习SVM

,而只需要在训练集上求出各个

学习SVM

,然后判断矩阵K是否是半正定(使用左上角主子式大于等于零等方法)即可。

许多其他的教科书在Mercer定理证明过程中使用了

学习SVM

范数和再生希尔伯特空间等概念,但在特征是n维的情况下,这里给出的证明是等价的。

核函数不仅仅用在SVM上,但凡在一个模型后算法中出现了

学习SVM

,我们都可以常使用

学习SVM

去替换,这可能能够很好地改善我们的算法。

9规则化和不可分情况处理(Regularizationand the non-separable case)

我们之前讨论的情况都是建立在样例线性可分的假设上,当样例线性不可分时,我们可以尝试使用核函数来将特征映射到高维,这样很可能就可分了。然而,映射后我们也不能100%保证可分。那怎么办呢,我们需要将模型进行调整,以保证在不可分的情况下,也能够尽可能地找出分隔超平面。

看下面两张图:

可以看到一个离群点(可能是噪声)可以造成超平面的移动,间隔缩小,可见以前的模型对噪声非常敏感。再有甚者,如果离群点在另外一个类中,那么这时候就是线性不可分了。

这时候我们应该允许一些点游离并在在模型中违背限制条件(函数间隔大于1)。我们设计得到新的模型如下(也称软间隔):

引入非负参数后(称为松弛变量),就允许某些样本点的函数间隔小于1,即在最大间隔区间里面,或者函数间隔是负数,即样本点在对方的区域中。而放松限制条件后,我们需要重新调整目标函数,以对离群点进行处罚,目标函数后面加上的就表示离群点越多,目标函数值越大,而我们要求的是尽可能小的目标函数值。这里的C是离群点的权重,C越大表明离群点对目标函数影响越大,也就是越不希望看到离群点。我们看到,目标函数控制了离群点的数目和程度,使大部分样本点仍然遵守限制条件。

模型修改后,拉格朗日公式也要修改如下:

这里的和都是拉格朗日乘子,回想我们在拉格朗日对偶中提到的求法,先写出拉格朗日公式(如上),然后将其看作是变量w和b的函数,分别对其求偏导,得到w和b的表达式。然后代入公式中,求带入后公式的极大值。整个推导过程类似以前的模型,这里只写出最后结果如下:

此时,我们发现没有了参数,与之前模型唯一不同在于又多了的限制条件。需要提醒的是,b的求值公式也发生了改变,改变结果在SMO算法里面介绍。先看看KKT条件的变化:

第一个式子表明在两条间隔线外的样本点前面的系数为0,离群样本点前面的系数为C,而支持向量(也就是在超平面两边的最大间隔线上)的样本点前面系数在(0,C)上。通过KKT条件可知,某些在最大间隔线上的样本点也不是支持向量,相反也可能是离群点。

10坐标上升法(Coordinateascent)

在最后讨论的求解之前,我们先看看坐标上升法的基本原理。假设要求解下面的优化问题:

这里W是向量的函数。之前我们在回归中提到过两种求最优解的方法,一种是梯度下降法,另外一种是牛顿法。现在我们再讲一种方法称为坐标上升法(求解最小值问题时,称作坐标下降法,原理一样)。

方法过程:

最里面语句的意思是固定除之外的所有,这时W可看作只是关于的函数,那么直接对求导优化即可。这里我们进行最大化求导的顺序i是从1到m,可以通过更改优化顺序来使W能够更快地增加并收敛。如果W在内循环中能够很快地达到最优,那么坐标上升法会是一个很高效的求极值方法。

下面通过一张图来展示:

椭圆代表了二次函数的各个等高线,变量数为2,起始坐标是(2,-2)。图中的直线式迭代优化的路径,可以看到每一步都会向最优值前进一步,而且前进路线是平行于坐标轴的,因为每一步只优化一个变量。

11SMO优化算法(Sequentialminimal optimization)

SMO算法由MicrosoftResearch的JohnC.Platt在1998年提出,并成为最快的二次规划优化算法,特别针对线性SVM和数据稀疏时性能更优。关于SMO最好的资料就是他本人写的《SequentialMinimal Optimization A Fast Algorithm for Training Support VectorMachines》了。

我拜读了一下,下面先说讲义上对此方法的总结。

首先回到我们前面一直悬而未解的问题,对偶函数最后的优化问题:

要解决的是在参数上求最大值W的问题,至于和都是已知数。C由我们预先设定,也是已知数。

按照坐标上升的思路,我们首先固定除以外的所有参数,然后在上求极值。等一下,这个思路有问题,因为如果固定以外的所有参数,那么将不再是变量(可以由其他值推出),因为问题中规定了

因此,我们需要一次选取两个参数做优化,比如和,此时可以由和其他参数表示出来。这样回带到W中,W就只是关于的函数了,可解。

这样,SMO的主要步骤如下:

意思是,第一步选取一对和,选取方法使用启发式方法(后面讲)。第二步,固定除和之外的其他参数,确定W极值条件下的,由表示。

SMO之所以高效就是因为在固定其他参数后,对一个参数优化过程很高效。

下面讨论具体方法:

假设我们选取了初始值满足了问题中的约束条件。接下来,我们固定,这样W就是和的函数。并且和满足条件:

由于都是已知固定值,因此为了方面,可将等式右边标记成实数值。

当和异号时,也就是一个为1,一个为-1时,他们可以表示成一条直线,斜率为1。如下图:

横轴是,纵轴是,和既要在矩形方框内,也要在直线上,因此

同理,当和同号时,

然后我们打算将用表示:

然后反代入W中,得

展开后W可以表示成。其中a,b,c是固定值。这样,通过对W进行求导可以得到,然而要保证满足,我们使用表示求导求出来的,然而最后的,要根据下面情况得到:

这样得到后,我们可以得到的新值。

下面进入Platt的文章,来找到启发式搜索的方法和求b值的公式。

这边文章使用的符号表示有点不太一样,不过实质是一样的,先来熟悉一下文章中符号的表示。

文章中定义特征到结果的输出函数为

与我们之前的实质是一致的。

原始的优化问题为:

求导得到:

经过对偶后为:

s.t. 

这里与W函数是一样的,只是符号求反后,变成求最小值了。和是一样的,都表示第i个样本的输出结果(1或-1)。

经过加入松弛变量后,模型修改为:

由公式(7)代入(1)中可知,

这个过程和之前对偶过程一样。

重新整理我们要求的问题为:

与之对应的KKT条件为:

这个KKT条件说明,在两条间隔线外面的点,对应前面的系数为0,在两条间隔线里面的对应为C,在两条间隔线上的对应的系数在0和C之间。

将我们之前得到L和H重新拿过来:

之前我们将问题进行到这里,然后说将用表示后代入W中,这里将代入中,得

其中

这里的和代表某次迭代前的原始值,因此是常数,而和是变量,待求。公式(24)中的最后一项是常数。

由于和满足以下公式

因为的值是固定值,在迭代前后不会变。

那么用s表示,上式两边乘以时,变为:

其中

代入(24)中,得

这时候只有是变量了,求导

如果的二阶导数大于0(凹函数),那么一阶导数为0时,就是极小值了。

假设其二阶导数为0(一般成立),那么上式化简为:

将w和v代入后,继续化简推导,得(推导了六七行推出来了)

我们使用来表示:

通常情况下目标函数是正定的,也就是说,能够在直线约束方向上求得最小值,并且。

那么我们在(30)两边都除以可以得到

这里我们使用表示优化后的值,是迭代前的值,。

与之前提到的一样不是最终迭代后的值,需要进行约束:

那么

在特殊情况下,可能不为正,如果核函数K不满足Mercer定理,那么目标函数可能变得非正定,可能出现负值。即使K是有效的核函数,如果训练样本中出现相同的特征x,那么仍有可能为0。SMO算法在不为正值的情况下仍有效。为保证有效性,我们可以推导出就是的二阶导数,,没有极小值,最小值在边缘处取到(类比),时更是单调函数了,最小值也在边缘处取得,而的边缘就是L和H。这样将和分别代入中即可求得的最小值,相应的还是也可以知道了。具体计算公式如下:

至此,迭代关系式出了b的推导式以外,都已经推出。

b每一步都要更新,因为前面的KKT条件指出了和的关系,而和b有关,在每一步计算出后,根据KKT条件来调整b。

b的更新有几种情况:

来自罗林开的ppt

这里的界内指,界上就是等于0或者C了。

前面两个的公式推导可以根据

和对于有的KKT条件推出。

这样全部参数的更新公式都已经介绍完毕,附加一点,如果使用的是线性核函数,我们就可以继续使用w了,这样不用扫描整个样本库来作内积了。

w值的更新方法为:

根据前面的

公式推导出。

12SMO中拉格朗日乘子的启发式选择方法

终于到了最后一个问题了,所谓的启发式选择方法主要思想是每次选择拉格朗日乘子的时候,优先选择样本前面系数的作优化(论文中称为无界样例),因为在界上(为0或C)的样例对应的系数一般不会更改。

这条启发式搜索方法是选择第一个拉格朗日乘子用的,比如前面的。那么这样选择的话,是否最后会收敛。可幸的是Osuna定理告诉我们只要选择出来的两个中有一个违背了KKT条件,那么目标函数在一步迭代后值会减小。违背KKT条件不代表,在界上也有可能会违背。是的,因此在给定初始值=0后,先对所有样例进行循环,循环中碰到违背KKT条件的(不管界上还是界内)都进行迭代更新。等这轮过后,如果没有收敛,第二轮就只针对的样例进行迭代更新。

在第一个乘子选择后,第二个乘子也使用启发式方法选择,第二个乘子的迭代步长大致正比于,选择第二个乘子能够最大化。即当为正时选择负的绝对值最大的,反之,选择正值最大的。

最后的收敛条件是在界内()的样例都能够遵循KKT条件,且其对应的只在极小的范围内变动。

至于如何写具体的程序,请参考JohnC. Platt在论文中给出的伪代码。

13总结

这份SVM的讲义重点概括了SVM的基本概念和基本推导,中规中矩却又让人醍醐灌顶。起初让我最头疼的是拉格朗日对偶和SMO,后来逐渐明白拉格朗日对偶的重要作用是将w的计算提前并消除w,使得优化函数变为拉格朗日乘子的单一参数优化问题。而SMO里面迭代公式的推导也着实让我花费了不少时间。

对比这么复杂的推导过程,SVM的思想确实那么简单。它不再像logistic回归一样企图去拟合样本点(中间加了一层sigmoid函数变换),而是就在样本中去找分隔线,为了评判哪条分界线更好,引入了几何间隔最大化的目标。

之后所有的推导都是去解决目标函数的最优化上了。在解决最优化的过程中,发现了w可以由特征向量内积来表示,进而发现了核函数,仅需要调整核函数就可以将特征进行低维到高维的变换,在低维上进行计算,实质结果表现在高维上。由于并不是所有的样本都可分,为了保证SVM的通用性,进行了软间隔的处理,导致的结果就是将优化问题变得更加复杂,然而惊奇的是松弛变量没有出现在最后的目标函数中。最后的优化求解问题,也被拉格朗日对偶和SMO算法化解,使SVM趋向于完美。

另外,其他很多议题如SVM背后的学习理论、参数选择问题、二值分类到多值分类等等还没有涉及到,以后有时间再学吧。其实朴素贝叶斯在分类二值分类问题时,如果使用对数比,那么也算作线性分类器。

下一篇: lib-svm使用

继续阅读