SMO算法是干啥的
首先要先搞明白一个基本的问题: SMO算法是干啥的?
通过前面的介绍,我们现在掌握了线性不可分支持向量机。其形式为如下的凸二次规划:
min21i=1∑NJ=1∑NαiαjyiyjK(xixj)−i=1∑Nαi
s.t.i=1∑Nαiyi=0
0≤αi≤C
但是到现在为止,都没有讲解到底如何求解其中的参数
α(通过对偶形式求解,
α是拉格朗日乘子)
如果我们找到了一个
α向量,
α=(α1,α1,……αN)是最优解,就可以利用KKT条件来计算出原问题的最优解
(w,b)
w=i=1∑Nαiyixi
取一个
αi>0,b=yi−wTxi 就可以得到分离超平面。
那么问题来了,针对一个这样的凸二次规划问题,如何求解?难点在哪?
现有的求解凸二次规划问题的算法,都有一个瓶颈,那就是当训练样本的容量非常大时,算法往往变的比较低效,甚至无法求解。
SMO算法是如何求解这个凸二次规划问题的呢?它没有想着怎么去直接让目标函数变小,而是采用一个启发式算法,想着法的让这些
α变量满足KKT条件。因为KKT条件是该最优化问题的充分必要条件。
具体怎么优化
α?在优化的过程中需要遵循2个基本原则:
1)每次优化时,必须同时优化
α=(α1,α2,……αN)的两个分量,因为只优化一个分量的话,新的
α向量就不再满足KKT条件里面的初始限制条件中的等式约束了(
s.t.i=1∑Nαiyi=0)
2)每次优化的两个分量应当是违反KKT条件比较多的,还有一个重要的考量,就是经过一次优化后,两个分量要有尽可能多的改变,这样才能用尽可能少的迭代优化次数让它们得到最优解。
SMO算法是一种 启发式算法,其基本思路是:
1)如果
α=(α1,α2,……αN)的每一个分量都满足该二次规划的KKT条件,那么这个最优化问题的解就得到了。(因为KKT条件是该最优化问题的充分必要条件)
2)否则,一次选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变的更小。更重要的是,这时子问题可以通过解析方法求解,这样就可以大大提高整个算法的计算速度。
3)子问题有两个变量,一个是违反KKT条件最严重的那一个(怎么衡量严重性?),另一个由约束条件自动确定(没那么简单)。,如此SMO算法不断将原问题分解为子问题并对子问题求解,进而得到求解原问题的目的。
两个变量的二次规划求解方法
先不考虑具体如何选择两个变量
α1,α2,我们先来看下如何求解二次规划问题。
不失一般性,假设选择的两个变量时
α1,α2,其他变量
αi(i=3,4,……N)是固定的。于是SMO的最优化问题:
min21i=1∑NJ=1∑NαiαjyiyjK(xixj)−i=1∑Nαi
s.t.i=1∑Nαiyi=0
0≤αi≤C
可以写成下面的形式:
minα1,α2W(α1,α2)=0.5K11α12+0.5K22α22+y1y2K12α1α2−(α1+α2)+y1α1v1+y2α2v2+Constant____________________________(1)
其中,
vi=j=3∑NαjyjK(xi,xj),i=1,2
Constant=j=3∑Nαj,不和
α1,α2有关,直接去掉即可。
约束条件变成下面:
等式约束:
y1α1+y2α2=−j=3∑Nαjyj=ζ(常数)
不等式约束:
0≤αi≤C,i=1,2
为了求解2个变量的二次规划问题,首先分析约束条件,然后在此约束条件下求极小值(从这句话可以看出求解这个二次规划的思路,先分析约束条件,在可行域中求最小值)
1)因为对于一个关于
α1,α2的二次函数(根据等式约束本质上是一个一元二次的函数),求其极小值十分简单,只需要求导令其导数为0即可
2) 但是对于一个有约束的问题,还要考虑其定义域(可行域),你的极值点不在可行域里怎么处理?(不在可行域的话要考察其边界点,初中数学的知识)
所以我们先来看这个问题的可行域是什么样子的?
1)首先由于不等式约束
0≤αi≤C,i=1,2,则
α1,α2在一个[0,C]X[0,C]的矩形里面,
2)由等式约束
y1α1+y2α2=ζ(常数),使得
(α1,α2)在平行于矩形[0,C]X[0,C]的对角线的直线上。
因此要求的是目标函数在一条平行于对角线的线段上的最优值。如下图所示:
如何理解上面的两个图:
上面的图说白了就是等式约束
y1α1+y2α2=ζ(常数)和不等式约束
0≤αi≤C,i=1,2的几何解释:
我们可以这样理解:
1)首先对于等式约束
y1α1+y2α2=ζ
y1,y2的取值只能是+1或者-1,上图中左边的图对应着
y1̸=y2的情况,右边对应着
y1=y2的情况
2)那有人说了,为啥左边的图形中要画两条线?其实这个事SMO论文里面的图,我觉得应该再加上一条线,那就是矩形的对角线,为啥?因为对角线是
α1,α2大小的分界线。
搞清楚了这两点,我们接下来分析可行域(考虑
α2)
先看左边的图,即
y1̸=y2的情况,此时
α1−α2=ζ。
1)当
ζ>C或者ζ<−C,很明显此时的直线与方形区域没有交点,此时
α2的可行域为空集
2)当
0<ζ<C时,此时对应左边图中靠下的那条直线,此时
α2取值范围(0,C−ζ)即(0,C−α1+α2)
3)当
−C<ζ<0,此时对应着左边图中靠上的那条直线,此时
α2取值范围(α2−α1,C)
综上所述:
α2的可行域为[max(0,α2−α1),min(C,C−α1+α2)]
对于右边的图:此时
α1+α2=ζ
1)当
ζ>2C或者ζ<0时,显然直线与方形区域没有交点,此时
α2的可行域为空集
2)当
0<ζ<C时,对应靠下的那条直线,此时此时
α2取值范围(0,α1+α2)
3)当
C<ζ<2C时,对应靠上的那条直线,此时此时
α2取值范围(α1+α2−C,C)
综上所述:
α2的可行域为[max(0,α2+α1−C),min(C,α1+α2)]
下面首先求沿着约束方向未经剪辑(即未考虑不等式约束
0≤αi≤C,i=1,2)的情况下,
α2的最优解
α2new,unc
首先根据等式约束
y1α1+y2α2=ζ且
yi2=1可以用
α2代替
α1
α1=(ζ−α2y2)y1将
α1带入上面的式子
W(α1,α2)得到
W(α2)=0.5K11[(ζ−α2y2)y1]2+0.5K22α22+y2K12(ζ−α2y2)α2−(ζ−α2y2)y1−α2+v1(ζ−α2y2)+y2v2α2
接下来对唯一的变量
α2求导令其等于0:
得到:
Δα2ΔW=K11α2+K22α2−2K12α2−K11ζy2+K12ζy2+y1y2−1−v1y2+y2v2
令其等于0,得到:
(K11−2K12+K22)α2=y2(y2−y1+K11ζ−K12ζ+v1−v2)
(K11−2K12+K22)α2=y2[y2−y1+K11ζ−K12ζ+(g(x1)−j=1∑2yjαK1j−b)−(g(x2)−j=1∑2yjαK2j−b)]
(把
(v1,v2)分别用g(x1)−j=1∑2yjαK1j−b与g(x2)−j=1∑2yjαK2j−b)代替)
再将
α1oldy1+α2oldy2=ζ 带入得:
(K11−2K12+K22)α2new,unc=y2((K11−2K12+K22)α2oldy2+y2−y1+g(x1)−g(x2))
(K11−2K12+K22)α2new,unc=(K11−2K12+K22)α2old+y2(E1−E2)
将
η=K11−2K12+K22带入,于是得到
α2new,unc=α2old+ηy2(E1−E2)
考虑约束条件,即要满足不等式约束则:
变量的选择方法
上面已经介绍了如何求解2个变量的最优化问题,前提是从N个变量里面已经取出来了2个变量了。现在讨论的是如何高效的从这N个变量中选择出两个变量进行优化。
1)优化违反KKT条件的参数
α可以减少目标函数的值,所以我们在寻找
α1和α2时,就是要找那些违反KKT条件的样本。
2)SMO算法在每个子问题中都选择两个变量优化,其中至少一个变量是违反KKT条件的。
第一个变量的选择:
SMO称选择第1个变量的过程称作外层循环。外层循环在训练样本中选取违反KKT条件最严重的样本点,并将其对应的变量作为第一个变量。
具体,检验训练样本点
(xi,yi)是否满足KKT条件:即
αi=0等价于yig(xi)≥1(非支持向量) (1)
0<αi<C等价于yig(xi)=1(边界上的支持向量)(2)
αi=C等价于yig(xi)≤1(边界内的支持向量)(3)
其中,
g(xi)=j=1∑NαjyjK(xi,xj)+b
(上面的KKT条件是从原始KKT条件推导过来的,推导过程很简单)
我们如何理解违反KKT条件的呢?
1)我是这样理解的,首先我们的样本可以分成2大类,3小类:即 非支持向量与支持向量,其中支持向量又可细分为 边界上的支持向量(
0<αi<C等价于yig(xi)=1)与边界内的支持向量(
αi=C等价于yig(xi)≤1)
2)那这三种样本都可能违反KKT条件。首先我们要根据
αi的取值(是等于0?大于0小于C?还是等于C)来判断该样本的类别;然后再拿相应的标准衡量(是
yig(xi)≥1?还是
yig(xi)=1?或者
yig(xi)<1)是否违反了KKT条件
3)那这三种样本都可能违反KKT条件,那么我们在选择第一个变量的时候怎么选呢?有没有什么规则?如果我们不区分优先级遍历整个数据集的话,无疑效率是不高的。
SMO算法要求,在检验过程中,外层循环首先遍历所有满足条件(
0<αi<C)的样本点,即在间隔边界上的支持向量点,检验他们是否满足KKT条件?
如果这些样本点都满足KKT条件,那么遍历整个训练集,检验它们是否满足KKT条件。
第2个变量的选择:
SMO称选择第2个变量的过程称作内层循环。假设在外层循环中已经找到第1个变量
α1,现在要在内层循环中找第2个变量
α2,第2个变量选择的标准是希望能使
α2有足够的变化。
由
α2new,unc=α2old+ηy2(E1−E2)可知,
α2new是依赖于
∣E1−E2∣的,为了加快计算速度,一种简单的做法是选择
α2,使其对应的
∣E1−E2∣最大。因为
α1已定,
E1也已经确定。如果
E1是正的,那么选择最小的
Ei作为
E2,如果
E1是负的,选择最大的
Ei作为
E2,为了节省计算时间,将所有的
Ei值保存在一个列表中。
在特殊情况下,如果内层循环通过以上方法选择的
α2不能使目标函数有足够大的下降,那么采用以下启发式规则继续选择
α2
遍历在间隔边界上的支持向量点,依次将其对应的变量作为
α2试用,直到目标函数有足够的下降。如果在这些支持向量里面找不到合适的变量
α2,那么遍历训练数据集,若仍旧找不到合适的
α2,则放弃第1个
α1,再通过外层循环寻找另外的
α1。
说白了就是一个查找顺序的问题:在
α1确定的其概况下,先找能使
∣E1−E2∣最大的变量作为
α2,如果这样的
α2不能使得目标函数有足够的下降;则去支持向量里面遍历,依次作为
α2,如果还是不行,则在整个训练数据集里面查找,如果还不行,那么说明第一个变量
α1选的不合适,那么再次通过外层循环选择新的
α1。
计算阀值b和差值
Ei
在每次完成两个变量的优化后,都要重新计算阀值b(因为在内层循环中计算误差
Ei需要用到新的b)
当
0<α1new<C由KKT
yig(xi)=1条件可知:
i=1∑NαiyiKi1+b=y1
于是
b1new=y1−i=3∑NαiyiKi1−α1newy1K11−α2newy2K21
由
E1的定义式:
Ei=g(xi)−yi=(j=1∑NαjyjK(xj,xi)+b)−yi
得到:
E1=(j=3∑NαjyjK(xj,xi)+α1oldy1K11+α2oldy2K21+bold−y1
y1−i=3∑NαiyiKi1=−E1+α1oldy1K11+α2oldy2K21+bold
带入
b1new的迭代式子:
b1new=−E1−y1K11(α1new−α1old)−y2K21(α2new−α2old)+bold
同理:
如果
0<α2new<C,那么
b2new=−E2−y1K12(α1new−α1old)−y2K22(α2new−α2old)+bold
1)如果
α1new,α2new同时满足条件
0<αinew<C,那么
b1new=b2new
2)如果
α1new,α2new是0或者C,那么
b1new和b2new以及他们之间的数都是符合KKT条件的阀值,这是选择他们的中点作为
bnew
在每次完成两个变量的优化之后,还必须更新对应的
Ei值,并将他们保存在列表中。
Ei值的更新要用到
bnew,以及所有支持向量对应的
αj
Einew=S∑yjαjK(xi,xj)+bnew−yi
其中,S是所有支持向量
xj的集合。