最近又从新复习了一遍支持向量机(SVM)。其实我的感受SVM总体能够分红三个部分:html
1. SVM理论自己:包括最大间隔超平面(Maximum Margin Classifier),拉格朗日对偶(Lagrange Duality),支持向量(Support Vector),核函数(Kernel)的引入,松弛变量的软间隔优化(Outliers),最小序列优化(Sequential Minimal Optimization)等。算法
2. 核方法(Kernel):其实核方法的发展是能够独立于SVM来看待的,核方法在不少其它算法中也会应用到。缓存
3. 优化理论:这里主要介绍的是最小序列优化(Sequential Minimal Optimization),优化理论的发展也是独立于SVM的。函数
SVM的理论基础在上一篇博客的总结中能够参考:http://www.cnblogs.com/bentuwuying/p/6444249.html。工具
对于支持向量机(SVM)的简单总结:学习
我的以为SMO又能够分为两部分:优化
(1)如何选择每次迭代时候的目标工做集,即选择哪两个拉格朗日乘子来迭代。spa
(2)如何对选择好的工做集(拉格朗日乘子)进行更新迭代。.net
SMO就是要解这个凸二次规划问题,这里的C是个很重要的参数,它从本质上说是用来折中经验风险和置信风险的,C越大,置信风险越大,经验风险越小;而且全部的拉格朗日乘子都被限制在了以C为边长的大盒子里。SMO的出现使得咱们没必要去求助于昂贵的第三方工具去解决这个凸二次规划问题,目前对它的改进版本不少,这一节先介绍它的最初形式和思想。3d
SMO是Microsoft Research的John C. Platt在《Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines》一文中提出的,其基本思想是将Vapnik在1982年提出的Chunking方法推到极致,即:经过将原问题分解为一系列小规模凸二次规划问题而得到原问题解的方法,每次迭代只优化由2个点组成的工做集,SMO算法每次启发式地选择两个拉格朗日乘子同时固定其它拉格朗日乘子来找到这两个拉格朗日乘子的最优值,直到达到中止条件。
SMO是以C-SVC的KKT条件为基础进行后续操做的,这个KKT条件是:
其中
上述条件其实就是KT互补条件,SVM学习——软间隔优化一文,有以下结论:
从上面式子能够获得的信息是:当时,松弛变量
,此时有:
,对应样本点就是误分点;当
时,松弛变量
为零,此时有
,对应样本点就是内部点,即分类正确而又远离最大间隔分类超平面的那些样本点;而
时,松弛变量
为零,有
,对应样本点就是支持向量。
对于凸优化问题,在实现时总须要适当的中止条件来结束优化过程,中止条件能够是:
一、监视目标函数的增加率,在它低于某个容忍值时中止训练,这个条件是最直白和简单的,可是效果很差;
二、监视原问题的KKT条件,对于凸优化来讲它们是收敛的充要条件,可是因为KKT条件自己是比较苛刻的,因此也须要设定一个容忍值,即全部样本在容忍值范围内知足KKT条件则认为训练能够结束;
三、监视可行间隙,它是原始目标函数值和对偶目标函数值的间隙,对于凸二次优化来讲这个间隙是零,以一阶范数软间隔为例:
原始目标函数与对偶目标函数
的差为:
定义比率:,能够利用这个比率达到某个容忍值做为中止条件。
沿袭分解思想,固定“Chunking工做集”的大小为2,每次迭代只优化两个点的最小子集且可直接得到解析解,算法流程:
为了描述方便定义以下符号:
因而目标函数就变成了:
注意第一个约束条件:,能够将
看做常数,有
(
为常数,咱们不关心它的值),等式两边同时乘以
,获得
(
为常数,其值为
,咱们不关心它,
)。将
用上式替换则获得一个只含有变量
的求极值问题:
这下问题就简单了,对求偏导数获得:
将、
带入上式有:
带入、
,用
,表示偏差项(能够想象,即便分类正确,
的值也可能很大)、
(
是原始空间向特征空间的映射),这里
能够当作是一个度量两个样本类似性的距离,换句话说,一旦选择核函数则意味着你已经定义了输入空间中元素的类似性。
最后获得迭代式:
注意第二个约束条件——那个强大的盒子:,这意味着
也必须落入这个盒子中,综合考虑两个约束条件,下图更直观:
和
异号的情形
和
同号的情形
能够看到两个乘子既要位于边长为C的盒子里又要在相应直线上,因而对于
的界来讲,有以下状况:
整理得下式:
又由于,
,消去
后获得:
根据选择的中止条件能够肯定怎么样选择点能对算法收敛贡献最大,例如使用监视可行间隙的方法,一个最直白的选择就是首先优化那些最违反KKT条件的点,所谓违反KKT条件是指:
由前面的中止条件3可知,对可行间隙贡献最大的点是那些
其中,
取值大的点,这些点致使可行间隙变大,所以应该首先优化它们,缘由以下:
一、当知足KKT条件:即时,
当违背KKT条件:即时,
,因而
可见,因为违背KKT条件致使可行间隙变大;
二、当知足KKT条件:即时,
当违背KKT条件:即时
若则
且
,其中
若则
且
,其中
可见,因为违背KKT条件依然致使可行间隙变大;
三、当知足KKT条件:即时,
当违背KKT条件:即时,
且
,其中
可见,因为违背KKT条件仍是会致使可行间隙变大。
SMO的启发式选择有两个策略:
启发式选择1:
最外层循环,首先,在全部样本中选择违反KKT条件的一个乘子做为最外层循环,用“启发式选择2”选择另一个乘子并进行这两个乘子的优化,接着,从全部非边界样本中选择违反KKT条件的一个乘子做为最外层循环,用“启发式选择2”选择另一个乘子并进行这两个乘子的优化(之因此选择非边界样本是为了提升找到违反KKT条件的点的机会),最后,若是上述非边界样本中没有违反KKT条件的样本,则再从整个样本中去找,直到全部样本中没有须要改变的乘子或者知足其它中止条件为止。
启发式选择2:
内层循环的选择标准能够从下式看出:
要加快第二个乘子的迭代速度,就要使最大,而在
上没什么文章可作,因而只能使
最大。
肯定第二个乘子方法:
一、首先在非界乘子中寻找使得最大的样本;
二、若是1中没找到则从随机位置查找非界乘子样本;
三、若是2中也没找到,则从随机位置查找整个样本(包含界上和非界乘子)。
由式子
可知:
因而对于这个单变量二次函数而言,若是其二阶导数,则二次函数开口向下,能够用上述迭代的方法更新乘子,若是
,则目标函数只能在边界上取得极值(此时二次函数开口向上),换句话说,SMO要能处理
取任何值的状况,因而在
时有如下式子:
一、时:
二、时:
三、
分别将乘子带入获得两种状况下的目标函数值: 和
。显然,哪一种状况下目标函数值最大,则乘子就往哪儿移动,若是目标函数的差在某个指定精度范围内,说明优化没有进展。
另外发现,每一步迭代都须要计算输出进而获得
,因而还要更新阈值
,使得新的乘子
、
知足KKT条件,考虑
、
至少有一个在界内,则须要知足
,因而
的迭代能够这样获得:
一、设在界内,则:
又由于:
因而有:
等式两边同乘后移项得:
;
二、设在界内,则:
;
三、设、
都在界内,则:状况1和状况2的
值相等,任取一个;
四、设、
都不在界内,则:
取值为状况1和状况2之间的任意值。
从实现上来讲,对于标准的SMO能提升速度的地方有:
一、能用缓存的地方尽可能用,例如,缓存核矩阵,减小重复计算,可是增长了空间复杂度;
二、若是SVM的核为线性核时候,可直接更新,毕竟每次计算
的代价较高,因而能够利用旧的乘子信息来更新
,具体以下:
,应用到这个性质的例子能够参见SVM学习——Coordinate Desent Method。
三、关注能够并行的点,用并行方法来改进,例如可使用MPI,将样本分为若干份,在查找最大的乘子时能够如今各个节点先找到局部最大点,而后再从中找到全局最大点;又如中止条件是监视对偶间隙,那么能够考虑在每一个节点上计算出局部可行间隙,最后在master节点上将局部可行间隙累加获得全局可行间隙。
对标准SMO的改进有不少文献,例如使用“Maximal Violating Pair ”去启发式的选择乘子是一种颇有效的方法,还有使用“ Second Order Information”的方法,我以为理想的算法应该是:算法自己的收敛速度能有较大提升,同时算法可并行程度也较高。
前面提到过,SMO能够分为两部分:
(1)如何选择每次迭代时候的目标工做集,即选择哪两个拉格朗日乘子来迭代。
(2)如何对选择好的工做集(拉格朗日乘子)进行更新迭代。
而如何选择工做集,是SMO算法很重要的一个部分,由于不一样的选择方式能够致使不一样的训练速度。
Rong-En Fan等人在2005的paper《Working Set Selection Using Second Order Information for Training Support Vector Machines》介绍了每次迭代时几种不一样的工做集选择方法。
首先仍是放出SMO须要优化的目标函数:
这个working set selection是Keerthi等人在2001年提出的,在2001年发布的libSVM中有所应用。
该working set selection能够由(1)式的KKT条件得出:假设存在向量是(1)式的解,则必然存在实数
和两个非负向量
使得下式成立:
其中,是目标函数的梯度。
上面的条件能够被重写为:
进一步,有
令,
则目标函数存在最优解的条件是:
由上面这个关于“Violating pair”的定义能够看出,最大程度上违反(6)式条件的{i, j} pair 便是working set的最佳选择,由于咱们须要对这些最违反(6)式的{i, j} pair作更新迭代,让它们符合(6)式的要求,便会逐步让目标函数获得最优值。具体的理论定理以下:
有趣的是,选择最大程度上违反KKT条件的{i, j} pair 与 “求目标函数的一阶近似的最小值”时候取得的{i, j} pair是一致的。即经过WSS 1得到的{i, j} pair知足:
经过定义,(8a)的目标函数便是对
的一阶近似进行求最优解:
其中,是因为
,而(8b)和(8c)是因为
。因为(8a)是线性函数,
则避免了目标函数取值无穷小。
第一眼看上去,(7)式彷佛须要对全部的拉格朗日乘子遍历一遍才可以找出最优的{i,j} pair,然而,WSS 1能够在线性时间复杂度内找到最优值。证实以下:
上面是使用了目标函数的一阶近似做为代替进行优化,因而乎,咱们能够再进一步,使用目标函数的二阶近似做为代替进行优化:
下面的理论证实按照WSS 2能够有效地解决(11)式中的最优值问题:
前面的方法并无涵盖的状况,对于这种状况,Chen等人在2006年给出了解决方法:
因而,使用WSS 3来对SMO-type 分解方法选择working set的步骤为: