SMO算法是John C. Platt在1998年提出的。论文的题目是”Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines”。它很快便成为最快的二次规划优化算法,特别是在针对线性SVM和数据稀疏时性能更优。
当然了,SMO优越性能的背后是其相当复杂的数学推导,所以,我也把这块最难理解的内容放在了整个SVM学习笔记的最后一篇,我将尝试尽可能地把SMO的算法逻辑讲清楚,如有疏忽或错误,欢迎留言讨论。
1. SMO基本原理
我在之前的4篇博客当中,一直有一个遗留问题没有解决,那就是具体如何求解SVM对偶问题,比如我在第3篇博客 SVM解释:三、线性可分的情况 中的公式(3)中表示的优化问题,这个问题在加入了松弛变量和惩罚因子后,也就是我在第4篇博客 SVM解释:四、线性不可分的情况 中的公式(3)中表示的优化问题,具体如下:
我们观察一下这个优化问题,X和Y(即训练数据)已知,然后在一定的约束范围内求取最优解(即拉格朗日乘子 α α ),使目标函数达到最小值。
实际上,求解此类问题的经典算法有很多,但是放在SVM中的话,会在效率上“不尽人意”。因为观察这个目标函数就会发现,其计算的复杂度是依赖于样本数 n n 的,如果SVM中训练的数据集比较大,性能就成了问题。出于提高计算效率的目的,SMO算法应运而生。
总结起来一句话:SMO算法是用来高效地求解公式(1)所示的SVM核心优化问题的
我们知道,解决这样一个有多变量( 个 αi α i )的优化问题确实比较困难,但是如果能多次迭代,每次选择两个变量优化,同时把其他变量看做是固定的常数,这样“分而治之”的话,问题似乎就容易多了。SMO算法的基本思想正是这样一种“分治法”。
显然,这样做有两个问题需要解决:
- 每次选择哪两个变量?
- 每次迭代如何进行优化计算?
这两个问题实际上就是SMO算法的两个组成部分,下面我分别就这两个问题展开阐述。我先说优化计算的过程,最后再谈每次迭代计算是如何选择变量的。
2. 优化计算
2.1 新的优化问题
首先想想为什么要选择两个变量进行优化。假设我选择的是变量 α1,α2 α 1 , α 2 ,那就把其他的 n−2 n − 2 个 αi α i 看做是固定的常数,因为有约束条件 ∑mj=1αiyi=0 ∑ j = 1 m α i y i = 0 存在(公式(1)的第二个约束条件),所以如果我确定了 α1 α 1 迭代后的新值,自然可以通过等式关系确定 α2 α 2 迭代后的值。
回到(1)式所示的SVM核心优化问题,假设选择的两个变量是 α1,α2 α 1 , α 2 ,则此时的目标函数展开如下:
关于这个式子,有以下3点需要说明:
为表示简洁,记 K(Xi,Xj)=Ki,j K ( X i , X j ) = K i , j ,你可能会问,(1)式里面不涉及核函数 K(,) K ( , ) 啊,为什么这里冒出来了?其实没有没核函数的参与,并不影响SMO算法的推导。为了和大多SMO算法相关的文献一致,我将 X1 X 1 与 X2 X 2 的内积直接用核函数的形式表示了,你可以理解为先用核函数映射,再执行加入松弛变量和惩罚因子的线性分类。
v1,v2 v 1 , v 2 如下表示。其中 α∗i α i ∗ 表示 αi α i 在上一次迭代中的值。你可以这样理解:每次迭代 α1 α 1 与 α2 α 2 的值都是由上一轮迭代结束时的 αi α i 的值计算得到的。
⎧⎩⎨⎪⎪⎪⎪v1=∑i=3nyiα∗iKi1v2=∑i=3nyiα∗iKi2(3) (3) { v 1 = ∑ i = 3 n y i α i ∗ K i 1 v 2 = ∑ i = 3 n y i α i ∗ K i 2r r 表示常数项的组合,因为与后面的推导无关,我不写出来了。
新的目标函数有了,再看约束条件,根据公式(1)的两个约束条件,可以得到新约束条件如下: