一、回顾
上节,我们介绍到了SMO的总体过程,本节对SMO的三个难点结合代码进行详细分析。
二、SMO算法
(1)设置拉格朗日乘子α=(α[1]...α[i]...α[l])的初始值(一般设为全0),并设置迭代次数计数器k=1。
(2)如果α向量已经收敛(符合KKT达到停止条件),停止循环,返回结果;否则,找出工作集B=(i,j),实际上就是找出所要更新的两个α(α[i],α[j])的下标,另外定义剩下的α的下标标号为N,即N=(1,2...l)\B(\表示去掉B中元素),并定义B所对应的α为,N所对对应的α为
。
(3)若,解决如下问题:
否则,解决下面问题:
实际上都是关于α的更新方式,至于如何解决这两个问题以及α的详细计算公式会在后面介绍。
4)用新的α[i],α[j]替换原来的α[i],α[j],迭代计数器k=k+1,跳到第二步,继续循环。
三、KKT条件
在上一篇博客说过,上述SMO算法存在三个难点:
(1)如何判断α收敛,即如何停止循环,达到KKT条件。
(2)如何找出工作集B=(i,j),即如何选出两个要更新的α=(α[i],α[j]);
(3)如何更新工作集中的α,即如何更新α[i],α[j]。
下面我们来看如何解决第一个问题。
那么什么是KKT条件呢?
假设我们要解决的是含有等式和不等式约束的最优化问题:
其中,p为等式约束条件的数量,q为不等式约束条件的数量。
f(x)在达到最优值(最小值)时必须满足KKT条件,即:
这就是所谓的KKT条件,也就是等式的拉格朗日乘子λ不能为0,不等式(必须是小于号)的拉格朗日乘子μ必须大于0且与不等式g(x)的乘积等于0,同时拉格朗日函数对未知数α的导数等于0(上述2式)。
下面,我们看支持向量机的优化问题:
上述优化问题经过整理可得:
包含两个不等式集合(分别为l个)和一个等式约束集合(l个)。
该优化问题的拉格朗日函数如下:
即:
其中,。
当<C时,C-α>0,ξ(C-α)=0,那么ξ=0,又因为λ>=0,所以由14式得:
>=0
同理,可得当>0,因为λα=0,所以λ=0,因为ξ>=0,所以由14式得:
<=0。
综上所知,得:
因为,y取+1或者-1,将15式左右乘以yi,又可以分两种情况,比如>C时,如果
=+1,那么
=
+b>=0;当
=-1时,两面乘以
,得-
=-
-b>=0,即
+b<=0,同理可分析当
>0和
=+1和-1的情况,最后可得一个关于b的不等式:
实际上,上式就是15式对=+1和-1两种情况的讨论结果。这意味着,满足KKT条件就得满足上式,也就是:
当然,在现实中,我们不这么严密,常采取以下的条件,即:
ε被称为容忍因子。
所以,当我们检测17式就可以当作SMO循环结束的条件,LIBSVM中也是这么做的。
四、工作集的选择
在第三节中,我们讨论了SMO的一个难点就是SMO循环结束的停止条件,接下来我们讨论如何选取工作集B=(i,j),也就是如何选取所要更新的和
。至于原理性的内容,论文Working Set Selection Using Second Order Information for Training Support Vector Machines(http://www.csie.ntu.edu.tw/~cjlin/papers/quadworkset.pdf)进行了详细介绍,挺难理解的,本人目前也未理解,后续可能对原理性继续进行阐述。本文主要对选择过程进行描述。
工作集B=(i,j)的选择过程如下:
(1)计算和
(2)若>0,则
=
,否则
=
,
是自行设置的一个很小的正数。即:
(3)接下来选择i和j,通过选择最大离散对。首先选择i,
通过计算,找出集合
中使得
最大的那个t(t属于
),将其值赋给i。
找出i后,根据i值寻找j:
上式的意思是在一个集合中计算值,找出使该值最小的t,赋给j,这个t属于的集合满足两个条件:首先t属于集合
,同时,还得满足
,这里的i为第一步中选出的i。
过程稍微比较绕,但是理解了后就是两步,第一步找出i,然后根据i找出j。
(4)将i和j返回。
五、
和
的更新
在第四节中我们找出了α的标号i和j,也就是工作集i和j,那么接下来就是更新和
。
在开头我们介绍的SMO算法流程中,介绍了α的更新要根据是否大于0来解决两个问题,这两个问题的详细解决过程在论文LIBSVM: A Library for Support Vector Machines(http://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.pdf)进行了介绍,本文只讲述结果。
经过论文中的转换和计算,最终和
的计算公式如下:
其中,和
为旧值,
和
为所对应的样本标签值,
时,
,
时
,
。
因为和
可能同号也可能异号,所以42式又可以分为两种情况,这里我们拿异号讨论一下,同号可类似。
当和
异号时:
将带入42式得:
同时,因为和
还有0<=α<=C的限制。假设,我们将
对应的惩罚因子记为
,
对应的惩罚因子记为
(上篇博文中我们说过,为了应对不平衡数据,不同符合的α可能采取不同的惩罚因子C),那么综合考虑,α的更新如下:
这个图将α的更新的各种限制分为4个区域。因为(因为SMO更新两个α,其它不变,所有的α满足y1α1+y2α2+...ylαl=常数,即yiαi+yjαj=常数,带入y就可得,减号是因为yi和yj异号),我们拿region I当作例子分析一下:
超过了界限
,所以
取最大值
,由于
,所以综上所知,可得:
同样,当处于region II等其它区域时,可类似分析。
这样,α得更新就介绍完毕了,完整伪代码如下:
if (y[i] != y[j])
{
double quad_coef = Q_i[i] + Q_j[j] + 2 * Q_i[j];
if (quad_coef <= 0)quad_coef = TAU;
double delta = (-G[i] - G[j]) / quad_coef;
double diff = alpha[i] - alpha[j];
alpha[i] += delta;
alpha[j] += delta;
if (diff > 0)
{
if (alpha[j] < 0) // in region III
{
alpha[j] = 0;
alpha[i] = diff;
}
}
else
{
if (alpha[i] < 0) // in region IV
{
alpha[i] = 0;
alpha[j] = -diff;
}
}
if (diff > C_i - C_j)
{
if (alpha[i] > C_i) // in region I
{
alpha[i] = C_i;
alpha[j] = C_i - diff;
}
}
else
{
if (alpha[j] > C_j) // in region II
{
alpha[j] = C_j;
alpha[i] = C_j + diff;
}
}
}
If yi = yj, the derivation is the same.
六、总结
本文详细介绍了LIBSVM中SMO算法最重要得三个难点,结合代码的分析将在以后进行介绍。