本文共 3063 字,大约阅读时间需要 10 分钟。
SVM算法在1995年正式发表,在针对中小型数据规模的分类任务上有着卓越的效果,同时有着完整的理论证明。在20世纪末的几年和21世纪初,SVM完胜了神经网络,吴恩达在其2003年的《Machien learning》公开课上用两节课的时间对其进行讲解,而神经网络讲解了20min左右。SVM算法把神经网络按在地上摩擦了大概15年的时间,直到深度学习的兴起。但即便这样,现在SVM算法依旧被广泛使用。
SVM可以不准确地分为三个程度的理解:
线性可分情况下的线性分类器,这是最原始的SVM,其核心思想是最大的分类间隔(margin maximization)。
线性不可分情况下的线性分类器,引入了软间隔(soft margin)的概念。
线性不可分情况下的非线性分类器,是SVM与核函数(kernel function)的结合。
相比神经网络,SVM有着完备的数学理论依据,完整学习过SVM的人会觉得它的数学理论非常完美。
SVM的基本型
SVM的最大分类间隔的灵感来自于一个非常符合直觉的观察:如果存在两类数据,数据的特征是二维的,那么我们就可以把数据画在一个二维平面上,此时我们想找到一个决策面(决策边界)去将这两类数据分开。理论上这个决策边界有无数种选择,但哪一种是最好的分类方式呢?SVM算法认为在上图中靠近决策平边界的点(正负样本)与决策边界的距离最大时,是最好的分类选择。
上图中红色的线就是要优化的目标,它表征了数据到决策边界的距离,这个距离就是所谓的最大分类间隔,也即上图Gap的一半。同时在上面的几个数据,如果靠近两侧的数据少了几个,也不会影响决策边界的确定,而被红色框框出来三个数据才决定了最终的决策边界,所以这三个数据被称之为支持向量。
如何用数学方式表示出最大间隔呢?首先,样本空间下超平面的线性方程为:
W^{T}·x - b = ±1其中W是超平面的法向量,b是超平面的偏置项。支持向量机(没有加核函数)就是个线性的分类器,它的卓越性能就体现在在线性分类器基础上的最大分类间隔。已知一个超平面和点x(x1,x2,x3......xn),那么这个点到这个超平面的距离为:
1 / ||W||向量表示法为:||W||所以支持向量到超平面的距离为:1 / ||W||决策边界两边的线之间的距离(最大间隔)为:
2 / ||W||这就是SVM的优化目标,它想要找到其最大值,然后大家可能发现了,这个目标里面没有b,之和w有关,那么是不是任意的b都可以呢?显然不是的,这个优化有一个约束条件,因为推导的过程就有假设条件是几个支持向量要求在超平面两侧。
因此,我们最终的目标函数为:
minimize 1 / ||W||转化为求最小值问题更加方便:minimize 1 / ||W||SVM的对偶问题
我们希望求解SVM的基本型来得到最大间隔划分超平面的模型。模型参数为W,b,也就是要解出W和b。这是一个凸二次规划问题,我们可以用拉格朗日乘子法转化为求和原问题等价的对偶问题,这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然地引入核函数,进而推广到非线性分类问题。
根据拉格朗日乘子法:就是求函数f(x1,x2,…)在g(x1,x2,…)=0的约束条件下的极值的方法。其主要思想是将约束条件函数与原函数联系到一起,使能配成与变量数量相等的等式方程,从而求出得到原函数极值的各个变量的解。即可以求得:
L(w,b,a) = w^T y - C * sum(ξi) + ...
其中a就是拉格朗日乘子法进入的一个新的参数,也就是拉格朗日乘子。那么问题就变成了:minimize w^T y - C * sum(ξi)满足约束条件:y_i * (W^T x_i - b) ≥ 1 - ξ_iξ_i ≥ 0n+1个约束条件。对偶问题就是:
maximize a^T y满足:a_i ≥ 0a_i * y_i = 1a_i * (W^T x_i - b) ≤ 1 - ξ_i做这种转换是为了后面的求解方便,因为最小值问题,求导就可以啦!!下面对w和b分别求偏导(这里是纯数学计算,直接给结果了):
∂L/∂w = y - 2a * W∂L/∂b = -a代入到L(w,b,a)中:W = (y - 2a * W) / (2a)b = -a所以问题被转化成为:
maximize a^T y满足:a_i ≥ 0a_i * y_i = 1a_i * (W^T x_i - b) ≤ 1 - ξ_i最后的对偶问题就是:
maximize a^T y满足:a_i ≥ 0a_i * y_i = 1a_i * (W^T x_i - b) ≤ 1 - ξ_i引入松弛因子
为什么要引入松弛因子?从前面的内容来看,SVM理论可以完美的找到正负样本间的最大的分类间隔,这意味着不仅仅可以实现对训练数据的分类,还保证了决策平面是最理想的。那么SVM为什么还要引入松弛因子呢?
最开始讨论支持向量机的时候,我们就假定,数据是线性可分的,亦即我们可以找到一个可行的超平面将数据完全分开。后来为了处理非线性数据,使用核方法对原来的线性SVM进行了推广,使得非线性情况也能处理。虽然通过映射将原始数据映射到高维空间之后,能够线性分隔的概率大大增加,但是对于某些情况还是很难处理。
例如可能并不是因为数据本身是非线性结构的,而只是因为数据有噪音。对于这种偏离总体样本的样本点,使得求得的超平面并非最优超平面;存在严重偏离总体样本的样本点,使得样本结构线性不可分。
在原有的约束条件上加入一个松弛因子,要求ζ>0,那么约束条件变为:
W^T x_i - b ≥ 1 - ζ_iζ_i ≥ 0n个约束条件。目标函数同样发生变化:
minimize 1 / ||W||这个目标函数的变化是通过间隔松弛向量的范数定义的泛化误差界推导的出来,但是这不是SVM的重点,重点在于改变的目标函数对决策平面的影响。除了一阶软间隔分类器,SVM的目标函数还有二阶软间隔分类器的形式:
minimize 1 / ||W|| + C * sum(ζ_i)这里的约束条件是2n个。
软分类间隔问题的求解
上式目标函数的求解步骤推导与前面一样,具体可见。最终的对偶问题就是:
maximize a^T y满足:a_i ≥ 0a_i * y_i = 1a_i * (W^T x_i - b) ≤ 1 - ζ_i这个结果和原对偶问题的结果很像,只是约束条件多了上线C。最后利用SMO算法求解即可找到超平面参数。
总结
SVM的思想是找到划分类别的最优超平面,使得分类间隔最大化。根据超平面方程得到最初分类函数,最大化分类间隔,max1 / ||W||,min1 / 2 ||W||^2,凸二次规划问题,利用拉格朗日函数转化为求原问题的对偶问题(满足KKT条件),利用SMO算法求解对偶问题,都为寻找一个最优解,一个最优分类平面。一步步梳理下来,为什么这样那样,太多东西可以追究,最后实现。
应用
SVM在很多诸如文本分类,图像分类,生物序列分析和生物数据挖掘,手写字符识别等领域有很多的应用,但或许你并没强烈的意识到,SVM可以成功应用的领域远远超出现在已经在开发应用了的领域。
SVM面试笔试问题
参考
最通俗易懂的导出SVM模型
最详细的介绍,理论很强详细而又通俗易懂转载地址:http://eerfk.baihongyu.com/