五、SMO 算法
1、简要介绍
时序最小优化(SMO: Sequential Minimal Optimization)是一种可以快速解决 SVM 中二次规划(QP)问题的简单算法。它的好处有两点:一是不需要额外的矩阵存储,二是不需要对二次规划问题进行数值求解。
与之前的一些算法不同,SMO 算法每一步都是解决一个最小规模的优化问题,对于标准的 SVM QP 问题,最小规模优化问题包含两个 Lagrange 乘子(因为 Lagrange 乘子需要遵循一个线性等式约束,所以至少为两个)。在算法的每一步,我们都选择两个 Lagrange 乘子参与优化,在找到这些乘子的最优值后,用新的值更新 SVM 问题。并且 SMO 算法不需要额外的矩阵存储,所以大规模的 SVM 训练问题也可以在一台普通的计算机上进行处理。
总的来说,SMO 由两部分构成:一是运用探索式方法去选择哪个乘子需要优先优化;二是运用解析的方法去解决两乘子(两个 Lagrange 乘子,以下简称两乘子)优化问题。
2、两乘子优化问题
首先来看看两乘子优化问题,由之前的讨论可知,需要解决的优化问题为:
⎧⎩⎨⎪⎪⎪⎪⎪⎪maxα∑ni=1αi−12∑ni,j=1αiαjyiyjxTixjs.t.0≤αi≤C,i=1,2,...,n∑ni=1αiyi=0
下面要解决的问题是:在
α=(α1,α2,...,αn) 上求上述目标函数的最小值。为了求解这些乘子,不失一般性,每次从中任意抽取两个乘子
α1 和
α2 ,然后固定
α1 和
α2 以外的其它乘子,使得目标函数只是关于
α1 和
α2的函数。这样,不断地从一堆乘子中任意抽取两个求解,不断地迭代求解子问题,最终达到求解原问题的目的。
现在对偶问题的子问题的目标函数可以表达为:
Ψ(α)=12K11α21+12K22α22+sK12α1α2+y1α1v1+y2α2v2−α1−α2−Ψconst
其中
⎧⎩⎨⎪⎪Kij=K(xi,xj)v1=∑nj=3yjα∗jK1j=u∗1+b∗−y1α∗1K11−y2α∗2K12v2=∑nj=3yjα∗jK2j=u∗2+b∗−y1α∗1K12−y2α∗2K22
并且
s=y1y2 。
在寻找最小值的过程中要满足线性等式约束,即
α1y1+α2y2=w0
其中
w0 为常数。进而得出
α1+sα2=α∗1+sα∗2=w0
于是
α1=w0−sα2 ,将此式带入
Ψ 中并且关于
α2 求导,经整理后得到:
α2=α∗2+y2(E1−E2)η
其中
η=K11+K22−2K12,
E1=u∗1−y1,
E2=u∗2−y2。
于是
α1=α∗1+s(α∗2−α2)
由于对于每个乘子都有
0<αi<C 的限制,所以对结果还要加上一定的限制。
3、探索式方法寻找需要优先优化的乘子
所谓的探索式选择方法主要思想是每次选择拉格朗日乘子的时候,优先选择样本前面系数满足 0≤αi≤C 的 αi 作优化(称为无界样例),因为在界上(αi 为 0 或 C)的样例对应的系数 αi 一般不会更改。
首先我们来看看加入松弛变量的原始问题的 KKT 条件,根据附录1我们得出相应的 KKT 条件为:
{αi(yi(wTxi+b)+ξi−1)=0γiξi=0
根据
αi 的值,现在考虑以下三种情况:
(1)如果
αi=0 ,则
γi=C−αi=C>0 ,于是
ξi=0 ,所以可以得到
yi(wTxi+b)−1≥0
此时对应于两条间隔线外面的点;
(2)如果
0<αi<C ,则
yi(wTxi+b)+ξi−1=0
又由于
γi=C−αi>0 ,于是
ξi=0 ,代入上式则有
yi(wTxi+b)−1=0
此时对应于两条间隔线上的点;
(3)如果
αi=C ,则
yi(wTxi+b)+ξi−1=0
又由于
γi=C−αi=0 ,于是
ξi≥0 ,代入上式则有
yi(wTxi+b)−1≤0
此时对应于两条间隔线里面的点或者是错分点。
接下来就来讨论一下如何寻找
α1 和
α2 ,对于
α1 ,可以通过刚刚说的那三种不满足
KKT 的条件来找,先对所有样例进行循环,循环中碰到违背
KKT 条件的(不管界上还是界内)都进行迭代更新。等这轮过后,如果没有收敛,第二轮就只针对
0<αi<C 的样例进行迭代更新。在第一个乘子选择后,第二个乘子也使用探索式方法选择,第二个乘子的迭代步长大致正比于
|E1−E2| ,选择第二个乘子能够最大化
|E1−E2| 。即当
E1 为正时选择负的绝对值最大的
E2 ,反之,选择正值最大的
E2 。
最后的收敛条件是在界内(
0<αi<C)的样例都能够遵循
KKT 条件,且其对应的
αi 只在极小的范围内变动(注意:在每次更新完两个乘子的优化后,都需要再重新计算
b ,及对应的
Ei 值。)
最后感谢几位作者:July,pluskid,John C.Platt
文中很多地方参考了他们之前的文章和博客,非常感谢!