支持向量机通俗导论(理解SVM的三层境地)

作者:July ;致谢:pluskid、白石、JerryLead。
出处:结构之法算法之道blog。

前言

动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因非常简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西也不好讲清楚,尽管网上已经有朋友写得不错了(见文末參考链接),但在描写叙述数学公式的时候还是显得不够。得益于同学白石的数学证明,我还是想尝试写一下,希望本文在兼顾通俗易懂的基础上,真真正正能足以成为一篇完整概括和介绍支持向量机的导论性的文章。

本文在写的过程中,參考了不少资料,包含《支持向量机导论》、《统计学习方法》及网友pluskid的支持向量机系列等等,于此,还是一篇或者-1,分别代表两个不同的类),一个线性分类器的学习目标便是要在n维的数据空间中找到一个超平面(hyper plane),这个超平面的方程能够表示为( wT中的T代表转置):

或-1有疑问,事实上,这个1或-1的分类标准起源于logistic回归,负例的特征远小于0,并且要在全部训练实例上达到这个目标。

接下来,尝试把logistic回归做个变形。首先,将使用的结果标签y = 0和y = 1替换为y = -1,y = 1,然后将)中的替换为b,最后将后面的替换为(即)。如此,则有了。也就是说除了y由y=0变为y=-1外,线性分类函数跟logistic回归的形式化表示没差别。

进一步,能够将假设函数中的g(z)做一个简化,将其简单映射到y=-1和y=1上。映射关系例如以下:

1.2、线性分类的一个样例

下面举个简单的样例,例如以下图所看到的,如今有一个二维平面,平面上有两种不同的数据,分别用圈和叉表示。由于这些数据是线性可分的,所以能够用一条直线将这两类数据分开,这条直线就相当于一个超平面,超平面一边的数据点所相应的y全是 -1 ,还有一边所相应的y全是1。

这个超平面能够用分类函数表示,当f(x) 等于0的时候,x便是位于超平面上的点,而f(x)大于0的点相应 y=1 的数据点,f(x)小于0的点相应y=-1的点,例如以下图所看到的:

注:有的资料上定义特征到结果的输出函数,与这里定义的实质是一样的。为什么?由于不管是,还是,不影响终于优化结果。下文你将看到,当我们转化到优化的时候,为了求解方便,会把yf(x)令为1,即yf(x)是y(w^x + b),还是y(w^x - b),对我们要优化的式子max1/||w||已无影响。

(则将x的类别赋为-1,假设f(x)大于0则将x的类别赋为1。

接下来的问题是,怎样确定这个超平面呢?从直观上而言,这个超平面应该是最适合分开两类数据的直线。而判定“最适合”的标准就是这条直线离直线两边的数据的间隔最大。所以,得寻找有着最大间隔的超平面。

1.3、函数间隔Functional margin与几何间隔Geometrical margin

倍(尽管此时超平面没有改变),所以仅仅有函数间隔还远远不够。

事实上,我们能够对法向量w加些约束条件,从而引出真正定义点到超平面的距离--几何间隔(geometrical margin)的概念。

假定对于一个点 x ,令其垂直投影到超平面上的相应点为 x0 ,w 是垂直于超平面的一个向量,为样本x到分类间隔的距离,例如以下图所看到的:

,当中||w||表示的是范数。

又由于 x0 是超平面上的点,满足 f(x0)=0 ,代入超平面的方程就可以算出:


γ

(有的书上会写成把||w|| 分开相除的形式,如本文參考文献及推荐阅读条目11,当中,||w||为w的二阶泛数)

为了得到的绝对值,令乘上相应的类别 y,就可以得出几何间隔(用表示)的定义:

从上述函数间隔和几何间隔的定义能够看出:几何间隔就是函数间隔除以||w||,并且函数间隔y*(wx+b) = y*f(x)实际上就是|f(x)|,仅仅是人为定义的一个间隔度量,而几何间隔|f(x)|/||w||才是直观上的点到超平面的距离。

1.4、最大间隔分类器M),而对于全部不是支持向量的点,则显然有

OK,到此为止,算是了解到了SVM的第一层,对于那些仅仅关心怎么用SVM的朋友便已足够,不必再更进一层深究其更深的原理。

第二层、深入SVM

2.1、从线性可分到线性不可分

2.1.1、从原始问题到对偶问题的求解

接着考虑之前得到的目标函数:

     由于求的最大值相当于求的最小值,所以上述目标函数等价于(w由分母变成分子,从而也有原来的max问题变为min问题,非常明显,两者问题等价):

由于如今的目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题。这个问题能够用现成的QP (Quadratic Programming) 优化包进行求解。一言以蔽之:在一定的约束条件下,目标最优,损失最小。

此外,由于这个问题的特殊结构,还能够通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (dual variable) 的优化问题,即通过求解与原问题等价的对偶问题(dual problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的长处在于:一者对偶问题往往更easy求解;二者能够自然的引入核函数,进而推广到非线性分类问题。

那什么是拉格朗日对偶性呢?简单来讲,通过给每个约束条件加上一个拉格朗日乘子(Lagrange multiplier),定义拉格朗日函数(通过拉格朗日函数将约束条件融合到目标函数里去,从而仅仅用一个函数表达式便能清楚的表达出我们的问题):

然后令

easy验证,当某个约束条件不满足时,比如,那么显然有(仅仅要令就可以)。而当全部约束条件都满足时,则有,亦即最初要最小化的量。

因此,在要求约束条件得到满足的情况下最小化,实际上等价于直接最小化(当然,这里也有约束条件,就是≥0,i=1,…,n)   ,由于假设约束条件没有得到满足,会等于无穷大,自然不会是我们所要求的最小值。

详细写出来,目标函数变成了:

这里用表示这个问题的最优值,且和最初的问题是等价的。假设直接求解,那么一上来便得面对w和b两个參数,而又是不等式约束,这个求解过程不好做。最好还是把最小和最大的位置交换一下,变成:

交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用来表示。并且有,在满足某些条件的情况下,这两者相等,这个时候就能够通过求解对偶问题来间接地求解原始问题。

换言之,之所以从minmax的原始问题,转化为maxmin的对偶问题,一者由于的近似解,二者,转化为对偶问题后,更easy求解。

下面能够先求L 对w、b的极小,再求L 对的极大。

2.1.2、KKT条件

上文中提到“在满足某些条件的情况下,两者等价”,这所谓的“满足某些条件”就是要满足KKT条件。

一般地,一个最优化数学模型能够表示成下列标准形式:

当中,f(x)是须要最小化的函数,h(x)是等式约束,g(x)是不等式约束,p和q分别为等式约束和不等式约束的数量。

同一时候,得明确下面两点:

  • 凸优化的概念: 为一凸集,  为一凸函数。凸优化就是要找出一点  ,使得每一  满足  。
  • KKT条件的意义:它是一个非线性规划(Nonlinear Programming)问题能有最优化解法的必要和充分条件。

而KKT条件就是指上面最优化数学模型的标准形式中的最小点 x* 必须满足下面的条件:

经过论证,我们这里的问题是满足 KKT 条件的(首先已经满足Slater condition,再者f和gi也都是可微的,即L对w和b都可导),因此如今我们便转化为求解第二个问题。

也就是说,原始问题通过满足KKT条件,已经转化成了对偶问题。而求解这个对偶学习问题,分为3个步骤:首先要让L(w,b,a) 关于 w 和 b 最小化,然后求对的极大,最后利用SMO算法求解对偶问题中的拉格朗日乘子。

2.1.3、对偶问题求解的3个步骤

(1)、首先固定要让 L 关于 w 和 b 最小化,我们分别对w,b求偏导数,即令 ∂L/∂w 和 ∂L/∂b 等于零(对w求导结果的解释请看本文评论下 和 X2 来表示这个二维平面的两个坐标的话,我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程能够写作这样的形式:

注意上面的形式,假设我们构造另外一个五维的空间,当中五个坐标的值分别为 Z1=X1, Z2=X21, Z3=X2, Z4=X22, Z5=X1X2,那么显然,上面的方程在新的坐标系下能够写作:

关于新的坐标 Z ,这正是一个 hyper plane 的方程!也就是说,假设我们做一个映射 ϕ:R2→R5 ,将 X 依照上面的规则映射为 Z ,那么在新的空间中原来的数据将变成线性可分的,从而使用之前我们推导的线性分类算法就能够进行处理了。这正是 Kernel 方法处理非线性问题的基本思想。

再进一步描写叙述 Kernel 的细节之前,最好还是再来看看这个样例映射过后的直观样例。当然,你我可能无法把 5 维空间画出来,只是由于我这里生成数据的时候就是用了特殊的情形,详细来说,我这里的超平面实际的方程是这个样子(圆心在 X2 轴上的一个正圆):

因此我仅仅须要把它映射到 Z1=X21, Z2=X22, Z3=X2 这样一个三维空间中就可以,下图即是映射之后的结果,将坐标轴经过适当的旋转,就能够非常明显地看出,数据是能够通过一个平面来分开的(pluskid:下面的gif 动画,先用 Matlab 画出一张张图片,再用 Imagemagick 拼贴成):

核函数相当于把原来的分类函数:

映射成:

而当中的能够通过求解例如以下 dual 问题而得到的:

这样一来问题就攻克了吗?似乎是的:拿到非线性数据,就找一个映射 ,然后一股脑把原来的数据映射到新空间中,再做线性 SVM 就可以。只是事实上没有这么简单!事实上刚才的方法稍想一下就会发现有问题:在最初的样例里,我们对一个二维空间做映射,选择的新空间是原始空间的全部一阶和二阶的组合,得到了五个维度;假设原始空间是三维,那么我们会得到 19 维的新空间,这个数目是呈爆炸性增长的,这给 的计算带来了非常大的困难,并且假设遇到无穷维的情况,就根本无从计算了。所以就须要 Kernel 出马了。

最好还是还是从最開始的简单样例出发,设两个向量,而即是到前面说的五维空间的映射,因此映射过后的内积为:

(公式说明:上面的这两个推导过程中,所说的前面的五维空间的映射,这里说的前面便是文中2.2.1节的所述的映射方式,回想下之前的映射规则,再看那第一个推导,事实上就是计算x1,x2各自的内积,然后相乘相加就可以,第二个推导则是直接平方,去掉括号,也非常easy推出来)

另外,我们又注意到:

二者有非常多类似的地方,实际上,我们仅仅要把某几个维度线性缩放一下,然后再加上一个常数维度,详细来说,上面这个式子的计算结果实际上和映射

之后的内积的结果是相等的,那么差别在于什么地方呢?

  1. 一个是映射到高维空间中,然后再依据内积的公式进行计算;
  2. 而还有一个则直接在原来的低维空间中进行计算,而不须要显式地写出映射后的结果

(公式说明:上面之中,最后的两个式子,第一个算式,是带内积的全然平方式,能够拆开,然后,通过凑一个得到,第二个算式,也是依据第一个算式凑出来的)

回想刚才提到的映射的维度爆炸,在前一种方法已经无法计算的情况下,后一种方法却依然能从容处理,甚至是无穷维度的情况也没有问题。

我们把这里的计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数 (Kernel Function) ,比如,在刚才的样例中,我们的核函数为:

核函数能简化映射空间中的内积运算——刚好“碰巧”的是,在我们的 SVM 里须要计算的地方数据向量总是以内积的形式出现的。对照刚才我们上面写出来的式子,如今我们的 ,由于 w 是垂直于超平面的一个向量,为样本x到分类间隔的距离,我们有