支持向量机之SMO算法

前面我们讲到SVM的基本理论,现在就涉及到SVM的实现,这里就不得不提到SMO算法

SMO算法

1996年,John Platt 发布了一个称为SMO的强大算法,用于训练SVM,SMO表示表示序列最小优化(Sequential Minimal Optimization)。Platt的SMO算法是将大优化问题分解成为许多个小优化问题来求解。这些小优化问题往往很容易求解,并且对他们进行顺序求解的结果与将他们作为整体求解的结果完全一致,在结果完全相同的情况下,SMO算法的求解时间短很多。

目标

SMO算法的目标就是求出一些列的αb,一旦求出了这些α,就很容易求出权值向量w,并且得到分割超平面

SMO算法的具体做法

SMO的算法原理:每次循环中选择两个α进行优化。一旦找到一対合适的α就增大其中一个同时减小另外一个。“合适”指的是这两个α必须在间隔边界之外,并且没有进行过区间化或者不在边界上。

数学推导

前面我们得到了一个对偶问题:

W(α)=mini=1Nj=1Naiajyiyjxixji=1Nai

s.ti=1Naiyi=0,i=1,2,3...N

0aiC,i=1,2,3...N

我们现在要解决的问题是在参数(a1,a2,a3....an)上面求W的最大值的问题,xi,yi都是已知,而C是我们预先设定的,所以也是已知数、
我们按照坐标上升的思路,一次性选择两个参数α1α2,将其他参数固定,这时α2可以用α1表示出来,这样代回到W中,W就是关于α1的函数,这样我们就可以求解。

主要步骤

SMO算法的主要步骤:
第一步选取一对αiαj,选取方法使用启发式方法。第二步,固定除αiαj之外的其他参数,确定W极值条件下的αiαjαi表示。

具体做法

假设我们选取的初始值(α1,α2,α3....αn)满足前面我们所提到的约束条件,我们固定(α3,α4,α5....αn)的值
这样W就是α1α2的函数,并且α1α2满足:

a1y1+a2y2=i=3Naiyi(1)

由于我们将其他值设定成了固定值,所以可以设等式右边为常数ζ
所以有
a1y1+a2y2=ζ(2)

如果y1y2是异号,我们设y1=1,y2==1,因此a1a2=ζ
函数如图所示


支持向量机之SMO算法

由于α1α2的关系被限定在矩阵里面的直线上,所以有我们设H和L分别表示a2的上界和下界,所以有两个变量的优化问题实际上变成了一个变量的优化问题。我们不妨假设最终是α2的优化问题,由于我们上一轮采用的是启发式的迭代法,我们上一轮得到的是α1old,α2old,假设沿着α2方向我们得到未剪辑的α2new。本轮迭代完成之后我们的带的解为α1newα2new,并且所有的α2满足
Lα2H(3)

根据前面的公式(2)我们有:
α1new+α2new=α1old+α2old=ζ(4)

根据上面的直线
ζ>0,则有α2new[0,Cζ]
ζ<0,则有α2new[ζ,C]
所以
L=max(0,ζ)(5.1)

H=min(Cζ,C)(5.2)

同理如果y1y2是同号,a1+a2=ζ,则有:
L=max(0,ζC)(5.3)

H=min(ζ,C)(5.4)

所以我们通过求导所得到的α2new的结果最终为:
α2new={Hα2new>Hα2newL<α2new<HLα2new<L

接下来我们开始求α2new的值,具体做法就是将目标函数对α2求偏导
首先整理我们的目标函数:
α={α1,α2...,αn}是对偶问题的最优解。
设函数
f(x)=i=1NaiyiK(xi,x)+b(6)

所以有误差Ei为:
Ei=f(xi)yi=j=1NaiyiK(xi,xj)+byi(7)

我们定Ki,j表示为K(xi,xj)=ϕ(xi)ϕ(xj)

所以原来的对偶问题又可以被我们写成关于α1α2的函数

W(αi,α2)=min12K11α12+12K22α22+y1y2aα1α2(α1+α2)+y1α1i=3NαiyiKi1+α2y2i=3NαiyiKi2i=3Nαi+i=3Nj=3NαiαjyiyjKij(8)

s.tα1y1+α2y2=i=3Nαiyi=ζ

0αiC,i=1,2

由于其他数都是常数:
定义一个常量ψ
ψ=i=3Nj=3NαiαjyiyjKiji=3Nαi

所以可以将式(8)化简得:
W(α1,α2)=12α12K11+12α22K22+α1α2y1y2K12(α1+α2)+y1α1i=3NαiyiKi1+y2α2i=3NαiyiKi2+ψ(9)

引进标记vi,根据公式(6)
vi=j=3NαjyjKij=f(xi)j=12ajyjKijb(10)

由此我们可以将式子(9)简化成:

W(α1,α2)=12α12K11+12α22K22+α1α2y1y2K12(α1+α2)+y1α1v1+y2α2v2+ψ(11)

有前面我们的假设可以得到α1y1+α2y2=ζ并且有yi2=1,因此我们可以得到

α1=y1(ζα2y2)(12)

所以现在我们可以将函数化成与α2有关的函数:
W(α2)=12K11(ζα2y2)2+12K22α22+α2y2K12(ζα2y2)y1(ζα2y2)α2+(ζα2y2)v1+α2y2v2
化简:
然后我们将函数Wα2求偏导
Wα2=K11α2+K22α22K12a2+y1y21+y2v2y1v2K11ζy2+K12ζy2=0

(K11+K222K12)α2=y2(v1v2+y2y1+K11ζK12ζ)

(K11+K222K12)α2=y2(y2y1+ζK11ζK12+v1v2)

(K11+K222K12)α2=y2(y2y1+(α1y1+α2y2)K11(α1y1+α2y2)K12+(f(x1)bj=12ajyjKj1)(f(x2)bj=12ajyjKj2))

(K11+K222K12)α2=y2((K11+K222K12)α2y2+y2y1+f(x1)f(x2))

(K11+K222K12)α2=y2((K11+K222K12)α2y2+(f(x1)y1)(f(x2)y2))

(K11+K222K12)α2=(K11+K222K12)α2+y2(E1E2)

η=K11+K222K12带入,则有:
α2new=α2old+y2(E1E2)η

此时根据迭代关系是就可以将α1求出来

变量选择方法

第一个变量的选择

SMO称选择第一个变量的循环为外循环。外循环再训练样本中选择违反KKT条件最严重的点,将其作为第一个样本点。检验训练样本点是否满足KKT条件:

αi=0yi(f(xi))0

0αiCyif(xi)=1

αi=Cyif(xi)1

其中f(xi)=j=1NαjyjK(xi.xj)+b

第二变量的选择

SMO称选择第二个变量的过称为内层循环。假设已经在外层找到一个变量α1,要在内层循环找到变量α2。第二个参数的选择标准是希望α2有足够大的变化。
α2是依赖于|E1E2|,所以为了加快计算速度,简单的做法是选择α2,使得其对应的|E1E2|最大。在外层循环确定了α1的情况下,E1也是确定值,所以如果E1为正数,那么要选取最小的Ei作为E2,如果E1为负数,那么则要选择最大的Ei作为E2

计算阈值b和差值Ei

每次完成两个变量的优化,都要重新计算阈值b,0a1newC

i=1NaiyiKi1+b=y1

所以有
b1new=y1i=3NaiyiKi1a1newy1K11a2newy2K21

根据Ei的定义有
E1=i=3NaiyiKi1+bold+a1oldy1K11+a2oldy2K21y1

所以有
b1new=E1y1K11(a1newa1old)y2K22(a2newa2old)+bold

更新完b之后还有更新Ei

Einew=syjajK(xi,xj)+boldyi

SMO的代码实现

SVM原理大致介绍完毕,通过近10天的痛苦的学习,对于SVM里面的数学思想基本上有了一个大致的认识,不过依然存在很多不理解的地方,这一段时间的学习有点痛苦,但是好在收获也不少。分享以前看过的一句话共勉:越是觉得痛苦的时候越是成长得最快的时候。

参考资料