写在前面
说实话,真的要全部理解SVM真的挺难的,作为一个正在入门中的小白,表示真的花了不少时间来弄懂每一个公式,其中滋味不言而喻。但是与之而来的则是推出每一个公式后的成就感,或许这也是让我和看到这篇文章的你能够坚持下去的动力吧!
本篇文章的所有理论均来自于各个博客的大佬,在这里我尽量用最通俗的话来解释SVM的理论基础知识并附上相关博客链接,篇幅可能较长,还希望能够静心看下去,若是有哪些地方讲述错误,还请各位大佬不吝赐教。
什么是SVM?
在很久以前的情人节,魔鬼抓走了刘强西的爱人,因此刘强西要去救他的爱人,但魔鬼和他玩了一个游戏。
魔鬼在桌子上似乎有规律放了两种颜色的球,说:“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。”
于是刘强西这样放,干的不错?
然后魔鬼,又在桌上放了更多的球,似乎有一个球站错了阵营。
刘强西不得已掏出了必杀技SVM,其实SVM就是试图把棍放在最佳位置,好让在棍的两边有尽可能大的间隙。
现在即使魔鬼放了更多的球,棍仍然是一个好的分界线。
然后,在SVM 工具箱中有另一个更加重要的 trick。 魔鬼看到刘强西已经学会了一个trick,于是魔鬼给了大侠一个新的挑战。
刘强西看到现在貌似不可以用一根棍子分开,于是将内功运至手部,拍起桌子,将小球全拍至空中。然后,凭借大侠的轻功,大侠抓起一张纸,插到了两种球的中间。
现在,从魔鬼的角度看这些球,这些球看起来像是被一条曲线分开了。
故事最后,刘强西救出了他心爱的人。。。一起开了一间旅馆,名叫:京西旅馆。再之后,无聊的人们,把这些球叫做 「data」(数据源),把棍子叫做「classifier」(分类器), 最大间隙trick 叫做「optimization」(最优化),拍桌子叫做「kernelling」(建立核函数), 那张纸叫做「hyperplane」(超平面)。
好啦,言归正传,其实支持向量机(Support Vector Machine, SVM)的基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大。SVM是用来解决二分类问题的有监督学习算法,在引入了核方法之后SVM也可以用来解决非线性问题。
一般SVM有下面三种:
- 硬间隔支持向量机(线性可分支持向量机):当训练数据线性可分时,可通过硬间隔最大化学得一个线性可分支持向量机。
- 软间隔支持向量机:当训练数据近似线性可分时,可通过软间隔最大化学得一个线性支持向量机。
- 非线性支持向量机:当训练数据线性不可分时,可通过核方法以及软间隔最大化学得一个非线性支持向量机。
线性支持向量机和硬间隔最大化
硬间隔支持向量机也就是线性可分支持向量机,我们可以先看一下线性可分的二分类问题:
上图中的(a)是已有的数据,红色和蓝色分别代表两个不同的类别。数据显然是线性可分的,但是将两类数据点分开的直线显然不止一条。上图的(b)和(c)分别给出了B、C两种不同的分类方案,其中黑色实线为分界线,术语称为“决策面”。每个决策面对应了一个线性分类器。虽然从分类结果上看,分类器A和分类器B的效果是相同的。但是他们的性能是有差距的,看下图:
在"决策面"不变的情况下,我又添加了一个红点。可以看到,分类器B依然能很好的分类结果,而分类器C则出现了分类错误。显然分类器B的"决策面"放置的位置优于分类器C的"决策面"放置的位置,SVM算法也是这么认为的,它的依据就是分类器B的分类间隔比分类器C的分类间隔大。这里涉及到第一个SVM独有的概念"分类间隔"。在保证决策面方向不变且不会出现错分样本的情况下移动决策面,会在原来的决策面两侧找到两个极限位置(越过该位置就会产生错分现象),如虚线所示。虚线的位置由决策面的方向和距离原决策面最近的几个样本的位置决定。而这两条平行虚线正中间的分界线就是在保持当前决策面方向不变的前提下的最优决策面。两条虚线之间的垂直距离就是这个最优决策面对应的分类间隔。显然每一个可能把数据集正确分开的方向都有一个最优决策面(有些方向无论如何移动决策面的位置也不可能将两类样本完全分开),而不同方向的最优决策面的分类间隔通常是不同的,那个具有“最大间隔”的决策面就是SVM要寻找的最优解。而这个真正的最优解对应的两侧虚线所穿过的样本点,就是SVM中的支持样本点,称为"支持向量"。
寻找超平面
假如二维空间中一条直线的方程如下所示:
我们对这个公式进行小小的移位和变形,让y轴变成x2,则有:
将这个公式进行向量化处理:
进一步向量化,用w列向量和x列向量和标量γ进一步向量化:
其中,向量w和x分别为:
二维空间的直线方程已经推导完成,将其推广到n维空间,就变成了超平面方程。(一个超平面,在二维空间的例子就是一个直线)但是它的公式没变,依然是:
但是改变的地方在于向量w和x的维度:
我们已经顺利推导出了"决策面"方程,它就是我们的超平面方程,之后,我们统称其为超平面方程,并记作(w,b)。
我们高中都学过,假如公式中的直线方程为,点P的坐标为(x0,y0)。那么点到直线的距离公式可以表示为:
现在,我们可以将直线方程扩展到n维:
这就是我们的超平面方程,d就是“分类间隔”,其中||w||表示w的二范数,求所有元素的平方和,然后再开方。d越大,则表示该超平面方程的分类效果越好,此时,求解超平面的问题就变成求解最大分类间隔d的问题。
建立模型
我们已经初步获得了目标函数,为了求解最大分类间隔,我们不得不面对以下两个问题:
- 我们如何判断超平面是否将样本点正确分类
- 我们怎么样在众多的点中选出支持向量上的点呢?
这些问题就是求解目标函数的约束条件,也就是说我们优化的分类间隔d的取值范围受到了限制和约束,svm算法通过一些小技巧,将这些条件融合到一个不等式里面。
在上图所示的二维平面上有两种点,加号代表正样本,标记为1,负号代表负样本,标记为-1。
如果我们的超平面能够完全正确的分类上图中的样本点,假设决策面正好处于间隔区域的中轴线上,并且相应的支持向量对应的样本点到决策面的距离为d,那么公式可以写成:
上述公式的解释是对于所有的分类标签为+1和-1的样本点,他们到决策面的距离都大于等于d,我们将上述公式的左右两边都除以d,就可以得到:
其中:
因为||w||和d都是标量。所以上述公式的两个矢量,依然描述一条直线的法向量和截距。
上述两个公式,都是描述一条直线,数学模型代表的意义是一样的。现在,让我们对和重新起个名字,就叫它们w和b。因此,我们就可以说:"对于存在分类间隔的两类样本点,我们一定可以找到一些超平面,使其对于所有的样本点均满足下面的条件:"
之所以将样本点不同类别标记为+1和-1,就是这样方便我们将上述方程变成如下的形式:
这样我们就得到了我们需要优化的变量d的约束条件,在回过来,刚才我们只是初步得到了目标函数,现在我们是不是可以将这个目标函数更简洁的表达出来呢?
因为我们是用支持向量上的样本点求解d的最大化问题,而支持向量上的点满足
所以目标函数可以化简为:
因为,我们只关心支持向量上的点。随后我们求解d的最大化问题变成了||w||的最小化问题。进而||w||的最小化问题等效于:
这样做的原因是为了让我们在后续最优化过程中对目标函数求导时比较方便,并且这样做不影响最优化问题最后的求解。现在我们将最终的目标函数和约束条件放在一起:
这里n是样本点的总个数,缩写s.t.表示"Subject to",是"服从某某条件"的意思。上述公式描述的是一个典型的不等式约束条件下的二次型函数优化问题,同时也是支持向量机的基本数学模型。
求解准备
在现实生活中,我们遇到的多元值最优化问题一般包含以下三种情况:
- 无条件约束的优化问题
- 有等式约束的优化问题
- 有不等式约束的优化问题
第一种情况比较简单,既然没有任何约束条件,我们就可以用高中的知识,即Fermat引理来进行计算,也就是对f(x)求导,得到其导数为0所对应的x值就是局部最优解,当然,若是f(x)是一个凸函数的话,那么就是全局最优解。
什么是凸函数?这里给大家展示一个二维向量凸函数的示意图:
可以看到,对于区间上的任意两个向量x1和x2,都存在:
那么这样的函数就是凸函数。
求解第二种情况,即带等式约束条件的优化问题,就要用到拉格朗日乘子法,首先来了解拉格朗日乘子法,比如说下面这个:
这是一个带等式约束的优化问题,有目标值,有约束条件。那么想想假设没有约束条件这个问题是怎么求解的呢?是不是直接f对各个x求导等于0,,解x就可以了,可以看到没有约束的话,求导为0,那么各个x均为0吧,这样f=0了,最小,但是x都为0不满足约束条件呀!所以我们有了约束就不能对目标函数直接求导,那么如果把约束去掉不就可以了吗?怎么去掉呢?这才需要拉格朗日方法。既然是等式约束,那么我们把这个约束乘一个系数加到目标函数中去,这样就相当于既考虑了原目标函数,也考虑了约束条件,比如上面那个函数,加进去就变为:
这里可以看到与α1,α2相乘的部分都为0,所以α1,α2的取值为全体实数。现在这个优化目标函数就没有约束条件了吧,既然如此,求法就简单了,分别对x求导等于0,如下:
把它在带到约束条件中去,可以看到,2个变量两个等式,可以求解,最终可以得到α1=−0.39,α2=−1.63,这样再带回去求x就可以了。那么一个带等式约束的优化问题就通过拉格朗日乘子法完美的解决了。那么更高一层的,带有不等式的约束问题怎么办?那么就需要用更一般化的拉格朗日乘子法即KKT条件来解决这种问题了。
现在我们回过头来看刚才我们得到的SVM的基本模型:
是不是就是一个典型的含有不等式的约束问题。接下来我们将求解SVM基本模型的步骤分为四步。
第一步:拉格朗日函数的转化
由刚才带等式的约束优化求解问题中所提到的方法,将不等式约束条件也调加到目标函数中,那么我们的基本模型就变成如下所示:
其中αi是拉格朗日乘子,αi大于等于0,这是我们构造新目标函数时引入的系数变量(我们自己设置)。现在我们令:
于是我们就有了新的目标函数:
(当αi取无穷大时,目标函数自然也就无穷大)
现在,我们的问题变成了求新目标函数的最小值,即:
假设这里得到的最优解为*p,且这个问题是和原问题等价的。
第二步:将不易求解的优化问题转化为易求解的优化
从新目标函数中我们可以看到,先求最大值再求最小值,这样的话,我们首先就要面对带有需要求解的参数w和b的方程,而αi又是不等式约束的系数,这个求解过程不好做。所以,我们需要使用拉格朗日函数对偶性,将最小和最大的位置交换一下,这样就变成了:
假设对偶转化后目标函数的最优解为*d,那么有*d<=*p(证明过程);我们关心的是*d=*p的时候,这就是我们需要得到的最优解。那么满足什么条件才能使得*d=*p,答案就是KKT条件。
KKT条件
KKT条件的全称是Karush-Kuhn-Tucker条件,KKT条件是说最优值条件必须满足以下条件:
- 条件一:经过拉格朗日函数处理之后的新目标函数L(w,b,α)对x求导为零:
- 条件二:h(x) = 0;
- 条件三:α*g(x) = 0;
对于我们的优化问题:
因为没有等式约束,所以条件2满足了,条件1和条件3的证明可以参考这里。
这里已经给出了很好的解释。现在,凸优化问题和KKT都满足了,问题转换成了对偶问题。而求解这个对偶学习问题,可以分为三个步骤:首先要让L(w,b,α)关于w和b最小化,然后求对α的极大,最后利用SMO算法求解对偶问题中的拉格朗日乘子。现在,我们继续推导。
求解最优值
上面我们推导出了原始目标函数经过拉格朗日对偶转化过后的新目标函数:
因为要求L关于w,b的最小值,那么使L关于w,b的偏导数等于0
将上式代入L,得到:
这样,我们就得到了L关于w,b的最小值,上述式子的结果为:
将上式的目标函数极大转化为极小,就得到下面与之等价的对偶最优化问题:
因此,我们现在就要求最外侧的最小值,这个最小值和αi有关联,而怎么求出这个αi,对于线性可分支持向量机我们直接结合目标函数和约束条件就可以求出来。求出αi后,就可以按照下面这个式子求出对应于最优解αi的w和b:
但是,训练数据集线性可分是理想的情形。在现实问题中,训练数据集往往是线性不可分的,即在样本中出现噪声或特异点。此时,有更普适的学习算法。
线性支持向量机和软间隔最大化
因为我们的训练数据中会有一些特异点,不能满足函数间隔大于等于1的约束条件,因此为了将这些数据尽可能的合理划分,我们引入了一个松弛变量和惩罚系数C>0,使得函数间隔加上松弛变量的值大于等于1,因此原来的约束条件和目标函数就变为:
惩罚系数C值大时对误分类的惩罚增大,C值小时对误分类的惩罚减小 。上述式子的含义是:使得尽量小即间隔尽量大,同时使误分类的点个数尽量少,C是调和这两者的参数。
因此对于线性不可分的训练数据集,线性支持向量机的学习问题(原始问题)为:
s.t.
对偶问题求解
原始最优化问题的拉格朗日函数形式为:
对偶问题是拉格朗日的极大极小问题, 首先求对 的极小,由:
得:
将这三个条件代入原始最优化问题对应的拉格朗日函数中,再求关于α的极大值,就能得到原始问题所对应的对偶问题:
设是对偶问题的一个解, 若存在a*的一个分量,适合条件,则原始问题的解w*,b*可按下式求得:
因为对任一适合条件的,都可以求出一个b*,所以实际计算时可以取在所有符合条件的样本点上的平均值。
线性不可分情况下的支持向量要比线性可分的情况复杂一点,软间隔的支持向量xi或者在间隔边界上,或者在间隔边界与分离超平面之间,或者在分离超平面误分一侧。如下所示,分离超平面由实线表示,间隔边界由虚线表示,正例点由“○”表示,负例点由“×”表示 :
总结
对解线性分类问题, 线性分类支持向量机是一种非常有效的方法。 但是, 有时分类问题是非线性的, 这时我们可以使用非线性支持向量机。 关于非线性支持向量机,我们将在下篇文章继续阐述。