文章目录
- 支持向量机的理论推导
- SMO算法
- SMO算法的推导
支持向量机的理论推导
维空间有个样本点 , 对应的标签
下图为线性可分的样本:可以用维超平面来分开维空间的样本,将其分为两个类,即为线性可分
超平面:
当 等于0的时候,便是位于超平面上的点,而大于0的点对应 的数据点,小于0的点对应的点,如下图所示:
接下来的问题是,如何确定这个超平面呢?从直观上而言,这个超平面应该是最适合分开两类数据的直线。而判定“最适合”的标准就是这条直线离直线两边的数据的间隔最大。所以,得寻找有着最大间隔的超平面。
函数间隔:
如果函数间隔中的和成比例变化,则函数间隔也成比例变化,但超平面却没有变,所以只有函数间隔是不够的
几何间隔:
假定对于一个点,令其垂直投影到超平面上的对应点为$ x_0$ ,$w \gammax$到超平面的距离,如下图所示:
根据平面几何知识,有
因为是超平面上的点,所以
为了得到的绝对值,令
如果令,则
之所以令,是为了方便推导和优化,且这样做对目标函数没有影响
最大间隔分类器的目标函数:
于是,目标函数为
约束条件:
目标函数也等价于
因为现在的目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题 。这个问题可以用现成的QP (Quadratic Programming) 优化包进行求解
拉格朗日对偶性
由于这个问题的特殊结构,还可以通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (dual variable) 的优化问题,即通过求解与原问题等价的对偶问题(dual problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题。
那什么是拉格朗日对偶性呢?简单来讲,通过给每一个约束条件加上一个拉格朗日乘子(Lagrange multiplier),定义如下拉格朗日函数(通过拉格朗日函数将约束条件融合到目标函数里去,从而只用一个函数表达式便能清楚的表达出我们的问题):
然后令
容易严重,当某个约束条件不满足,如,那么显然有(只要令即可)。而当约束条件都满足时,则最优值,也就是最开始我们想要最小化的量。
于是,目标函数转化成了求的最小值:
的对偶问题
且。
在满足强对偶条件时,。这个时候就可以通过求解对偶问题来间接求解原始问题。
KKT条件:
有学者在强对偶下提出了KKT条件,且KKT条件的成立要满足约束条件,而约束条件之一就是Slater条件。
所谓Slater条件,即指:凸优化问题,如果存在一个点x,使得所有等式约束都成立,并且所有不等式约束都严格成立(即取严格不等号,而非等号),则满足Slater 条件
。对于此处,Slater 条件成立,所以可以取等号。
一般的,一个最优化数学模型能够表示成以下标准形式:
其中是需要最小化的函数,是等式约束,是不等式约束,和是等式约束和不等式约束的数量
凸优化 的概念:
为凸集,为一凸函数。凸优化就是要找到一个点,使得每个,满足
KKT条件的意义:它是一个非线性规划问题能有最优化解法的充要条件
KKT条件具体指的是:
上门最优化数学模型的标准形式的最小点必须满足以下条件:
经验证,我们这里的问题是满足kkt条件的(首先已经满足slater条件,再者f和gi也是可微的,即L对w和b都可导)
也就是说,原始问题通过满足kkt条件,转化成了对偶问题。而求解这个对欧问题,先求, 再求对的极大,最后用SMO算法求解对偶问题中的拉格朗日乘子
对偶问题求解的三个步骤:
1、首先固定,求
分别对和求偏导数,令其=0
将结果带入:
2、求对的极大,即是关于对偶问题的最优化问题。经过上面一个步骤的求和,得到的拉格朗日函数式已经没有了变量,只有.即
这样求出了,根据,即可求出。为y=1那一类的点里最小的减去y=-1那一类里最大的,然后除以2。 ,最终得出分离超平面和分类决策函数
3、在求得关于和的最小化,以及对的极大之后,最后一步则可以利用SMO算法求解对偶问题中的拉格朗日乘子
核函数kernel:
大部分数据并不是线性可分,上述所说的超平面很多情况下都不存在。对非线性的情况,svm是选择一个核函数,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。
具体来说,在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。如图所示,一堆数据在二维空间无法划分,从而映射到三维空间里划分:
在遇到核函数之前,用线性学习器学习一个非线性关系,需要选择一个非线性特征集,并将数据写成新的表达形式,这等价于应用一个固定的非线性映射,将数据映射到特征空间,在特征空间中使用线性学习器。因此,
如果有一种方式可以在特征空间中直接计算内积,就像在原始输入点的函数中一样就有可能,将两个步骤融合到一起,建立一个非线性的学习器。这样直接计算的方法称为核函数方法
核是一个函数K,对所有满足
这里是从到内积特征空间F的映射
核函数如何处理非线性数据
来看个核函数的例子。下图两类数据,是线性不可分的。
事实上,上图所述的这个数据集,是用两个半径不同的圆圈加上了少量的噪音生成得到的,所以,一个理想的分界应该是一个“圆圈”而不是一条线(超平面)
如果用和来表示这个二维平面的两个坐标的话,我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程可以写作这样的形式:
注意上面的形式,如果我们构造另外一个五维的空间,其中五个坐标的值分别为
,那么显然,上面的方程在新的坐标系下可以写作:
我们做了这个映射,将映射到,在新的空间中原来的数据变成线性可分。这就是核函数处理非线性问题的基本思想
这里的超平面其实是圆心在轴上的一个正圆: ,因此只需要把它映射到这样一个三维空间即可。
我们上一次得到的最终的分类函数是这样的:
现在则是在映射过后的空间,即:
而其中的 α 也是通过求解如下 dual 问题而得到的:KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲ \max_\alpha &\…
这样一来问题就解决了吗?似乎是的:拿到非线性数据,就找一个映射 ϕ(⋅) ,然后一股脑把原来的数据映射到新空间中,再做线性 SVM 即可。不过若真是这么简单,我这篇文章的标题也就白写了——说了这么多,其实还没到正题呐!其实刚才的方法稍想一下就会发现有问题:在最初的例子里,我们对一个二维空间做映射,选择的新空间是原始空间的所有一阶和二阶的组合,得到了五个维度;如果原始空间是三维,那么我们会得到 19 维的新空间(验算一下?),这个数目是呈爆炸性增长的,这给 ϕ(⋅) 的计算带来了非常大的困难,而且如果遇到无穷维的情况,就根本无从计算了。所以就需要 Kernel 出马了。
不妨还是从最开始的简单例子出发,设两个向量
和,而即是到前面说的五维空间的映射,因此映射过后的内积为:
另外,我们又注意到:
二者有很多相似的地方,实际上,我们只要把某几个维度线性缩放一下,然后再加上一个常数维度,具体来说,上面这个式子的计算结果实际上和映射
之后的内积的结果是相等的(自己验算一下)。区别在于什么地方呢?一个是映射到高维空间中,然后再根据内积的公式进行计算;而另一个则直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果。回忆刚才提到的映射的维度爆炸,在前一种方法已经无法计算的情况下,后一种方法却依旧能从容处理,甚至是无穷维度的情况也没有问题。
我们把这里的计算两个向量在映射过后的空间中的内积的函数叫做核函数 (Kernel Function) ,例如,在刚才的例子中,我们的核函数为:
核函数能简化映射空间中的内积运算——刚好“碰巧”的是,在我们的 SVM 里需要计算的地方数据向量总是以内积的形式出现的。对比刚才我们写出来的式子,现在我们的分类函数为:
其中 由如下 dual 问题计算而得:
KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲ \max_\alpha &\…
这样一来计算的问题就算解决了,避开了直接在高维空间中进行计算,而结果却是等价的,实在是一件非常美妙的事情!当然,因为我们这里的例子非常简单,所以我可以手工构造出对应于 φ(⋅) 的核函数出来,如果对于任意一个映射,想要构造出对应的核函数就很困难了。
最理想的情况下,我们希望知道数据的具体形状和分布,从而得到一个刚好可以将数据映射成线性可分的 ϕ(⋅) ,然后通过这个 ϕ(⋅) 得出对应的 κ(⋅,⋅) 进行内积计算。然而,第二步通常是非常困难甚至完全没法做的。不过,由于第一步也是几乎无法做到,因为对于任意的数据分析其形状找到合适的映射本身就不是什么容易的事情,所以,人们通常都是“胡乱”选择映射的,所以,根本没有必要精确地找出对应于映射的那个核函数,而只需要“胡乱”选择一个核函数即可——我们知道它对应了某个映射,虽然我们不知道这个映射具体是什么。由于我们的计算只需要核函数即可,所以我们也并不关心也没有必要求出所对应的映射的具体形式。 ?
当然,说是“胡乱”选择,其实是夸张的说法,因为并不是任意的二元函数都可以作为核函数,所以除非某些特殊的应用中可能会构造一些特殊的核(例如用于文本分析的文本核,注意其实使用了 Kernel 进行计算之后,其实完全可以去掉原始空间是一个向量空间的假设了,只要核函数支持,原始数据可以是任意的“对象”——比如文本字符串),通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数),例如:
- 多项式核。显然刚才我们举的例子是这里多项式核的一个特例(R=1,d=2)。虽然比较麻烦,而且没有必要,不过这个核所对应的映射实际上是可以写出来的,该空间的维度是 C(m+d,d) ,其中 m 是原始空间的维度。
- 高斯核
这个核就是最开始提到过的会将原始空间映射为无穷维空间的那个家伙。不过,如果 σ 选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果 σ 选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数 σ ,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。 - 线性核 κ(x1,x2)=⟨x1,x2⟩ ,这实际上就是原始空间中的内积。这个核存在的主要目的是使得“映射后空间中的问题”和“映射前空间中的问题”两者在形式上统一起来了。
核函数的本质
上面说了这么一大堆,读者可能还是没明白核函数到底是个什么东西?我再简要概括下,即以下三点:
- 实际中,我们会经常遇到线性不可分的样例,此时,我们的常用做法是把样例特征映射到高维空间中去(如上文2.2节最开始的那幅图所示,映射到高维空间后,相关特征便被分开了,也就达到了分类的目的);
- 但进一步,如果凡是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到可怕的(如上文中19维乃至无穷维的例子)。那咋办呢?
- 此时,核函数就隆重登场了,核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数绝就绝在它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算。
使用松弛变量处理outliers方法
用黑圈圈起来的那个蓝点是一个 outlier ,它偏离了自己原本所应该在的那个半空间,如果直接忽略掉它的话,原来的分隔超平面还是挺好的,但是由于这个 outlier 的出现,导致分隔超平面不得不被挤歪了,变成途中黑色虚线所示(这只是一个示意图,并没有严格计算精确坐标),同时 margin 也相应变小了。当然,更严重的情况是,如果这个 outlier 再往右上移动一些距离的话,我们将无法构造出能将数据分开的超平面来。
为了处理这种情况,SVM 允许数据点在一定程度上偏离一下超平面。例如上图中,黑色实线所对应的距离,就是该 outlier 偏离的距离,如果把它移动回来,就刚好落在原来的 超平面 蓝色间隔边界上,而不会使得超平面发生变形了。
OK,继续回到咱们的问题。我们,原来的约束条件为:
现在考虑到outlier问题,约束条件变成了:
其中称为松弛变量,对应数据点允许偏离functional margin的量。当然,如果任意大的话,那任何超平面都是符合条件的了,所以我们在原来的目标函数后面加上一项,使得这些的综合也要最小:
其中C是一个参数,用于控制目标函数中两项(寻找间隔最大的超平面和保证数据点偏差量最小)之间的权重。完整的最优化问题变成了这样:
用之前的方法将限制或约束条件加入到目标函数中,得到新的拉格朗日函数,如下所示:
分析方法和前面一样,转化为另一个问题后,我们先让对和最小化:
将代回化并化简,得到和原来一样的目标函数:
不过,由于我们得到,又有则有 。整个最优化问题现在变成了:
之前的最优化问题是:
可以看到唯一的区别就是现在 多了一个上限 C。而 Kernel 化的非线性形式也是一样的,只要把换成即可。这样一来,一个完整的,可以处理线性和非线性并能容忍噪音和 outliers 的支持向量机才终于介绍完毕了
SMO算法
最后我们得到的最优化问题是:
等价于求解:
SMO算法的推导
SMO算法的思路:启发式抽取两个乘子,,固定其他乘子,使得目标函数只是的函数。这样,不断地从一堆乘子中抽取两个求解,不断的迭代求解子问题,最终收敛,即达到求解原问题的目的。
原对偶问题的子问题的目标函数可以表示为:
$$$$