在再谈SVM(hard-margin和soft-margin详细推导、KKT条件、核技巧)中,无论是求解硬间隔问题:
还是求解软间隔问题:
我们都有意无意跳过了拉格朗日乘子 λ \lambda λ 的求解,今天我们就来求一求。
SMO算法要解决的就是如下凸二次规划问题:
SMO(sequential minimal optimization,序列最小优化)算法是一种启发式算法。其基本思路是:如果所有的变量的解都满足此最优问题的KKT条件,那么这个最优问题的解就得到了,因为KKT条件是该最优化问题有解的充要条件。否则,我们就选择两个变量,固定其它变量,针对这两个变量构建一个二次规划问题,这个二次规划的问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变小。
上面提到了我们要固定两个变量,那这两个变量选择的思路是什么?一个变量是违反KKT条件最严重的的那个变量,另一个变量由约束条件自动确定。 如此,SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。
整个SMO算法包含两个部分:求解两个变量二次规划的解析方法和选择变量的启发式算法。下面将依次介绍。
上面说我们要固定两个变量,我们不妨就选择 λ 1 和 λ 2 \lambda_{1}和\lambda_{2} λ1和λ2两个变量,然后将 λ 3 , λ 4 . . . λ N 固 定 。 \lambda_{3},\lambda_{4}...\lambda_{N}固定。 λ3,λ4...λN固定。
我们固定 λ 3 \lambda_{3} λ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 ) (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) (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),针对这些分类,我们对目标函数进行展开:
第三项以及最后一项都是常数,对最终结果无影响,我们可以去掉,并且 y 1 2 以 及 y 2 2 y_{1}^2以及y_{2}^2 y12以及y22都为1,于是进一步化简:
又因为: λ 1 y 1 + λ 2 y 2 + ∑ i = 3 N λ i y i = 0 \lambda_{1}y_{1}+\lambda_{2}y_{2}+\sum_{i=3}^{N}\lambda_{i}y_{i}=0 λ1y1+λ2y2+∑i=3Nλiyi=0,第三项为一个常数,于是 λ 1 y 1 + λ 2 y 2 = C \lambda_{1}y_{1}+\lambda_{2}y_{2}=C λ1y1+λ2y2=C,则 λ 1 = y 1 ( C − λ 2 y 2 ) \lambda_{1}=y_{1}(C-\lambda_{2}y_{2}) λ1=y1(C−λ2y2),继续代入,化成只有 λ 2 \lambda_{2} λ2的函数:(注意这里的常数C跟上面的惩罚系数没有半点关系!!!)
然后让 L ( λ 2 ) L(\lambda_{2}) L(λ2)对 λ 2 \lambda_{2} λ2求导得:
我们将 λ 2 \lambda_{2} λ2移动到一起得到:
因为是迭代法,所以每次的 λ 2 \lambda_{2} λ2都是new的,而又因为: λ 1 o l d y 1 + λ 2 o l d y 2 = C , 以 及 λ 1 n e w y 1 + λ 2 n e w y 2 = C \lambda_{1}^{old}{}y_{1}+\lambda_{2}^{old}y_{2}=C,以及\lambda_{1}^{new}{}y_{1}+\lambda_{2}^{new}y_{2}=C λ1oldy1+λ2oldy2=C,以及λ1newy1+λ2newy2=C,所以将C继续代入:
再次回忆前面:
于是:
同时也可以得到:
将上述两个式子代入到:
得到:
有很多项都可以直接消掉:
我们令 f ( x 1 ) − y 1 − ( f ( x 2 ) − y 2 ) = E 1 − E 2 , K 11 + K 22 − 2 K 12 = η f(x_{1})-y_{1}-(f(x_{2})-y_{2})=E_{1}-E_{2},K_{11}+K_{22}-2K_{12}=\eta f(x1)−y1−(f(x2)−y2)=E1−E2,K11+K22−2K12=η,于是最终解出了:
(吐槽一下:公式真的太难写了。。。。。)
在前面,我们求解到了一个 λ 2 n e w \lambda_{2}^{new} λ2new,其表达式为:
但是呢,我们在求解过程中并没有考虑 0 ≤ λ i ≤ C 0\leq\lambda_{i}\leq C 0≤λi≤C这一个约束条件。我们称上述最优解为未经剪辑的最优解,记为:
那么现在我们加上约束条件再看看:由于只有两个变量 λ 1 , λ 2 \lambda_{1},\lambda_{2} λ1,λ2,约束可以用二维空间中的图形表示。约束条件为:
以及 0 ≤ λ ≤ C 0\leq\lambda\leq C 0≤λ≤C。
在上面的推导中我们用的是C,这里不想跟惩罚系数C混淆,所以换一个字母 ε \varepsilon ε来表示,因此,加上约束条件后:
可以看到,我们将两个变量框在了一个矩形内,又因为二者相加或者相减为一个常数k,所以,实际上二者的最优解就在一条直线上,而直线是有边界的, 因此我们就可以得到 λ 2 \lambda_{2} λ2的边界,如上所示。
经过上述约束后,我们就得到了最优解:
其中 λ 2 n e w , u n c \lambda_{2}^{new,unc} λ2new,unc就是我们最开始求取的 λ 2 n e w \lambda_{2}^{new} λ2new:
我们根据约束关系得到修剪后的 λ 2 n e w \lambda_{2}^{new} λ2new,然后根据 λ 1 o l d y 1 + λ 2 o l d y 2 = C , 以 及 λ 1 n e w y 1 + λ 2 n e w y 2 = C \lambda_{1}^{old}{}y_{1}+\lambda_{2}^{old}y_{2}=C,以及\lambda_{1}^{new}{}y_{1}+\lambda_{2}^{new}y_{2}=C λ1oldy1+λ2oldy2=C,以及λ1newy1+λ2newy2=C,就可以进一步得到:
上述两个变量 λ 1 以 及 λ 2 \lambda_{1}以及\lambda_{2} λ1以及λ2是我们选出来的,那究竟怎么选呢?
SMO算法称选择 λ 1 \lambda_{1} λ1的过程为外层循环。选取原则是:在训练样本中选取违反KKT条件最严重的样本点。 回忆一下KKT条件:
注意:下面的 α 就 是 λ \alpha就是\lambda α就是λ!!
对KKT条件分类讨论:
(1) α i = 0 \alpha_{i}=0 αi=0,则 w = ∑ i = 1 N α i y i x i = 0 w=\sum_{i=1}^{N}\alpha_{i}y_{i}x_{i}=0 w=∑i=1Nαiyixi=0,说明向量 x i x_{i} xi不是支持向量。
(2) 0 < α i < C 0< \alpha_{i}< C 0<αi<C,此时 x i x_{i} xi是支持向量了。这里为什么会出现C?因为 μ i = C − α i \mu_{i}=C-\alpha_{i} μi=C−αi。此种情况下 μ i > 0 \mu_{i}>0 μi>0,又因为 μ i ε i = 0 \mu_{i}\varepsilon_{i}=0 μiεi=0,于是 ε i = 0 \varepsilon_{i}=0 εi=0,则 y i ( w T x i + b ) = 1 y_{i}(w^Tx_{i}+b)=1 yi(wTxi+b)=1,说明样本 x i x_{i} xi在分割边界上。
(3) α i = C \alpha_{i}=C αi=C,则根据 μ i = C − α i \mu_{i}=C-\alpha_{i} μi=C−αi可知 μ i = 0 \mu_{i}=0 μi=0,又因为 μ i ε i = 0 \mu_{i}\varepsilon_{i}=0 μiεi=0,于是 ε i > 0 \varepsilon_{i}>0 εi>0。
对第三种情况,进一步讨论:
外层循环步骤如下:
SMO算法称选择 λ 2 \lambda_{2} λ2的过程为内层循环。根据外层循环我们找到了第一个变量 λ 1 \lambda_{1} λ1,现在要找第二个变量 λ 2 \lambda_{2} λ2,选取标准是让 ∣ E 1 − E 2 ∣ |E_{1}-E_{2}| ∣E1−E2∣有足够大的变化。 前面我们知道:
可见 λ 2 n e w \lambda_{2}^{new} λ2new依赖于 ∣ E 1 − E 2 ∣ |E_{1}-E_{2}| ∣E1−E2∣,由于 λ 1 \lambda_{1} λ1定了的时候, E 1 E_{1} E1也确定了,所以要想 ∣ E 1 − E 2 ∣ |E_{1}-E_{2}| ∣E1−E2∣最大,只需要在 E 1 E_{1} E1为正时,选择最小的 E i E_{i} Ei作为 E 2 E_{2} E2, 在 E 1 E_{1} E1为负时,选择最大的 E i E_{i} Ei作为 E 2 E_{2} E2,为了节省计算时间,可以将所有的 E i E_{i} Ei保存下来加快迭代。
在特殊情况下,如果内层循环用上述方式选择了一个使得 ∣ E 1 − E 2 ∣ |E_{1}-E_{2}| ∣E1−E2∣最大的 λ 2 \lambda_{2} λ2,但是下降很不明显,那么我们就重新换一个规则:遍历所有在间隔边界上的样本点,选择一个使得目标函数下降明显的的样本作为 λ 2 \lambda_{2} λ2,要是还不能满意,那就重新进行外层循环,重新选择 λ 1 \lambda_{1} λ1。
从内层循环我们知道,我们得计算 E E E!!
经过上述一系列复杂的运算,我们找到了两个优化后的变量,每次我们找到两个变量,都要重新计算阈值b。在再谈SVM(hard-margin和soft-margin详细推导、KKT条件、核技巧)中,求解软间隔问题的2.2.6中,我们说过:
前面求导时我们已经得到了: w ∗ = ∑ i = 1 N α i y i x i w^*=\sum_{i=1}^{N}\alpha_{i}y_{i}x_{i} w∗=∑i=1Nαiyixi,求解b*的思路跟前面一样,任取一个支持向量 ( x k , y k ) (x_{k},y_{k}) (xk,yk),我们知道支持向量满足:
但是这里面有一个不确定量 ε k \varepsilon_{k} εk,我们如果选择了一个 ε k > 0 \varepsilon_{k}> 0 εk>0的支持向量,那么 ε k \varepsilon_{k} εk的具体值我们是无法知道的,因此我们只能选择一个 ε k = 0 \varepsilon_{k}= 0 εk=0的支持向量才能解出b,而根据上面对KKT条件的讨论,只有当 0 < α i < C 0< \alpha_{i}< C 0<αi<C时, ε k = 0 \varepsilon_{k}= 0 εk=0才成立。因此这里需要注意,硬间隔求b时我们可以选择任意一个支持向量,而软间隔不行,我们只有选择满足 0 < α i < C 0< \alpha_{i}< C 0<αi<C( α i > 0 \alpha_{i}>0 αi>0就是支持向量)的支持向量,才能解出b。这其实是一种人为制定的求 b 的规则。
阈值b是在 0 < α i < C 0< \alpha_{i}< C 0<αi<C时求得的。而当 0 ≤ α 1 n e w ≤ C 0\leq \alpha_{1}^{new}\leq C 0≤α1new≤C时,上述阈值表达式中的k可以就是1。那么就有:
b 1 n e w b_{1}^{new} b1new表达式的前两项可以写为:
于是 b 1 n e w b_{1}^{new} b1new可以写做:
同样,如若 0 ≤ λ 2 n e w ≤ C 0\leq \lambda_{2}^{new}\leq C 0≤λ2new≤C,则:
如果 0 ≤ λ 1 n e w ≤ C , 0 ≤ λ 2 n e w ≤ C 0\leq \lambda_{1}^{new}\leq C,0\leq \lambda_{2}^{new}\leq C 0≤λ1new≤C,0≤λ2new≤C同时满足,那么 b 1 n e w = b 2 n e w b_{1}^{new}=b_{2}^{new} b1new=b2new,如果 λ 1 n e w 以 及 λ 2 n e w \lambda_{1}^{new}以及\lambda_{2}^{new} λ1new以及λ2new都是0或者C,那么 b 1 n e w 和 b 2 n e w b_{1}^{new}和b_{2}^{new} b1new和b2new以及它们之间的数都是满足KKT条件的阈值,我们一般选择它们的中点作为新的阈值 b n e w b^{new} bnew。
在每次完成两个变量的优化之后,我们也要更新对应的E值,并将它们保存在列表中,E的更新要用到 b n e w b^{new} bnew以及所有支持向量对应的 λ i \lambda_{i} λi:
j是所有支持向量的下标,S是支持向量集合。
SMO算法的输入为训练数据集T,样本个数为N,每个样本的标签为1或者-1,精度为 ε \varepsilon ε。输出为所有 λ \lambda λ的近似解。
算法中涉及到计算 f ( x i ) f(x_{i}) f(xi),这个咋算?这样算: w ∗ = ∑ i = 1 N α i y i x i w^*=\sum_{i=1}^{N}\alpha_{i}y_{i}x_{i} w∗=∑i=1Nαiyixi
因为我们所有的 λ i \lambda_{i} λi都是有初值的,所以上面的参数在每一次迭代时都是确定的值,只不过每次迭代后都要更新。