在再谈SVM(hard-margin和soft-margin详细推导、KKT条件、核技巧)中,无论是求解硬间隔问题:

还是求解软间隔问题:

我们都有意无意跳过了拉格朗日乘子 λ 的求解,今天我们就来求一求。
1.SMO算法的基本思想
1.1什么是SMO算法
SMO算法要解决的就是如下凸二次规划问题:

SMO(sequential minimal optimization,序列最小优化)算法是一种启发式算法。其基本思路是:如果所有的变量的解都满足此最优问题的KKT条件,那么这个最优问题的解就得到了,因为KKT条件是该最优化问题有解的充要条件。否则,我们就选择两个变量,固定其它变量,针对这两个变量构建一个二次规划问题,这个二次规划的问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变小。
1.2子问题的变量
上面提到了我们要固定两个变量,那这两个变量选择的思路是什么?一个变量是违反KKT条件最严重的的那个变量,另一个变量由约束条件自动确定。 如此,SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。
整个SMO算法包含两个部分:求解两个变量二次规划的解析方法和选择变量的启发式算法。下面将依次介绍。
2.SMO算法的实现
2.1两个变量二次规划的求解方法
上面说我们要固定两个变量,我们不妨就选择λ1和λ2两个变量,然后将λ3,λ4...λN固定。
2.1.1原始问题的分析

我们固定λ3开始的所有变量,并对目标函数进行分类讨论,一共九种情况:(i,j)分别为(1,1)、(1,2)、(2,1)、(i=1,j≥3)、(i≥3,j=1)、(2,2)、(i=2,j≥3)、(i≥3,j=2)、(i≥3,j≥3),针对这些分类,我们对目标函数进行展开:

第三项以及最后一项都是常数,对最终结果无影响,我们可以去掉,并且y12以及y22都为1,于是进一步化简:

又因为:λ1y1+λ2y2+∑i=3Nλiyi=0,第三项为一个常数,于是λ1y1+λ2y2=C,则λ1=y1(C−λ2y2),继续代入,化成只有λ2的函数:(注意这里的常数C跟上面的惩罚系数没有半点关系!!!)

然后让L(λ2)对λ2求导得:

我们将λ2移动到一起得到:

因为是迭代法,所以每次的λ2都是new的,而又因为:λ1oldy1+λ2oldy2=C,以及λ1newy1+λ2newy2=C,所以将C继续代入:

再次回忆前面:

于是:

同时也可以得到:

将上述两个式子代入到:

得到:
有很多项都可以直接消掉:

我们令f(x1)−y1−(f(x2)−y2)=E1−E2,K11+K22−2K12=η,于是最终解出了:

(吐槽一下:公式真的太难写了。。。。。)
2.1.2约束条件+剪切
在前面,我们求解到了一个λ2new,其表达式为:

但是呢,我们在求解过程中并没有考虑0≤λi≤C这一个约束条件。我们称上述最优解为未经剪辑的最优解,记为:

那么现在我们加上约束条件再看看:由于只有两个变量λ1,λ2,约束可以用二维空间中的图形表示。约束条件为:
以及0≤λ≤C。
在上面的推导中我们用的是C,这里不想跟惩罚系数C混淆,所以换一个字母ε来表示,因此,加上约束条件后:

可以看到,我们将两个变量框在了一个矩形内,又因为二者相加或者相减为一个常数k,所以,实际上二者的最优解就在一条直线上,而直线是有边界的, 因此我们就可以得到λ2的边界,如上所示。
2.2变量的选择方法
上述两个变量λ1以及λ2是我们选出来的,那究竟怎么选呢?
2.2.1第一个变量的选择
SMO算法称选择λ1的过程为外层循环。选取原则是:在训练样本中选取违反KKT条件最严重的样本点。 回忆一下KKT条件:
注意:下面的α就是λ!!

对KKT条件分类讨论:
(1)αi=0,则w=∑i=1Nαiyixi=0,说明向量xi不是支持向量。
(2)0<αi<C,此时xi是支持向量了。这里为什么会出现C?因为μi=C−αi。此种情况下μi>0,又因为μiεi=0,于是εi=0,则yi(wTxi+b)=1,说明样本xi在分割边界上。
(3)αi=C,则根据μi=C−αi可知μi=0,又因为μiεi=0,于是εi>0。
对第三种情况,进一步讨论:
-
0<εi<1,则yi(wTxi+b)=1−εi∈(0,1),样本在间隔边界与超平面之间。
-
εi=1,则yi(wTxi+b)=1−εi=0,样本在超平面上。
-
εi>1,则yi(wTxi+b)=1−εi<0,样本在超平面另一侧,说明分类错误。
外层循环步骤如下:
- 首先遍历所有样本点,如果有不满足条件0≤λi≤C的样本点,就选择其作为第一个变量。
- 若所有样本点都满足上述关系,那么就选择不满足λ=0以及λ=C的样本点。
2.2.2第二个变量的选择
SMO算法称选择λ2的过程为内层循环。根据外层循环我们找到了第一个变量λ1,现在要找第二个变量λ2,选取标准是让∣E1−E2∣有足够大的变化。 前面我们知道:

可见λ2new依赖于∣E1−E2∣,由于λ1定了的时候,E1也确定了,所以要想∣E1−E2∣最大,只需要在E1为正时,选择最小的Ei作为E2, 在E1为负时,选择最大的Ei作为E2,为了节省计算时间,可以将所有的Ei保存下来加快迭代。
在特殊情况下,如果内层循环用上述方式选择了一个使得∣E1−E2∣最大的λ2,但是下降很不明显,那么我们就重新换一个规则:遍历所有在间隔边界上的样本点,选择一个使得目标函数下降明显的的样本作为λ2,要是还不能满意,那就重新进行外层循环,重新选择λ1。
从内层循环我们知道,我们得计算E!!
2.2.3计算阈值b和差值Ei
经过上述一系列复杂的运算,我们找到了两个优化后的变量,每次我们找到两个变量,都要重新计算阈值b。在再谈SVM(hard-margin和soft-margin详细推导、KKT条件、核技巧)中,求解软间隔问题的2.2.6中,我们说过:
前面求导时我们已经得到了:w∗=∑i=1Nαiyixi,求解b*的思路跟前面一样,任取一个支持向量(xk,yk),我们知道支持向量满足:

但是这里面有一个不确定量εk,我们如果选择了一个εk>0的支持向量,那么εk的具体值我们是无法知道的,因此我们只能选择一个εk=0的支持向量才能解出b,而根据上面对KKT条件的讨论,只有当0<αi<C时,εk=0才成立。因此这里需要注意,硬间隔求b时我们可以选择任意一个支持向量,而软间隔不行,我们只有选择满足0<αi<C(αi>0就是支持向量)的支持向量,才能解出b。这其实是一种人为制定的求 b 的规则。
阈值b是在0<αi<C时求得的。而当0≤α1new≤C时,上述阈值表达式中的k可以就是1。那么就有:

根据Ei的表达式,我们可以写出:

b1new表达式的前两项可以写为:

于是b1new可以写做:

同样,如若0≤λ2new≤C,则:

如果0≤λ1new≤C,0≤λ2new≤C同时满足,那么b1new=b2new,如果λ1new以及λ2new都是0或者C,那么b1new和b2new以及它们之间的数都是满足KKT条件的阈值,我们一般选择它们的中点作为新的阈值bnew。
在每次完成两个变量的优化之后,我们也要更新对应的E值,并将它们保存在列表中,E的更新要用到bnew以及所有支持向量对应的λi:

j是所有支持向量的下标,S是支持向量集合。
3.总结SMO算法
SMO算法的输入为训练数据集T,样本个数为N,每个样本的标签为1或者-1,精度为ε。输出为所有λ的近似解。
- 取初值,令所有λ都为0,即λ(0)=0,令k=0
- 根据上面的选取优化变量的准则,选取两个要优化的变量λ1(k)以及λ2(k),求得它们的最优解λ1(k+1)以及λ2(k+1),更新λ为λ(k+1)
- 若在精度ε范围内满足停止条件:

那么我们就停止迭代,当前的λ(k+1)就是最终的λ^,不满足终止条件就跳到第二步。
4.SMO算法步骤中的一点解释
算法中涉及到计算f(xi),这个咋算?这样算:w∗=∑i=1Nαiyixi

因为我们所有的λi都是有初值的,所以上面的参数在每一次迭代时都是确定的值,只不过每次迭代后都要更新。