机器学习教程 之 支持向量机:模型篇3–对偶问题的求解: SMO算法

支持向量机是机器学习领域里最强的几种分类器之一,被广泛的运用于各种分类回归问题,如果不考虑集成学习算法以及近几年出现的深度学习算法,支持向量机的性能可以说是在学习领域具有统治地位,在一些中小型的数据集上它的性能甚至能够超过一些深度学习网络。其基本原理相当简单,但是模型的求解和优化却十分复杂,很难描述清楚,这里我会一步一步,尽我所能分章节的将它总结完善


模型篇

· 支持向量机:模型篇1–支持向量与间隔
· 支持向量机:模型篇2–支持向量的拉格朗日对偶
· 支持向量机:模型篇3–对偶问题的求解: SMO算法
· 支持向量机:模型篇4–核函数与非线性优化
· 支持向量机:模型篇5–向量机的软间隔拓展

代码篇

· 支持向量机:代码篇1-基于CVXPT优化函数求解
· 支持向量机:代码篇2-基于SMO算法求解


对偶问题的求解: SMO算法

在上一章节中,我们将支持向量机的原始模型转化为了对偶形式。之前有提到,这一转化的重要意义在于提前计算 w 并消除了 w,将优化函数变为了关于拉格朗日乘子的二次规划问题。对于这一问题,学者们有针对性的提出了很多解法,其中目前被普遍应用的是由Microsoft Research的John C.Platt在1998年发表的论文《Sequential Minimal Optimaization A Fast Algorithm for Training Support Vector Machines》中提出的SMO算法,它成为当时最快的二次规划优化算法,特别是在针对线性SVM和数据稀疏等问题时更表现出强大的性能。
Platt论文中的符号表示与本文有所不同,现在,我们首先会重新列出上一章节中我们得到的优化目标,描述SMO算法的主要思想,再将优化目标转化为Platt论文中的形式,以方便描述,最后给出解决方案

1. 对偶优化目标和SMO算法原理

上一章节中我们得到的对偶优化目标为:

maxani=1ai12ni,j=1aiajyiyjxTixj

s.t.ai>=0,i=1,...,n

ni=1aiyi=0

为了求解的完整性,这里我们需要提前对 ai 加上一个关于松弛变量的约束,关于这一约束我们会在之后第五章节的软间隔与正则化中详细描述,读者们不需要过于纠结(加入松弛变量的目的是为了让模型在训练时不必完全的将两类样本划分开,允许一些离群的样本点出现在向量机所划分的间隔当中,以获得在测试集上更好的划分效果)。加入松弛变量后,模型转化为

maxani=1ai12ni,j=1aiajyiyjxTixj

s.t.C>=ai>=0,i=1,...,n

ni=1aiyi=0

现在我们要解决的是调节参数 a1,a2,...,an 以求得优化目标的最大值, xiyi 都是已知数, C 由我们预先设定,也是已知数。在SMO算法中,我需要固定住参数 ai 中的除了 a1,a2(这里的a1,a2只是代表其中的两个,下标不一定是1,2) 的其他所有 a,然后在 a1 上求极值。那么既然是在 a1 上求极值,为什么要保留两个参数变化呢?
这是因为,如果固定住了 a1 以外的所有参数,则根据式子 ni=1aiyi=0 我们可以推出 a1 将是个定值,而不再是一个变量。因此,我们需要一次选取两个参数进行优化。比如 a1,a2 ,此时 a2 可以由 a1 和其它式子表示出来,这样回代到目标函数中,原目标函数就是单一变量 a1 的函数了,可解。
SMO算法主要分为两步操作以及循环:

· 使用启发式的方法选取一对 a1a2
· 固定除了a1a2 外的其它参数,确定使目标函数达到极值的 a1 ,其中 a2 可以由 a1 表示
· 重复上述步骤直至算法收敛

这里只是SMO算法的简单描述供读者对SMO有一个大致的把握,关于当中的一些具体细节,我们会在后面详细描述,比如如何进行启发式选取参数、如何更新 a1a2 等。不要着急,我们先把目标函数转化为Platt文章中描述的形式。

mina12ni,j=1aiajyiyjK(xi,xj)ni=1ai

s.t.C>=ai>=0,i=1,...,n

ni=1aiyi=0

可以看出其实质并未发生变化,只是将目标函数取负,由求极大,变为了求极小而已,又将目标函数中的 xTixj记为 K(xi,xj) 表示内积。还有一点,在Platt的文章中,它将向量机划分的超平面 f(x)=wTx+b 写成了如下形式

u=wTxb

其实质都是一样的,相应的, w 可表示为(上一篇有具体推导)

w=ni=1aiyixi

2.KKT条件与启发式选取参数

在上一节SMO两个主要步骤中的第一步就是以启发式的方法选取一对 a1a2,现在我们来结合KKT条件具体说一下这个启发式方法。SMO算法注意到只需选取的 a1a2 中有一个不满足 KKT条件,目标函数就会越优,直观来看,KKT条件违背的程度越大,则变量更新后可能导致的目标函数值优化程度越大。那么什么是违背KKT条件的 a 呢?

在加入了松弛条件C后,我们可以将上一篇博客中提到的KKT重写为

C>=ai>=0yiui1>=0ai(yiui1)=0

对于这三个式子,结合向量机划分超平面的几何意义(下图)我们可以理解为以下几种情况
机器学习教程 之 支持向量机:模型篇3–对偶问题的求解: SMO算法

1. ai=0,yiui1>=0 ,对于这一情况,表明 ai 对应的样本点 (xi,yi)是正常分类,即被超平面合理的划分到了两边,同时在间隔之外
2. C>ai>0,yiui1=0 ,对于这一情况,表明 ai 对应的样本点 (xi,yi)是在分类间隔的边界上,是支持向量
3. C=ai,yiui1<=0 , 对于这一情况,表明 ai 对应的样本点 (xi,yi)是在分类间隔的内部,由于我们允许了松弛条件的出现,这里也认为并没有违反KKT条件

接下来我们来看几种不满足KKT条件的情况
1. yiui1<=0,ai<C则是不满足的,而原本 ai=C
2. yiui1>=0,ai>0则是不满足的,而原本 ai=0
3. yiui1=0,ai=0ai=C则是不满足的,而原本 0<ai<C

SMO算法要做的就是找出这些不满足KKT条件的 a 并且更新它们

3. 参数的迭代更新

现在我们已经知道了怎样选择更新的 a ,但是想要达到优化目标,这些 a 还会受到我们在上一篇博客中提到的除KKT条件以外的约束,即导数条件

Lw=0w=ni=1aiyixi

Lb=0ni=1aiyi=0

因此,SMO算法想出了一个办法,即同时更新 a1,a2,要求满足下列等式:

anew1y1+anew2y2=aold1y1+aold2y2 = 常数

这样就能保证和为常数,利用 a1y1+a2y2= ,消去目标函数中的 a2 ,可以得到一个关于 a1凸二次规划问题,不考虑 C>=a>=0 的约束,可以得到 a1 的更新公式为:

anew1=a1+y1(E2E1)η

这里的 Ei=uiyi,η=K(x1,x1)+K(x2,x2)K(x1,x2)

然后再根据 a1y1+a2y2=ξ() 考虑约束 C>=a>=0 ,由于支持向量机为二分类问题,y的取值可以为 1或者 -1,我们可以将问题分为两种情况即 y1,y2同号和y1,y2异号,我们以两者异号为例,可以做图如下

机器学习教程 之 支持向量机:模型篇3–对偶问题的求解: SMO算法

根据约束,a1,a2既要在矩形方框上,也要在直线上,因此

下界 L = max(0,a_{2}-a_{1})

上界 H = min(C,C+a_{2}-a_{1})

同理,y1,y2同号时

下界 L = max(0,a_{2}+a_{1}-C)

上界 H = min(C,a_{2}+a_{1})

我们就可以得到 a1 的迭代更新解析解为

anew,clipped1=Hifanew1>=Hanew1ifL<anew1<HLifanew1<=L

这里的a1,a2的具体选择方法为

· 对于 a2 ,可以选择遇到的第一个第二节中说到的不满足KKT条件的乘子
· 对于 a1 , 可以找使 |E2E1| 最大的乘子

到这里,我们就说完了乘子 a 更新的全部流程,而 b 每一步也需要更新,因为前面KKT条件指出了 aiyiui 的关系,而 uib 有关,在每一步计算出 a1 后,更据KKT条件来分情况更新 b

b1=bE1y2(aiaold2)K(x2,x2)y1(a1aold1)K(x2,x1)

b2=bE2y2(aiaold2)K(x2,x2)y1(a1aold1)K(x1,x1)

b=b1b2(b1+b2)/2if0<a1<Cif0<a2<Cotherwise

更新完所有的 ai,b 就可以得到支持向量机的模型,即我们在第一篇博客提出的超平面划分公式

f(x)=ni=1aiyiK(xi,x)+b

到这里我们就完成了支持向量机的模型从建立到求解的全部过程,在接下来的两个章节中,我们会将支持向量机的模型扩展到非线性的情况并加入软间隔的概念。