SMO算法详解(Sequential Minimal Optimization)
写作背景:最近在学SVM算法,在看了一些资料后,发现:很多书籍(例如:《机器学习》)或资料在讲解SVM算法时,都只是讲到了为了计算方便,可以将SVM算法需要求解的原始问题转化为它的对偶问题,然后使用SMO算法求解对偶问题,但是却没有详细解释SMO算法的具体解法。在我苦恼之际,实验室师兄分享给我一篇讲得很好的博客,因此,我将在这里总结一下用于求解对偶问题的SMO算法的具体解法。
参考论文:Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines
该论文是Microsoft Research的John C.Platt在1998年针对对偶问题提出的解法:即SMO算法。
这一方法很快就成为最快的二次规划优化算法,特别是针对线性SVM和数据稀疏时性能更优。
参考博客1:支持向量机通俗导论(理解SVM的三层境界)
在该博客中,作者July对SVM算法进行了由浅入深的详细讲解。用作者自己的话说就是:
全文宏观上整体认识支持向量机(SVM)的概念和用处,
微观上深究部分定理的来龙去脉,证明及原理细节,力保逻辑清晰 & 通俗易懂。
在讲解SVM算法那一部分时,就是参考的上面的论文。
参考博客2:机器学习实战教程(八):支持向量机原理篇之手撕线性SVM
在该博客中,作者Jack Cui将SVM的原理讲解得很清楚,推荐大家都看看
1. 为什么要将原始问题转化为对偶问题?
主要有3个原因:
1.对偶问题将原始问题中的约束转为了对偶问题中的等式约束。
2.方便核函数的引入。
3.改变了问题的复杂度。由求特征向量w转化为求比例系数a。
在原始问题下,求解的复杂度与样本的维度有关,即w的维度。在对偶问题下,只与样本数量有关。
2. 怎么将原始问题转化为对偶问题?
2.1 背景
支持向量机(SVM)的基本数学模型为:
m i n 1 2 ∣ ∣ w ∣ ∣ T s . t . y i ( w T x i + b ) ≥ 1 , i = 1 , 2 , . . . , n min\frac{1}{2}||w||^T\\s.t. \ y_i(w^Tx_i+b)\geq1,i=1,2,...,n min21∣∣w∣∣Ts.t. yi(wTxi+b)≥1,i=1,2,...,n
这里 n n n是样本点的总个数,缩写s.t.表示"Subject to",是"使得满足"的意思。上述公式描述的是一个典型的不等式约束条件下的二次型函数优化问题,同时也是支持向量机的基本数学模型。
2.2 准备知识
我们已经得到支持向量机的基本数学模型,接下来的问题就是如何根据数学模型,求得我们想要的最优解(即最优决策超平面)。在学习求解方法之前,我们得知道一点,想用我下面讲述的求解方法有一个前提,就是我们的目标函数必须是凸函数。理解凸函数,我们还要先明确另一个概念,凸集。在凸几何中,凸集(convex set)是在凸组合下闭合的放射空间的子集。凸集的定义是:如果集合中任意2个元素连线上的点也在集合中,那么这个集合就是凸集。看下图可能更容易理解:

左右两图分别是两个不同的集合。
显然,上图中的左图是一个凸集,上图中的右图是一个非凸集。
凸函数的定义也是如此,其几何意义表示为:函数任意两点连线上的值大于对应自变量处的函数值。若这里凸集 C C C即某个区间 L L L,那么,设函数 f f f为定义在区间 L L L上的函数,若对 L L L上的任意两点 x 1 x_1 x1, x 2 x_2 x2和任意的实数 λ \lambda λ, λ \lambda λ ∈ \in ∈(0,1),总有:
f ( λ x 1 + ( 1 − λ ) x 2 ) ≤ λ f ( x 1 ) + ( 1 − λ ) f ( x 2 ) f(\lambda x_1+(1-\lambda)x_2)\leq\lambda f(x_1)+(1-\lambda)f(x_2) f(λx1+(1−λ)x2)≤λf(x1)+(1−λ)f(x2)
则函数 f f f称为 L L L上的凸函数,当且仅当其上镜图(在函数图像上方的点集)为一个凸集。再看一幅图,也许更容易理解:

像上图这样的函数,它整体就是一个非凸函数,我们无法获得全局最优解的,只能获得局部最优解。比如红框内的部分,如果单独拿出来,它就是一个凸函数。对于我们的目标函数:
m i n 1 2 ∣ ∣ w ∣ ∣ T min\frac{1}{2}||w||^T min21∣∣w∣∣T
很显然,它是一个凸函数。所以,可以使用我接下来讲述的方法求取最优解。
通常我们需要求解的最优化问题有如下3类:
- (1)无约束优化问题,可以写为:
m i n f ( x ) minf(x) minf(x) - (2)有等式约束的优化问题,可以写为:
m i n f ( x ) s . t . h i ( x ) = 0 , i = 1 , 2 , . . . , n minf(x)\\ s.t. \ h_i{(x)}=0,i=1,2,...,n minf(x)s.t. hi(x)=0,i=1,2,...,n - (3)有不等式约束的优化问题,可以写为:
m i n f ( x ) s . t . g i ( x ) ≤ 0 , i = 1 , 2 , . . . , n h j ( x ) = 0 , j = 1 , 2 , . . . , m minf(x)\\ s.t.\ g_i(x)\leq0,i=1,2,...,n\\ h_j(x)=0,j=1,2,...,m minf(x)s.t. gi(x)≤0,i=1,2,...,nhj(x)=0,j=1,2,...,m
对于第(1)类的优化问题,常常使用的方法就是费马大定理(Fermat),即使用求取函数f(x)的导数,然后令其为零,可以求得候选最优值,再在这些候选值中验证;如果是凸函数,可以保证是最优解。这也就是我们高中经常使用的求函数的极值的方法。
对于第(2)类的优化问题,常常使用的方法就是拉格朗日乘子法(Lagrange Multiplier) ,即把等式约束 h i ( x ) h_i(x) hi