从零开始-Machine Learning学习笔记(12)-SMO算法解析

​ SMO-Sequential Minimal Optimization,序列最小优化,SMO的基本思路就是:先固定αi之外的所有参数,然后求αi的极值。但是问题中存在约束条件:i=0mαiyi=0。如果固定了αi之外的其他变量,则αi可以由其他的变量导出。于是,一次只留一个参数,固定其余参数的方法在这里是不适用的,但是这个思想却给了我们不错的启发。那么,SMO可以每次选择两个变量αiαj,并固定其他参数。这样,在参数初始化之后,SMO不断迭代重复下面的步骤,直至收敛:

  • 选取一对新的αiαj;

  • 固定αiαj之外的参数,求解前面的优化问题,获取更新后的αiαj

    假设我们选择α1α2是变量,其余的αi是定值,常数,那么原来的目标函数:

    minα12i=1Nj=1NαiαjyiyjK(xixj)i=1Nαis.t.i=1Nαiyi=00αiC,i=1,2,N

就变为对α1α2的优化:

minα1,α2W(α1,α2)

1. 原目标函数化简

​ 我们来逐步化简原来的目标函数,其中只有α1α2是变量,其余的都是常数:

minα12i=1Nj=1NαiαjyiyjK(xixj)i=1Nαi

我们分别取

i=1,j=1

i=1,j=2

i=1,j1,2

j=1,i1,2

i=2,j=1

i=2,j=2

i=2,j1,2

j=2,i1,2

i1,2,j1,2

这样我们就可以把目标函数化成只有变量α1α2,其余的项都可以合并为常数C:

minα12i=1Nj=1NαiαjyiyjK(xixj)i=1Nαi=minα12[α12K11+α1α2y1y2K12+2j=3Nα1αjy1yjK1j    +α2α1y2y1K21+α22K22+2j=3Nα2αjy2yjK2j+C1]    (α1+α2)C2=minα12[α12K11+α22K22+2α1α2y1y2K12+2j=3Nα1αjy1yjK1j    +2j=3Nα2αjy2yjK2j](α1+α2)+C=minα12[α12K11+α22K22+2α1α2y1y2K12+2α1y1v1+2α2y2v2](α1+α2)+C

其中:
v1=j=3NαjyjK1jv2=j=3NαjyjK2j

于是,我们的目标函数就转化为上式的样子。

2. 解的范围

要求解上述的优化问题,必定先确定解的范围,根据原来的约束条件我们知道:

α1y1+α2y2=K0<α1<C0<α2<C

其中我们知道yi2=1,所以对于第一个约束条件我们可以有两种表示方式:

y1=y2α1+α2=K

y1y2α1α2=K

从零开始-Machine Learning学习笔记(12)-SMO算法解析

​ k具体是多少我们并不关心,但是我们知道α1和α2的取值都落在途中的直线上。k无非就是一个截距,随着k的变化,这根直线在方框内会上下移动,交点也变,但是一定要在方框范围内,所以边界一定会落在方框与直线的交点上。设L为α2可能的最小取值,H为α2可能的最大取值,那么有:

  1. y1=y2α1+α2=Kα2=Kα1

    我们都知道0<α1<C,0<α2<C;

    α1=C时,α2取得最小值,即α2=KC,但是,0<α2,所以最小值在这两者中取得,于是:

    L=max{0,KC}=max{0,α1+α2C}

    α1=0时,α2取得最大值,即α2=K但是,α2<C,所以最大值在这两者中取得,于是:
    H=min{K,C}=min{α1+α2,C}

  2. y1y2α1α2=Kα2=α1K

    我们都知道0<α1<C,0<α2<C;

    α1=0时,α2取得最小值,即α2=K但是,0<α2以最小值在这两者中取得,于是:

L=max{0,K}=max{0,α2α1}

​ 当α1=C时,α2取得最大值,即α2=CK但是,α2<C,所以最大值在这两者中取得,于是:

H=min{C,CK}=min{C,C+α2α1}

3.求解过程

​ 先将α1α2来表示,因为α1y1+α2y2=kconst,两边同时乘以y1,于是有:

α1=(kα2y2)y1

带入到我们之前化简的目标函数中,那么目标函数就变为只有变量α2的优化问题了:
minα12[α12K11+α22K22+2α1α2y1y2K12+2α1y1v1+2α2y2v2](α1+α2)+C=minα12[((kα2y2)y1)2K11+2(kα2y2)α2y2K12   +2(kα2y2)v1+2α2y2v2]((kα2y2)y1+α2)+C

其中,v1与v2需要变换一下,不能直接运算,因为SVM的模型为:
f(x)=wTx+b=i=1NαiyiK(xi,xj)+b,f(x1)=α1y1K11+α2y2K12+i=3NαiyiK(xi,xj)+b=α1y1K11+α2y2K12+v1+bf(x2)=α1y1K12+α2y2K22+i=3NαiyiK(xi,xj)+b=α1y1K12+α2y2K22+v2+b

所以可以间接求出v1与v2为:
v1=f(x1)α1y1K11α2y2K12b=f(x1)(kα2y2)K11α2y2K12bv2=f(x2)α1y1K12α2y2K22b=f(x2)(kα2y2)K12α2y2K22b

所以,此时目标函数就只是一元函数,我们对其求倒数,并使其为0,就可以求出α2:
Wα2=12[2((kα2y2)y1)(y1y2)K11+2α2K22+2(k2α2y2)y1y1y2K12+2(y1y2)α2(y1y2)K12          +2(y1y2)y1v1+2y2v2](y1y2+1)=(α2ky2)K11+α2K22+(ky22α2)K12y2v1+y2v2+y1y21=α2(K11+K222K12)ky2K11+ky2K12y2v1+y2v2+y1y21=α2(K11+K222K12)ky2K11+ky2K12y2(v1v2)+y1y21=0

此时我们把v1与v2带入就可以得到迭代公式:

α2(K11+K222K12)=ky2(K11K12)+y2(v1v2)y1y2+1=ky2(K11K12)+y2[f(x1)f(x2)+(kα2y2)(K12K11)+α2y2(K22K12)]y1y2+y22=α2(K11+K222K12)+y2[(f(x1)y1)(f(x2)y2)]

于是我们可以得到递推公式:
α2=α2+y2[(f(x1)y1)(f(x2)y2)]K11+K222K12=α2+y2E1E2η

其中Ej是预测值与实际值之差,η=K11+K222K12

最后将α2的值进行约束:

α2new={H,α2>Hα2,Lα2HL,α2<L

得到α2之后就可以由约束条件α1y1+α2y2=α1newy1+α2new=k得到α1
α1new=α1+y1y2(α2α2new)

大部分情况下,η>0,但是当η0的时候就比较麻烦了,需要更为复杂的求解手段。详情可以见我后面附上的参考博客。在现实中,这种情况不常发生,因此忽略也无伤大雅,在程序中遇到了一般的处理是跳过此次循环。

4、求解w与b

w的求解可以通过:w=i=1mαiyixi求得。

b可以通过kkt条件求出:

这是原优化问题的KKT条件:

  1. αi=0时,分类是正确的;
  2. 0αiC时,这时的样本点是支持向量,处在边界上;
  3. αi=C时,位于边界之间。

参考上面的KKT条件进行分类讨论:

  1. 如果0<α1<C,则(x1,y1)为支持向量,满足yi(i=1mαiyiKi1+b1)=1

    α1y1K11+α2y2K21+i=3mαiyiKi1+b1=y1

    b1=y1i=3mαiyiKi1α1y1K11α2y2K21=y1v1α1y1K11α2y2K21=y1[f(x1)α1y1K11α2y2K12b]α1y1K11α2y2K21=b1E1y1K11(α1α1)y2K21(α2α2)

2.如果0<α2<C,则(x2,y2)为支持向量,那么可以得到b2:

b2=b2E2y1K12(α1α1)y2K22(α2α2)

3.如果同时有0<α1<C0<α2<C,那么有b1=b2

4.如果均不满足0αiC就取两者中点:b=b1+b22

在周志华老师的《机器学习》中,还给出了一个更为鲁棒的求法:使用所有支持向量求解的平均值:

b=1|S|sS(1ysiSαiyixiTxs)

其中S是所有支持向量的下标集合。

5.总结

​ SMO的公式推导还是比较复杂的,但是越推就越觉得Platt这些人确实厉害,能推导出如此美丽的公式。钦佩之余,自己又在机器学习的道路上前进了许多,也愈发的觉得自己懂的还是太少,即便是全部推完了这些公式,不会应用的惶恐之心又涌上心头。但是,学无止境,只要一直在路上就一定会到达目的地!

​ 下一篇博客中,我会去研究SMO中启发式的变量选择,看这种方式是如何提高算法的效率的!

参考资料:

周志华《机器学习》-支持向量机

机器学习入门笔记:(4.3)SMO算法

支持向量机(五)SMO算法