支持向量机是机器学习领域里最强的几种分类器之一,被广泛的运用于各种分类回归问题,如果不考虑集成学习算法以及近几年出现的深度学习算法,支持向量机的性能可以说是在学习领域具有统治地位,在一些中小型的数据集上它的性能甚至能够超过一些深度学习网络。其基本原理相当简单,但是模型的求解和优化却十分复杂,很难描述清楚,这里我会一步一步,尽我所能分章节的将它总结完善
· 支持向量机:模型篇1–支持向量与间隔
· 支持向量机:模型篇2–支持向量的拉格朗日对偶
· 支持向量机:模型篇3–对偶问题的求解: SMO算法
· 支持向量机:模型篇4–核函数与非线性优化
· 支持向量机:模型篇5–向量机的软间隔拓展
· 支持向量机:代码篇1-基于CVXPT优化函数求解
· 支持向量机:代码篇2-基于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论文中的形式,以方便描述,最后给出解决方案
上一章节中我们得到的对偶优化目标为:
现在我们要解决的是调节参数 a1,a2,...,an 以求得优化目标的最大值, xi 和 yi 都是已知数, C 由我们预先设定,也是已知数。在SMO算法中,我需要固定住参数 ai 中的除了 a1,a2 (这里的 a1,a2 只是代表其中的两个,下标不一定是1,2) 的其他所有 a ,然后在 a1 上求极值。那么既然是在 a1 上求极值,为什么要保留两个参数变化呢?
这是因为,如果固定住了 a1 以外的所有参数,则根据式子 ∑ni=1aiyi=0 我们可以推出 a1 将是个定值,而不再是一个变量。因此,我们需要一次选取两个参数进行优化。比如 a1,a2 ,此时 a2 可以由 a1 和其它式子表示出来,这样回代到目标函数中,原目标函数就是单一变量 a1 的函数了,可解。
SMO算法主要分为两步操作以及循环:
· 使用启发式的方法选取一对 a1,a2
· 固定除了 a1,a2 外的其它参数,确定使目标函数达到极值的 a1 ,其中 a2 可以由 a1 表示
· 重复上述步骤直至算法收敛
这里只是SMO算法的简单描述供读者对SMO有一个大致的把握,关于当中的一些具体细节,我们会在后面详细描述,比如如何进行启发式选取参数、如何更新 a1,a2 等。不要着急,我们先把目标函数转化为Platt文章中描述的形式。
可以看出其实质并未发生变化,只是将目标函数取负,由求极大,变为了求极小而已,又将目标函数中的 xTixj 记为 K(xi,xj) 表示内积。还有一点,在Platt的文章中,它将向量机划分的超平面 f(x)=wTx+b 写成了如下形式
在上一节SMO两个主要步骤中的第一步就是以启发式的方法选取一对 a1,a2 ,现在我们来结合KKT条件具体说一下这个启发式方法。SMO算法注意到只需选取的 a1,a2 中有一个不满足 KKT条件,目标函数就会越优,直观来看,KKT条件违背的程度越大,则变量更新后可能导致的目标函数值优化程度越大。那么什么是违背KKT条件的 a 呢?
在加入了松弛条件C后,我们可以将上一篇博客中提到的KKT重写为
接下来我们来看几种不满足KKT条件的情况
1. yiui−1<=0,ai<C 则是不满足的,而原本 ai=C
2. yiui−1>=0,ai>0 则是不满足的,而原本 ai=0
3. yiui−1=0,ai=0或ai=C 则是不满足的,而原本 0<ai<C
SMO算法要做的就是找出这些不满足KKT条件的 a 并且更新它们
现在我们已经知道了怎样选择更新的 a ,但是想要达到优化目标,这些 a 还会受到我们在上一篇博客中提到的除KKT条件以外的约束,即导数条件
因此,SMO算法想出了一个办法,即同时更新 a1,a2 ,要求满足下列等式:
然后再根据 a1y1+a2y2=ξ(常数) 考虑约束 C>=a>=0 ,由于支持向量机为二分类问题, y 的取值可以为 1或者 -1,我们可以将问题分为两种情况即 y1,y2 同号和 y1,y2 异号,我们以两者异号为例,可以做图如下
同理, y1,y2 同号时
我们就可以得到 a1 的迭代更新解析解为
· 对于 a2 ,可以选择遇到的第一个第二节中说到的不满足KKT条件的乘子
· 对于 a1 , 可以找使 |E2−E1| 最大的乘子
到这里,我们就说完了乘子 a 更新的全部流程,而 b 每一步也需要更新,因为前面KKT条件指出了 ai 和 yiui 的关系,而 ui 和 b 有关,在每一步计算出 a1 后,更据KKT条件来分情况更新 b
到这里我们就完成了支持向量机的模型从建立到求解的全部过程,在接下来的两个章节中,我们会将支持向量机的模型扩展到非线性的情况并加入软间隔的概念。