原始的SVM早在1963年就被发明了,但直到1992年才发明了核方法,使得SVM可以用于非线性分类。
SVM的应用:
handwritten character recognition手写字符识别
face detection 人脸检测
pedestrian detection行人检测
text categorization 文本分类
SVM把训练样本都看作高维空间的点,找一个超平面,使得两类样本尽可能宽地分开。新来的测试样本被映射到同一个空间,看它在hyperlane的哪一侧就能线性二分类。
Note: p维空间是用p-1维的Hyperlane分隔开的。
SVM,顾名思义,支持向量是对于求解学习模型的关键(实际上SVM最终的模型只和支持向量有关,和其他的数据点向量无关),所以问题求解的复杂度直接和支持向量的个数有关。所以先说两个重点基础概念——margin & support vector。
(一) 间隔和支持向量
SVM(Support Vector Machine)的思想和其他线性模型做2分类一样,都是找个超平面(hyperplan)然后一刀切。但SVM这么成功(在90年代直接造成了NN的第二冬),自然有其独到之处,那就是在超平面的概念上,多引入了“间隔”和"支持向量"的概念。
可实现分类的超平面不唯一,我们怎么选择一个更好的超平面呢?直观上,应该是去找位于两类样本的“正中间”的那个。
超平面的方程:
是法向量,他的方向与超平面正交,决定超平面的方向 ;
b是位移项,决定超平面和原点的距离。
这俩参数完全决定了超平面,所以就直接把超平面记为。
(实际上最小二乘回归,逻辑回归好不容易求解出来的线性模型也是个超平面,LDA最后求出来的是个过原点的超平面,b=0)
超平面建模完毕,那么空间中任意一点到它的距离:
不明白可以以二维为例,二维空间的对应的划分超平面是一条直线,点到直线的距离公式为,则点到超平面的距离为,推广到高维就明白上式了。
可正确分类的超平面满足:
but! 我们现在不仅要正确分类,而且要提出更高的标准,要留有“裕量”,即“间隔”:
支持向量support vector:使(2)中不等式的等号成立的那些距离超平面最近的那几个训练样本点。
间隔margin:两个异类支持向量到超平面的距离之和。
(二)SVM的对偶问题推导
前面讲了间隔(硬间隔),我们希望硬间隔尽量大,也就是尽量小,so问题转化为
即
这是个二次规划问题(目标函数是变量的二次函数,约束是变量的线性不等式),并且标准形式中的Q矩阵在这里就是单位阵E,E是正定的,所以这是个凸二次规划,且在约束规定的可行域内有唯一的全局最小解。(关于二次规划详细介绍请移步xxxx)
常见的通用的二次规划算法有椭球法(ellipsoid method),内点法(interior point),增广拉格朗日法(augmented Lagrangian),梯度投影法(gradient projection),etc. 但是这个问题的规模正比于训练样本数,开销很大,所以需要根据问题特点开发更高效的算法,1998年由Platt提出的SMO算法就是典型代表。
先暂时不管具体求解,先把问题再深入分析分析,分析完了再说用SMO怎么求解。
我们先用之前学的拉格朗日乘子法把问题转化为它的对偶问题(dual problem),共m个样本组成的不等式约束,那就引入m个KKT乘子(松弛变量)(这里不明白的话请移步我的这篇博客),把约束写进目标函数中,构造出拉格朗日函数为:
松弛变量(slack variable)和训练样本是一一对应的。(one-to-one relationship)
为了得到拉格朗日对偶函数,对变量求偏导等于0,分别得到:
也就是说,法向量等于m个样本点向量的加权和,加权系数是,且这些加权系数之和为0.
把(3)代回拉格朗日函数(2),得到拉格朗日对偶函数:
则拉格朗日对偶问题为:
记录一下:我至今没懂为啥第二项符号是负??????
由于SVM的模型里有不等式约束,所以必须满足KKT条件:
这三个式子就表明:非支持向量的KKT乘子为0,在式(3)求法向量时根本不做贡献,只有支持向量(满足KKT条件2的样本点)对模型求解有贡献。
(三)对偶问题具体求解(SMO算法)
前面第二节把SVM的基本模型转化为了对偶问题。由于原问题是凸优化问题,且训练样本里一定至少有一个非支持向量使得slater’s condition成立,所以强对偶成立,所以原问题的最优解就是对偶问题的最优解,这节就来具体讲怎么求出对偶问题的参数.
SMO算法是解析的方式求解,而不是数值优化,所以非常高效快速。
基本思路:每次选两个优化变量,固定其他个变量。即初始化参数后,迭代两个步骤till convergence:
- 选一对需要更新的变量
- 固定其他个变量,解析求出更新后的
可以看出,这个思路像极了坐标上升/下降,不过坐标上升/下降是一次优化一个变量,这里一次优化两个而已。那这里为啥要优化俩呢?这是因为第二节的公式(4),也就是最后的对偶问题里有个约束
如果你一次只选一个变量进行优化固定其他个,那这个约束使得被选中的变量也直接固定下来了。。没得优化了。于是那就一次选俩,则有:
把用表示,代回第二节的(4),则对偶问题只有一个变量(),成了一个单变量的二次规划问题,直接对求导等于0,就可以解析求出更新后的,再代入本节(1),求出更新后的。涉及到的全是解析步骤,没有一点数值迭代优化的内容,求出来的都是闭式解(即解析解),所以极其高效。
那么关键问题来了,每次依据什么准则选两个变量呢?
- 第一个变量:选择KKT条件违背程度最大的变量。
我们知道,KKT条件是成为极值点的必要条件,满足KKT则有可能是极值点。现在还没找到极值点,所以KKT肯定不满足。那么优化KKT违背程度越大的变量,目标函数的变化幅度越大。
回顾KKT:
对偶问题中,只有是未知变量,都已知。和有关的只有(1)(3),而(1)是对偶问题的约束,必须满足,所以初始化时一定是满足(1)的。
至于条件(3):
- 若,则 必须为0,所以若,则违背KKT,且越大,违背程度越大。
- 若,则
- 第二个变量:选择对应样本点和第一个变量对应的样本点距离最远的变量。这样两个变量的差别很大,对目标函数带来的变化会比更新两个相似变量大。
求出后,由下式求出:
而偏移项的求解就要用到支持向量了:
但支持向量通常不止一个,所以b的解也不唯一,现实中常用所有支持向量求出的b的平均值作为最终解,这样比较鲁棒:
是支持向量集,是支持向量的个数
由(2)(3),只和支持向量有关。直观上也很好理解,看下图,SVM的思想不像逻辑回归那样去拟合每个样本点,而是直接去找个划分平面把两类分开,那这个平面自然应该在两类的边界向量中间,它的位置和方向(的方向不是划分平面的方向,而是和划分平面正交)都由这两类样本的边界上的点决定。定了后,每个支持向量都能算出一个,对应的平面和我们想要的超平面平行,但过那个支持向量,所以最终用(3)这种方式算,使划分超平面位于两类的正中间。
至此为止,则SVM的线性二分类模型参数全部求解完毕,训练完成。
感觉还是很神奇的,这么简单的一个想法,竟然能写出这么多的复杂的数学推导,而且最后得到的结论还和直观思考结果完全吻合,不得不叹服数学的神奇和强大,把朴素的思想用数学表示出来,很难,但一旦做到了,就贡献老大了。
呜呼!关于引入核方法把SVM用于非线性分类,后面会另开博文详细分析。