前面我们讲到SVM的基本理论,现在就涉及到SVM的实现,这里就不得不提到SMO算法
SMO算法
1996年,John Platt 发布了一个称为SMO的强大算法,用于训练SVM,SMO表示表示序列最小优化(Sequential Minimal Optimization)。Platt的SMO算法是将大优化问题分解成为许多个小优化问题来求解。这些小优化问题往往很容易求解,并且对他们进行顺序求解的结果与将他们作为整体求解的结果完全一致,在结果完全相同的情况下,SMO算法的求解时间短很多。
目标
SMO算法的目标就是求出一些列的α和b,一旦求出了这些α,就很容易求出权值向量w,并且得到分割超平面
SMO算法的具体做法
SMO的算法原理:每次循环中选择两个α进行优化。一旦找到一対合适的α就增大其中一个同时减小另外一个。“合适”指的是这两个α必须在间隔边界之外,并且没有进行过区间化或者不在边界上。
数学推导
前面我们得到了一个对偶问题:
W(α)=min∑i=1N∑j=1Naiajyiyjxixj−∑i=1Nai
s.t∑i=1Naiyi=0,i=1,2,3...N
0≤ai≤C,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)
如果
y1和y2是异号,我们设
y1=1,y2==−1,因此
a1−a2=ζ
函数如图所示

由于
α1和
α2的关系被限定在矩阵里面的直线上,所以有我们设H和L分别表示
a2的上界和下界,所以有两个变量的优化问题实际上变成了一个变量的优化问题。我们不妨假设最终是
α2的优化问题,由于我们上一轮采用的是启发式的迭代法,我们上一轮得到的是
αold1,αold2,假设沿着
α2方向我们得到未剪辑的
αnew2。本轮迭代完成之后我们的带的解为
αnew1和
αnew2,并且所有的
α2满足
L≤α2≤H(3)
根据前面的公式(2)我们有:
αnew1+αnew2=αold1+αold2=ζ(4)
根据上面的直线
若
ζ>0,则有
αnew2∈[0,C−ζ]
若
ζ<0,则有
αnew2∈[−ζ,C]
所以
L=max(0,−ζ)(5.1)
H=min(C−ζ,C)(5.2)
同理如果
y1与y2是同号,
a1+a2=ζ,则有:
L=max(0,ζ−C)(5.3)
H=min(ζ,C)(5.4)
所以我们通过求导所得到的
αnew2的结果最终为:
αnew2=⎧⎩⎨⎪⎪Hαnew2Lαnew2>HL<αnew2<Hαnew2<L
接下来我们开始求
αnew2的值,具体做法就是将目标函数对
α2求偏导
首先整理我们的目标函数:
设
α∗={α∗1,α∗2...,α∗n}是对偶问题的最优解。
设函数
f(x∗)=∑i=1Na∗iyiK(xi,x)+b(6)
所以有误差Ei为:
Ei=f(xi)−yi=∑j=1Na∗iyiK(xi,xj)+b−yi(7)
我们定
Ki,j表示为
K(xi,xj)=ϕ(xi)ϕ(xj)
所以原来的对偶问题又可以被我们写成关于α1和α2的函数
W(αi,α2)=min12K11α21+12K22α22+y1y2aα1α2−(α1+α2)+y1α1∑i=3NαiyiKi1+α2y2∑i=3NαiyiKi2−∑i=3Nαi+∑i=3N∑j=3NαiαjyiyjKij(8)
s.tα1y1+α2y2=−∑i=3Nαiyi=ζ
0≤αi≤C,i=1,2
由于其他数都是常数:
定义一个常量
ψ ψ=∑i=3N∑j=3NαiαjyiyjKij−∑i=3Nαi
所以可以将式(8)化简得:
W(α1,α2)=12α21K11+12α22K22+α1α2y1y2K12−(α1+α2)+y1α1∑i=3NαiyiKi1+y2α2∑i=3NαiyiKi2+ψ(9)
引进标记
vi,根据公式(6)
vi=∑j=3NαjyjKij=f(xi)−∑j=12ajyjKij−b(10)
由此我们可以将式子(9)简化成:
W(α1,α2)=12α21K11+12α22K22+α1α2y1y2K12−(α1+α2)+y1α1v1+y2α2v2+ψ(11)
有前面我们的假设可以得到α1y1+α2y2=ζ并且有y2i=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α2−2K12a2+y1y2−1+y2v2−y1v2−K11ζy2+K12ζy2=0
(K11+K22−2K12)α2=y2(v1−v2+y2−y1+K11ζ−K12ζ)
(K11+K22−2K12)α2=y2(y2−y1+ζK11−ζK12+v1−v2)
(K11+K22−2K12)α2=y2(y2−y1+(α1y1+α2y2)K11−(α1y1+α2y2)K12+(f(x1)−b−∑j=12ajyjKj1)−(f(x2)−b−∑j=12ajyjKj2))
(K11+K22−2K12)α2=y2((K11+K22−2K12)α2y2+y2−y1+f(x1)−f(x2))
(K11+K22−2K12)α2=y2((K11+K22−2K12)α2y2+(f(x1)−y1)−(f(x2)−y2))
(K11+K22−2K12)α2=(K11+K22−2K12)α2+y2(E1−E2)
将
η=K11+K22−2K12带入,则有:
αnew2=αold2+y2(E1−E2)η
此时根据迭代关系是就可以将
α1求出来
变量选择方法
第一个变量的选择
SMO称选择第一个变量的循环为外循环。外循环再训练样本中选择违反KKT条件最严重的点,将其作为第一个样本点。检验训练样本点是否满足KKT条件:
αi=0⇔yi(f(xi))≥0
0≤αi≤C⇔yif(xi)=1
αi=C⇔yif(xi)≤1
其中
f(xi)=∑Nj=1αjyjK(xi.xj)+b
第二变量的选择
SMO称选择第二个变量的过称为内层循环。假设已经在外层找到一个变量α1,要在内层循环找到变量α2。第二个参数的选择标准是希望α2有足够大的变化。
而α2是依赖于|E1−E2|,所以为了加快计算速度,简单的做法是选择α2,使得其对应的|E1−E2|最大。在外层循环确定了α1的情况下,E1也是确定值,所以如果E1为正数,那么要选取最小的Ei作为E2,如果E1为负数,那么则要选择最大的Ei作为E2
计算阈值b和差值Ei
每次完成两个变量的优化,都要重新计算阈值b,0≤anew1≤C
∑i=1NaiyiKi1+b=y1
所以有
bnew1=y1−∑i=3NaiyiKi1−anew1y1K11−anew2y2K21
根据Ei的定义有
E1=∑i=3NaiyiKi1+bold+aold1y1K11+aold2y2K21−y1
所以有
bnew1=−E1−y1K11(anew1−aold1)−y2K22(anew2−aold2)+bold
更新完b之后还有更新Ei
Enewi=∑syjajK(xi,xj)+bold−yi
SMO的代码实现
SVM原理大致介绍完毕,通过近10天的痛苦的学习,对于SVM里面的数学思想基本上有了一个大致的认识,不过依然存在很多不理解的地方,这一段时间的学习有点痛苦,但是好在收获也不少。分享以前看过的一句话共勉:越是觉得痛苦的时候越是成长得最快的时候。
参考资料