支持向量机(四)——深入理解SMO优化算法

本文结合了《统计学习方法》,吴恩达中文笔记,以及一些博客文章https://www.cnblogs.com/pinard/p/6111471.html,http://www.cnblogs.com/vivounicorn/archive/2011/06/01/2067496.html,https://blog.csdn.net/Victor_Gun/article/details/45228071,并结合个人理解总结出了这篇详细介绍SMO算法的文章。文章有详细的数学推导过程,可以解决大多数疑惑的地方,希望能对大家有所帮助。
支持向量机的最后一节,用SMO优化算法解决对偶函数的最后优化问题,首先先介绍坐标上升法

1.坐标上升法

假设我们有一个要求解的优化问题: maxαW(α1,α2,...,αm) m a x α W ( α 1 , α 2 , . . . , α m ) 这里W是 α α 向量的函数。之前我们讲过求最优解的两种方法分别是梯度下降法和牛顿法,这里是新的一种方法——坐标上升法,其方法过程为:

这里写图片描述
最里面的语句表示固定除 αi α i 之外所有 αjji α j ( j ≠ i ) ,这时W可以看做只是关于 αi α i 的函数,那么直接对 αi α i 求导优化即可。我们用一张图来说明一下这个算法:
这里写图片描述
由于每次只固定一个参数所以求导后是一条直线,从图中可以看出迭代的优化路径总是沿着和坐标轴平行的方向前进,每一步都前进一步,因为每一步只优化一个变量。
坐标上升法虽然比牛顿法有更多的迭代,但每次迭代的代价都很小。

2.SMO优化算法(Sequential minimal optimization)

SMO算法解决对偶函数的最后优化问题:

这里写图片描述
要解决的是在参数 α α 上求最大值W的问题,C是我们预先设定的已知数。将上面的式子修改一下可以写成:
这里写图片描述

按照坐标上升的思路,我们固定除 α1 α 1 其中一个参数以外的所有参数,但是这样有问题,因为固定 α1 α 1 之外所有参数,那么 α1 α 1 不再是变量,因为 α1 α 1 可以由其他固定的参数表示出来。
因此我们需要一次选择两个参数做优化,比如 α1 α 1 α2 α 2 ,此时 α2 α 2 可以由 α1 α 1 和其他参数表示出来,再带回W中,W就是只关于 α1 α 1 的函数,可解。这样,SMO的主要步骤为:
这里写图片描述
第一步中的启发式方法之后介绍。第二步就是进行约束。SMO高效的原因就是固定其他参数后,对一个参数优化过程很高效。有一点要注意的是,这里的收敛条件是什么呢?其实就是满足KKT条件。那么怎样在满足所有约束条件的情况下能相对于αi,αj取得W最优呢?假设我们选取的参数是α1,α2,那么有:
这里写图片描述
所以能得到:
这里写图片描述

接下来将 W(α) W ( α ) 改写一下:
这里写图片描述
对比原式 W(α) W ( α ) ,展开为 W(α2)=Aα22+Bα2+C W ( α 2 ) = A α 2 2 + B α 2 + C , 那么我们可以对W求导求得 α2 α 2 相应的值为 αnew,unclipped2 α 2 n e w , u n c l i p p e d (unclipped的意思是说不用考虑约束条件)。然后再更新我们得到剪辑后的α2的更新式子为:
这里写图片描述
得到 αnew2 α 2 n e w 后,也就可以求出 αnew1 α 1 n e w 了。


以下是推导过程,首先推导出未考虑约束条件的 αnew,unclipped2 α 2 n e w , u n c l i p p e d 。为了叙述方便我们记:

这里写图片描述
Ei为函数g(xi)对输入xi的预测值与真实输出yi之间的差。
引入记号变量
vi=Nj=3αjyjK(xi,xj)=g(xi)2j=1αjyjK(xi,xj)b,i=1,2 v i = ∑ j = 3 N α j y j K ( x i , x j ) = g ( x i ) − ∑ j = 1 2 α j y j K ( x i , x j ) − b , i = 1 , 2

目标函数可写成
W(α1,α2)=12K11α21+12K22α22+y1y2K12α1α2(α1+α2)+y1viα1+y2viα2 W ( α 1 , α 2 ) = 1 2 K 11 α 1 2 + 1 2 K 22 α 2 2 + y 1 y 2 K 12 α 1 α 2 − ( α 1 + α 2 ) + y 1 v i α 1 + y 2 v i α 2

根据 α1y1=ζα2y2 α 1 y 1 = ζ − α 2 y 2 以及 yi2=1 y i 2 = 1 ,将两遍同乘一个 yi y i ,则可将 α1 α 1 表示为:
α1=(ζα2y2)y1 α 1 = ( ζ − α 2 y 2 ) ∗ y 1

α1 α 1 带入到目标函数中,则目标函数变为只含α2的函数:
这里写图片描述
αold1y1+αold2y2=ζ α 1 o l d y 1 + α 2 o l d y 2 = ζ η=K11+K222K12 η = K 11 + K 22 − 2 K 12 代入,就可以得到:
αnew,unc2=αold2+y2(E1E2)η α 2 n e w , u n c = α 2 o l d + y 2 ( E 1 − E 2 ) η

接下来我们关注一下问题的约束条件:
这里写图片描述
我们用图片表示一下,当y1与y2异号的时候:
这里写图片描述
同号的时候
这里写图片描述
可以看到 α1,α2 α 1 , α 2 两个乘子既要位于边长为C的盒子里又要在相应直线上,于是对于 α2 α 2 的界来说,有如下情况:
这里写图片描述
我们实际来计算其中的一个,选定同号的计算 xold1+xold2=xnew1+xnew2=ζ x 1 o l d + x 2 o l d = x 1 n e w + x 2 n e w = ζ ,当 xnew1 x 1 n e w 处于边界时,即 xnew1=0 x 1 n e w = 0 时, xnew2=xold1+xold2 x 2 n e w = x 1 o l d + x 2 o l d ,当 xnew1=C x 1 n e w = C 时, xnew2=xold1+xold2xnew1=xold1+xold2C x 2 n e w = x 1 o l d + x 2 o l d − x 1 n e w = x 1 o l d + x 2 o l d − C ,结合 xnew2 x 2 n e w 给定的限制,就得到了L和H的范围,当y1,y2异号时也类似计算。
这里写图片描述
代入 (ζα2y2)y1 ( ζ − α 2 y 2 ) ∗ y 1 可求得 αnew1 α 1 n e w 值为: αnew1=αold1+y1y2(αold2αold1) α 1 n e w = α 1 o l d + y 1 y 2 ( α 2 o l d − α 1 o l d )


选择的两个变量得到最优化的解 αnew1 α 1 n e w αnew2 α 2 n e w 后,我们要根据最优化的解求出对应的满足KKT条件的b值,因为KKT条件就是我们收敛的条件。所以我们继续推导出阈值b的更新:


推导b——首先来看一下KKT条件:

这里写图片描述
0<αnew1<C 0 < α 1 n e w < C ,由以上KKT条件可知:
y1Ni=1αiyiKi1b=0 y 1 − ∑ i = 1 N α i y i K i 1 − b = 0

于是有:
bnew1=y1Ni=3αiyiKi1αnew1y1K11αnew2y2K21 b 1 n e w = y 1 − ∑ i = 3 N α i y i K i 1 − α 1 n e w y 1 K 11 − α 2 n e w y 2 K 21

由之前 E1 E 1 定义是得:
E1=Ni=3αiyiKi1+αold1y1K11+αold2y2K21+boldy1 E 1 = ∑ i = 3 N α i y i K i 1 + α 1 o l d y 1 K 11 + α 2 o l d y 2 K 21 + b o l d − y 1
可以看到上两式都有 y1Ni=3αiyiKi1 y 1 − ∑ i = 3 N α i y i K i 1 ,因此可以将 bnew1 b 1 n e w E1 E 1 表示为:
bnew1=E1yiK11(αnew1αold1)y2K21(αnew2αold2)+bold b 1 n e w = − E 1 − y i K 11 ( α 1 n e w − α 1 o l d ) − y 2 K 21 ( α 2 n e w − α 2 o l d ) + b o l d
同样,如果 0<αnew2<C 0 < α 2 n e w < C
bnew2=E2yiK12(αnew1αold1)y2K22(αnew2αold2)+bold b 2 n e w = − E 2 − y i K 12 ( α 1 n e w − α 1 o l d ) − y 2 K 22 ( α 2 n e w − α 2 o l d ) + b o l d
如果 αnew1 α 1 n e w αnew2 α 2 n e w 都满足条件 0<αnewi<C 0 < α i n e w < C ,i=1,2,那么 bnew1=bnew2 b 1 n e w = b 2 n e w ,如果 αi α i 等于0或者C,那么 bnew1 b 1 n e w bnew2 b 2 n e w 以及它们之间的数都符合KKT条件的阈值,这时选择它们的中点作为 bnew b n e w
每次完成优化后,还需要更新 Ei E i Ei E i 更新要用到 bnew b n e w ,以及所有支持向量对应的 αj α j
Ei=SyjαjK(xi,xj)+bnewyi E i = ∑ S y j α j K ( x i , x j ) + b n e w − y i

其中,S是所有支持向量 xj x j 的集合。

3.SMO中拉格朗日乘子的启发式选择方法

SMO算法在每个子问题中选择两个变量优化,其中至少一个变量是违反KKT条件的

3.1 第一个变量的选择

SMO算法称选择第一个变量为外层循环,这个变量需要选择在训练集中违反KKT条件最严重的样本点。选择方法为
1.优先选择样本前面系数 0<αi<C 0 < α i < C αi α i 作优化(称为无界样例),判断它们是否满足KKT条件。
2.如果这些样本点都满足KKT条件,那么遍历整个训练集,检验它们是否都满足KKT条件。
3.遍历完子集后,重新开始1,2,直到在执行1和2时没有任何修改就结束
遍历方法不止这一种,其他版本的例如Platt论文中的是指出先遍历整个样本,再遍历无界样本的算法。


那么大家最关心的的问题来了:为什么要选择违反KKT条件最严重的点进行优化呢?其次,优化后是否就能保证样本满足KKT条件?
这里需要引进一个概念——监视可行间隙
它是原始目标函数值和对偶目标函数值的间隙,对于凸二次优化来说这个间隙是零,]则原始目标函数 O(w,b) O ( w , b ) 与对偶目标函数 W(α) W ( α ) 的都是求极小值,它们的差为:

这里写图片描述
在这篇文章http://www.cnblogs.com/vivounicorn/archive/2011/06/01/2067496.html中推导了当选择违背KKT条件的样本时,可行间隙变大,结合Osuna定理我们只需要选取的 αi α i αj α j 中有一个不满足KKT条件,目标函数就会在迭代后值会减小(我们要求最大值),因此我们要对违反KKT条件的样本点就行优化,最后可以选择参数b使优化的参数满足KKT条件。


3.2 第二个变量的选择

首先我们来看之前得到的一个公式:

αnew2=αold2+y2(E1E2)η α 2 n e w = α 2 o l d + y 2 ( E 1 − E 2 ) η

SMO算法称选择第二个变量为内层循环,假设我们在外层循环已经找到了 α1 α 1 , 则第二个变量 α2 α 2 的选择标准是让|E1−E2|有足够大的变化。因为 α1 α 1 已定,那么 E1 E 1 也确定了,所以要想|E1−E2|最大,只需要在 E1 E 1 为正时,选择最小的 Ei E i 作为 E2 E 2 , 在 E1 E 1 为负时,选择最大的 Ei E i 作为 E2 E 2 ,可以将所有的 Ei E i 保存下来加快迭代。
确定第二个乘子方法:
1、首先在无界乘子中寻找使得|E_1-E_2|最大的样本;
2、如果1中没找到则从随机位置查找无界乘子样本;
3、如果2中也没找到,则从随机位置查找整个样本(包含界上和无界乘子)。

最后的收敛条件是在界内( 0<αi<C 0 < α i < C )的样例都能够遵循KKT条件,且其对应的 αi α i 只在极小的范围内变动。

4.SMO算法总结(统计学习方法中的算法)

SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。
假设输入是m个样本 (x1,y1),(x2,y2),...,(xm,ym) ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) ,其中x为n维特征向量。y为二元输出,值为1,或者-1.精度e。
输出是近似解α
1)取初值 α0=0,k=0 α 0 = 0 , k = 0
2)按照3.1节的方法选择 αk1 α 1 k ,接着按照3.2节的方法选择 αk2 α 2 k ,求出新的

αnew,unc2=αk2+y2(E1E2)η α 2 n e w , u n c = α 2 k + y 2 ( E 1 − E 2 ) η

3)根据约束条件求出剪辑后的 αk+12 α 2 k + 1 αk+11 α 1 k + 1 ,更新 α α αk+1
4)计算 bk+1 b k + 1 Ei E i
5)在精度e范围内检查是否满足如下的终止条件:
Ni=1αiyi=0 ∑ i = 1 N α i y i = 0
0αiC,i=1,2...m 0 ≤ α i ≤ C , i = 1 , 2... m
αk+1i=0yig(xi)1 α i k + 1 = 0 ⇒ y i g ( x i ) ≥ 1
0<αk+1i<Cyig(xi)=1 0 < α i k + 1 < C ⇒ y i g ( x i ) = 1
αk+1i=Cyig(xi)1 α i k + 1 = C ⇒ y i g ( x i ) ≤ 1

6)如果满足则结束,返回 αk+1 α k + 1 ,否则转到步骤2。

5.总结

文章内容范围比较大,完成比较仓促,在公式书写上可能存在问题,希望大家能批评指正,我会及时修改过来,谢谢大家。


7.14 一更:对编程代码中的一部分理解

            if (L == H),
                 % continue to next i. 
                   continue;
            end
            eta = 2 * K(i,j) - K(i,i) - K(j,j);
            if (eta >= 0),
                 % continue to next i. 
                   continue;
            end
            if (abs(alphas(j) - alpha_j_old) < tol),
                % continue to next i. 
                % replace anyway
                alphas(j) = alpha_j_old;
                continue;
            end

其实这三段代码含义有类似之处,我们知道所选的两个参数第一个参数是判断不满足KKT条件,这里要求的a2目的是为了|E2-E1|最大,如果a2没有明显的优化的话
或者a2就是常量的话,则并不需要求最优解,迭代后值不变,只需要带到目标函数中计算最后的值。
这里第一段L=H,说明a2是定值,即并不需要优化就是最优值。第二段 η η 是alpha(j)的最优修改量, η η 大于等于0的情况说明,说明 η η 极小值在边界上取,对应的a2也是定值,不需要优化。第三段发现优化后的a2与原值基本没有变化,相当于没有优化。因此都直接跳入到下一个循环中。最后的b要满足带入所有的样本中都满足KKT条件。
但是代码中为什么不继续计算更新后的b,而是直接跳到下一个循环中(继续b的式子在这3个判断之后),毕竟每次更新计算都要用到b,希望大神指点一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值