SMO-Sequential Minimal Optimization,序列最小优化,SMO的基本思路就是:先固定αi之外的所有参数,然后求αi的极值。但是问题中存在约束条件:∑mi=0αiyi=0。如果固定了αi之外的其他变量,则αi可以由其他的变量导出。于是,一次只留一个参数,固定其余参数的方法在这里是不适用的,但是这个思想却给了我们不错的启发。那么,SMO可以每次选择两个变量αi和αj,并固定其他参数。这样,在参数初始化之后,SMO不断迭代重复下面的步骤,直至收敛:
选取一对新的αi和αj;
-
固定αi和αj之外的参数,求解前面的优化问题,获取更新后的αi和αj。
假设我们选择α1与α2是变量,其余的αi是定值,常数,那么原来的目标函数:
minα12∑i=1N∑j=1NαiαjyiyjK(xi⋅xj)−∑i=1Nαis.t.∑i=1Nαiyi=00≤αi≤C,i=1,2,…N
就变为对α1与α2的优化:
minα1,α2W(α1,α2)
1. 原目标函数化简
我们来逐步化简原来的目标函数,其中只有α1与α2是变量,其余的都是常数:
minα12∑i=1N∑j=1NαiαjyiyjK(xi⋅xj)−∑i=1Nαi
我们分别取
i=1,j=1
i=1,j=2
i=1,j≠1,2
j=1,i≠1,2
i=2,j=1
i=2,j=2
i=2,j≠1,2
j=2,i≠1,2
i≠1,2,j≠1,2
这样我们就可以把目标函数化成只有变量α1与α2,其余的项都可以合并为常数C:
minα12∑i=1N∑j=1NαiαjyiyjK(xi⋅xj)−∑i=1Nαi=minα12[α21K11+α1α2y1y2K12+2∑Nj=3α1αjy1yjK1j +α2α1y2y1K21+α22K22+2∑Nj=3α2αjy2yjK2j+C1] −(α1+α2)−C2=minα12[α21K11+α22K22+2α1α2y1y2K12+2∑Nj=3α1αjy1yjK1j +2∑Nj=3α2αjy2yjK2j]−(α1+α2)+C=minα12[α21K11+α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
其中我们知道
y2i=1,所以对于第一个约束条件我们可以有两种表示方式:
y1=y2时,α1+α2=K
y1≠y2时,α1−α2=K

k具体是多少我们并不关心,但是我们知道α1和α2的取值都落在途中的直线上。k无非就是一个截距,随着k的变化,这根直线在方框内会上下移动,交点也变,但是一定要在方框范围内,所以边界一定会落在方框与直线的交点上。设L为α2可能的最小取值,H为α2可能的最大取值,那么有:
-
y1=y2时,α1+α2=K,则α2=K−α1
我们都知道0<α1<C,0<α2<C;
当α1=C时,α2取得最小值,即α2=K−C,但是,0<α2,所以最小值在这两者中取得,于是:
L=max{0,K−C}=max{0,α1+α2−C}
当α1=0时,α2取得最大值,即α2=K但是,α2<C,所以最大值在这两者中取得,于是:
H=min{K,C}=min{α1+α2,C}
-
y1≠y2时,α1−α2=K,则α2=α1−K
我们都知道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=C−K但是,α2<C,所以最大值在这两者中取得,于是:
H=min{C,C−K}=min{C,C+α2−α1}
3.求解过程
先将α1用α2来表示,因为α1y1+α2y2=k(const),两边同时乘以y1,于是有:
α1=(k−α2y2)y1
带入到我们之前化简的目标函数中,那么目标函数就变为只有变量
α2的优化问题了:
minα12[α21K11+α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−α2y2K12−b=f(x1)−(k−α2y2)K11−α2y2K12−bv2=f(x2)−α1y1K12−α2y2K22−b=f(x2)−(k−α2y2)K12−α2y2K22−b
所以,此时目标函数就只是一元函数,我们对其求倒数,并使其为0,就可以求出
α2:
∂W∂α2=12[2((k−α2y2)y1)(−y1y2)K11+2α2K22+2(k−2α2y2)y1y1y2K12+2(−y1y2)α2(y1y2)K12 +2(−y1y2)y1v1+2y2v2]−(−y1y2+1)=(α2−ky2)K11+α2K22+(ky2−2α2)K12−y2v1+y2v2+y1y2−1=α2(K11+K22−2K12)−ky2K11+ky2K12−y2v1+y2v2+y1y2−1=α2(K11+K22−2K12)−ky2K11+ky2K12−y2(v1−v2)+y1y2−1=0
此时我们把v1与v2带入就可以得到迭代公式:
α∗2(K11+K22−2K12)=ky2(K11−K12)+y2(v1−v2)−y1y2+1=ky2(K11−K12)+y2[f(x1)−f(x2)+(k−α2y2)(K12−K11)+α2y2(K22−K12)]−y1y2+y22=α2(K11+K22−2K12)+y2[(f(x1)−y1)−(f(x2)−y2)]
于是我们可以得到递推公式:
α∗2=α2+y2[(f(x1)−y1)−(f(x2)−y2)]K11+K22−2K12=α2+y2E1−E2η
其中
Ej是预测值与实际值之差,
η=K11+K22−2K12
最后将α2的值进行约束:
αnew2=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪H,α∗2,L,α∗2>HL≤α∗2≤Hα∗2<L
得到
α2之后就可以由约束条件
α1y1+α2y2=αnew1y1+αnew2=k得到
α1:
αnew1=α1+y1y2(α2−αnew2)
大部分情况下,η>0,但是当η≤0的时候就比较麻烦了,需要更为复杂的求解手段。详情可以见我后面附上的参考博客。在现实中,这种情况不常发生,因此忽略也无伤大雅,在程序中遇到了一般的处理是跳过此次循环。
4、求解w与b
w的求解可以通过:w∗=∑i=1mα∗iyixi求得。
b可以通过kkt条件求出:
这是原优化问题的KKT条件:
- 当αi=0时,分类是正确的;
- 当0≤αi≤C时,这时的样本点是支持向量,处在边界上;
- 当αi=C时,位于边界之间。
参考上面的KKT条件进行分类讨论:
-
如果0<α1<C,则(x1,y1)为支持向量,满足yi(∑mi=1αiyiKi1+b1)=1:
α∗1y1K11+α∗2y2K21+∑i=3mαiyiKi1+b∗1=y1
b∗1=y1−∑i=3mαiyiKi1−α∗1y1K11−α∗2y2K21=y1−v1−α∗1y1K11−α∗2y2K21=y1−[f(x1)−α1y1K11−α2y2K12−b]−α∗1y1K11−α∗2y2K21=b1−E1−y1K11(α∗1−α1)−y2K21(α∗2−α2)
2.如果0<α2<C,则(x2,y2)为支持向量,那么可以得到b2:
b∗2=b2−E2−y1K12(α∗1−α1)−y2K22(α∗2−α2)
3.如果同时有
0<α1<C,0<α2<C,那么有
b∗1=b∗2。
4.如果均不满足0≤αi≤C就取两者中点:b∗=b∗1+b∗22
在周志华老师的《机器学习》中,还给出了一个更为鲁棒的求法:使用所有支持向量求解的平均值:
b=1|S|∑s∈S(1ys−∑i∈SαiyixTixs)
其中S是所有支持向量的下标集合。
5.总结
SMO的公式推导还是比较复杂的,但是越推就越觉得Platt这些人确实厉害,能推导出如此美丽的公式。钦佩之余,自己又在机器学习的道路上前进了许多,也愈发的觉得自己懂的还是太少,即便是全部推完了这些公式,不会应用的惶恐之心又涌上心头。但是,学无止境,只要一直在路上就一定会到达目的地!
下一篇博客中,我会去研究SMO中启发式的变量选择,看这种方式是如何提高算法的效率的!
参考资料:
周志华《机器学习》-支持向量机
机器学习入门笔记:(4.3)SMO算法
支持向量机(五)SMO算法