手推序列最小优化(sequential minimal optimization,SMO)算法

  在再谈SVM(hard-margin和soft-margin详细推导、KKT条件、核技巧)中,无论是求解硬间隔问题:
手推序列最小优化(sequential minimal optimization,SMO)算法
还是求解软间隔问题:
手推序列最小优化(sequential minimal optimization,SMO)算法
我们都有意无意跳过了拉格朗日乘子 λ\lambda 的求解,今天我们就来求一求。

1.SMO算法的基本思想

1.1什么是SMO算法

  SMO算法要解决的就是如下凸二次规划问题:
手推序列最小优化(sequential minimal optimization,SMO)算法
  SMO(sequential minimal optimization,序列最小优化)算法是一种启发式算法。其基本思路是:如果所有的变量的解都满足此最优问题的KKT条件,那么这个最优问题的解就得到了,因为KKT条件是该最优化问题有解的充要条件。否则,我们就选择两个变量,固定其它变量,针对这两个变量构建一个二次规划问题,这个二次规划的问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变小。

1.2子问题的变量

  上面提到了我们要固定两个变量,那这两个变量选择的思路是什么?一个变量是违反KKT条件最严重的的那个变量,另一个变量由约束条件自动确定。 如此,SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。

  整个SMO算法包含两个部分:求解两个变量二次规划的解析方法和选择变量的启发式算法。下面将依次介绍。

2.SMO算法的实现

2.1两个变量二次规划的求解方法

  上面说我们要固定两个变量,我们不妨就选择λ1λ2\lambda_{1}和\lambda_{2}两个变量,然后将λ3,λ4...λN\lambda_{3},\lambda_{4}...\lambda_{N}固定。

2.1.1原始问题的分析

手推序列最小优化(sequential minimal optimization,SMO)算法
  我们固定λ3\lambda_{3}开始的所有变量,并对目标函数进行分类讨论,一共九种情况:(i,j)(1,1)(1,2)(2,1)(i=1,j3)(i3,j=1)(2,2)(i=2,j3)(i3,j=2)(i3,j3)(i,j)分别为(1,1)、(1,2)、(2,1)、(i=1,j\geq3)、(i\geq3,j=1)、(2,2)、(i=2,j\geq3)、(i\geq3,j=2)、(i\geq3,j\geq3),针对这些分类,我们对目标函数进行展开:
手推序列最小优化(sequential minimal optimization,SMO)算法
第三项以及最后一项都是常数,对最终结果无影响,我们可以去掉,并且y12y22y_{1}^2以及y_{2}^2都为1,于是进一步化简:
手推序列最小优化(sequential minimal optimization,SMO)算法
又因为:λ1y1+λ2y2+i=3Nλiyi=0\lambda_{1}y_{1}+\lambda_{2}y_{2}+\sum_{i=3}^{N}\lambda_{i}y_{i}=0,第三项为一个常数,于是λ1y1+λ2y2=C\lambda_{1}y_{1}+\lambda_{2}y_{2}=C,则λ1=y1(Cλ2y2)\lambda_{1}=y_{1}(C-\lambda_{2}y_{2}),继续代入,化成只有λ2\lambda_{2}的函数:(注意这里的常数C跟上面的惩罚系数没有半点关系!!!)
手推序列最小优化(sequential minimal optimization,SMO)算法
然后让L(λ2)L(\lambda_{2})λ2\lambda_{2}求导得:
手推序列最小优化(sequential minimal optimization,SMO)算法
我们将λ2\lambda_{2}移动到一起得到:
手推序列最小优化(sequential minimal optimization,SMO)算法
因为是迭代法,所以每次的λ2\lambda_{2}都是new的,而又因为:λ1oldy1+λ2oldy2=Cλ1newy1+λ2newy2=C\lambda_{1}^{old}{}y_{1}+\lambda_{2}^{old}y_{2}=C,以及\lambda_{1}^{new}{}y_{1}+\lambda_{2}^{new}y_{2}=C,所以将C继续代入:
手推序列最小优化(sequential minimal optimization,SMO)算法
再次回忆前面:
手推序列最小优化(sequential minimal optimization,SMO)算法
于是:
手推序列最小优化(sequential minimal optimization,SMO)算法
同时也可以得到:
手推序列最小优化(sequential minimal optimization,SMO)算法
将上述两个式子代入到:
手推序列最小优化(sequential minimal optimization,SMO)算法
得到:手推序列最小优化(sequential minimal optimization,SMO)算法
有很多项都可以直接消掉:
手推序列最小优化(sequential minimal optimization,SMO)算法
我们令f(x1)y1(f(x2)y2)=E1E2,K11+K222K12=ηf(x_{1})-y_{1}-(f(x_{2})-y_{2})=E_{1}-E_{2},K_{11}+K_{22}-2K_{12}=\eta,于是最终解出了:
手推序列最小优化(sequential minimal optimization,SMO)算法
(吐槽一下:公式真的太难写了。。。。。)

2.1.2约束条件+剪切

  在前面,我们求解到了一个λ2new\lambda_{2}^{new},其表达式为:
手推序列最小优化(sequential minimal optimization,SMO)算法
但是呢,我们在求解过程中并没有考虑0λiC0\leq\lambda_{i}\leq C这一个约束条件。我们称上述最优解为未经剪辑的最优解,记为:
手推序列最小优化(sequential minimal optimization,SMO)算法
  那么现在我们加上约束条件再看看:由于只有两个变量λ1λ2\lambda_{1},\lambda_{2},约束可以用二维空间中的图形表示。约束条件为:手推序列最小优化(sequential minimal optimization,SMO)算法
以及0λC0\leq\lambda\leq C
  在上面的推导中我们用的是C,这里不想跟惩罚系数C混淆,所以换一个字母ε\varepsilon来表示,因此,加上约束条件后:
手推序列最小优化(sequential minimal optimization,SMO)算法
  可以看到,我们将两个变量框在了一个矩形内,又因为二者相加或者相减为一个常数k,所以,实际上二者的最优解就在一条直线上,而直线是有边界的, 因此我们就可以得到λ2\lambda_{2}的边界,如上所示。

2.2变量的选择方法

上述两个变量λ1λ2\lambda_{1}以及\lambda_{2}是我们选出来的,那究竟怎么选呢?

2.2.1第一个变量的选择

  SMO算法称选择λ1\lambda_{1}的过程为外层循环选取原则是:在训练样本中选取违反KKT条件最严重的样本点。 回忆一下KKT条件:
注意:下面的αλ\alpha就是\lambda!!
手推序列最小优化(sequential minimal optimization,SMO)算法

对KKT条件分类讨论:
(1)αi=0\alpha_{i}=0,则w=i=1Nαiyixi=0w=\sum_{i=1}^{N}\alpha_{i}y_{i}x_{i}=0,说明向量xix_{i}不是支持向量。
(2)0<αi<C0< \alpha_{i}< C,此时xix_{i}是支持向量了。这里为什么会出现C?因为μi=Cαi\mu_{i}=C-\alpha_{i}。此种情况下μi>0\mu_{i}>0,又因为μiεi=0\mu_{i}\varepsilon_{i}=0,于是εi=0\varepsilon_{i}=0,则yi(wTxi+b)=1y_{i}(w^Tx_{i}+b)=1,说明样本xix_{i}在分割边界上。
(3)αi=C\alpha_{i}=C,则根据μi=Cαi\mu_{i}=C-\alpha_{i}可知μi=0\mu_{i}=0,又因为μiεi=0\mu_{i}\varepsilon_{i}=0,于是εi>0\varepsilon_{i}>0
对第三种情况,进一步讨论:

  1. 0<εi<10<\varepsilon_{i}<1,则yi(wTxi+b)=1εi(0,1)y_{i}(w^Tx_{i}+b)=1-\varepsilon_{i}\in(0,1),样本在间隔边界与超平面之间。
  2. εi=1\varepsilon_{i}=1,则yi(wTxi+b)=1εi=0y_{i}(w^Tx_{i}+b)=1-\varepsilon_{i}=0,样本在超平面上。
  3. εi>1\varepsilon_{i}>1,则yi(wTxi+b)=1εi<0y_{i}(w^Tx_{i}+b)=1-\varepsilon_{i}<0,样本在超平面另一侧,说明分类错误。

外层循环步骤如下:

  1. 首先遍历所有样本点,如果有不满足条件0λiC0\leq \lambda_{i} \leq C的样本点,就选择其作为第一个变量。
  2. 若所有样本点都满足上述关系,那么就选择不满足λ=0λ=C\lambda=0以及\lambda=C的样本点。

2.2.2第二个变量的选择

  SMO算法称选择λ2\lambda_{2}的过程为内层循环。根据外层循环我们找到了第一个变量λ1\lambda_{1},现在要找第二个变量λ2\lambda_{2}选取标准是让E1E2|E_{1}-E_{2}|有足够大的变化。 前面我们知道:
手推序列最小优化(sequential minimal optimization,SMO)算法
可见λ2new\lambda_{2}^{new}依赖于E1E2|E_{1}-E_{2}|,由于λ1\lambda_{1}定了的时候,E1E_{1}也确定了,所以要想E1E2|E_{1}-E_{2}|最大,只需要在E1E_{1}为正时,选择最小的EiE_{i}作为E2E_{2}, 在E1E_{1}为负时,选择最大的EiE_{i}作为E2E_{2},为了节省计算时间,可以将所有的EiE_{i}保存下来加快迭代。
  在特殊情况下,如果内层循环用上述方式选择了一个使得E1E2|E_{1}-E_{2}|最大的λ2\lambda_{2}但是下降很不明显,那么我们就重新换一个规则:遍历所有在间隔边界上的样本点,选择一个使得目标函数下降明显的的样本作为λ2\lambda_{2},要是还不能满意,那就重新进行外层循环,重新选择λ1\lambda_{1}
  从内层循环我们知道,我们得计算EE!!

2.2.3计算阈值b和差值EiE_{i}

  经过上述一系列复杂的运算,我们找到了两个优化后的变量,每次我们找到两个变量,都要重新计算阈值b。在再谈SVM(hard-margin和soft-margin详细推导、KKT条件、核技巧)中,求解软间隔问题的2.2.6中,我们说过:
  前面求导时我们已经得到了:w=i=1Nαiyixiw^*=\sum_{i=1}^{N}\alpha_{i}y_{i}x_{i},求解b*的思路跟前面一样,任取一个支持向量(xk,yk)(x_{k},y_{k}),我们知道支持向量满足:
手推序列最小优化(sequential minimal optimization,SMO)算法
  但是这里面有一个不确定量εk\varepsilon_{k},我们如果选择了一个εk>0\varepsilon_{k}> 0的支持向量,那么εk\varepsilon_{k}的具体值我们是无法知道的,因此我们只能选择一个εk=0\varepsilon_{k}= 0的支持向量才能解出b,而根据上面对KKT条件的讨论,只有当0<αi<C0< \alpha_{i}< C时,εk=0\varepsilon_{k}= 0才成立。因此这里需要注意,硬间隔求b时我们可以选择任意一个支持向量,而软间隔不行,我们只有选择满足0<αi<C0< \alpha_{i}< Cαi>0\alpha_{i}>0就是支持向量)的支持向量,才能解出b。这其实是一种人为制定的求 b 的规则。

  阈值b是在0<αi<C0< \alpha_{i}< C时求得的。而当0α1newC0\leq \alpha_{1}^{new}\leq C时,上述阈值表达式中的k可以就是1。那么就有:
手推序列最小优化(sequential minimal optimization,SMO)算法

根据EiE_{i}的表达式,我们可以写出:
手推序列最小优化(sequential minimal optimization,SMO)算法

b1newb_{1}^{new}表达式的前两项可以写为:
手推序列最小优化(sequential minimal optimization,SMO)算法
于是b1newb_{1}^{new}可以写做:
手推序列最小优化(sequential minimal optimization,SMO)算法
同样,如若0λ2newC0\leq \lambda_{2}^{new}\leq C,则:
手推序列最小优化(sequential minimal optimization,SMO)算法
  如果0λ1newC,0λ2newC0\leq \lambda_{1}^{new}\leq C,0\leq \lambda_{2}^{new}\leq C同时满足,那么b1new=b2newb_{1}^{new}=b_{2}^{new},如果λ1newλ2new\lambda_{1}^{new}以及\lambda_{2}^{new}都是0或者C,那么b1newb2newb_{1}^{new}和b_{2}^{new}以及它们之间的数都是满足KKT条件的阈值,我们一般选择它们的中点作为新的阈值bnewb^{new}
  在每次完成两个变量的优化之后,我们也要更新对应的E值,并将它们保存在列表中,E的更新要用到bnewb^{new}以及所有支持向量对应的λi\lambda_{i}
手推序列最小优化(sequential minimal optimization,SMO)算法
j是所有支持向量的下标,S是支持向量集合。

3.总结SMO算法

  SMO算法的输入为训练数据集T,样本个数为N,每个样本的标签为1或者-1,精度为ε\varepsilon输出为所有λ\lambda的近似解。

  1. 取初值,令所有λ\lambda都为0,即λ(0)\lambda^{(0)}=0,令k=0
  2. 根据上面的选取优化变量的准则,选取两个要优化的变量λ1(k)λ2(k)\lambda_{1}^{(k)}以及\lambda_{2}^{(k)},求得它们的最优解λ1(k+1)λ2(k+1)\lambda_{1}^{(k+1)}以及\lambda_{2}^{(k+1)},更新λ\lambdaλ(k+1)\lambda^{(k+1)}
  3. 若在精度ε\varepsilon范围内满足停止条件:
    手推序列最小优化(sequential minimal optimization,SMO)算法
    那么我们就停止迭代,当前的λ(k+1)\lambda^{(k+1)}就是最终的λ^\hat{\lambda},不满足终止条件就跳到第二步。

4.SMO算法步骤中的一点解释

  算法中涉及到计算f(xi)f(x_{i}),这个咋算?这样算:w=i=1Nαiyixiw^*=\sum_{i=1}^{N}\alpha_{i}y_{i}x_{i}
手推序列最小优化(sequential minimal optimization,SMO)算法
因为我们所有的λi\lambda_{i}都是有初值的,所以上面的参数在每一次迭代时都是确定的值,只不过每次迭代后都要更新。