本文结合了《统计学习方法》,吴恩达中文笔记,以及一些博客文章https://www.cnblogs.com/pinard/p/6111471.html,http://www.cnblogs.com/vivounicorn/archive/2011/06/01/2067496.html,https://blog.csdn.net/Victor_Gun/article/details/45228071,并结合个人理解总结出了这篇详细介绍SMO算法的文章。文章有详细的数学推导过程,可以解决大多数疑惑的地方,希望能对大家有所帮助。
支持向量机的最后一节,用SMO优化算法解决对偶函数的最后优化问题,首先先介绍坐标上升法
1.坐标上升法
假设我们有一个要求解的优化问题: maxαW(α1,α2,...,αm) m a x α W ( α 1 , α 2 , . . . , α m ) 这里W是 α α 向量的函数。之前我们讲过求最优解的两种方法分别是梯度下降法和牛顿法,这里是新的一种方法——坐标上升法,其方法过程为:
坐标上升法虽然比牛顿法有更多的迭代,但每次迭代的代价都很小。
2.SMO优化算法(Sequential minimal optimization)
SMO算法解决对偶函数的最后优化问题:
按照坐标上升的思路,我们固定除 α1 α 1 其中一个参数以外的所有参数,但是这样有问题,因为固定 α1 α 1 之外所有参数,那么 α1 α 1 不再是变量,因为 α1 α 1 可以由其他固定的参数表示出来。
因此我们需要一次选择两个参数做优化,比如 α1 α 1 和 α2 α 2 ,此时 α2 α 2 可以由 α1 α 1 和其他参数表示出来,再带回W中,W就是只关于 α1 α 1 的函数,可解。这样,SMO的主要步骤为:
接下来将 W(α) W ( α ) 改写一下:
以下是推导过程,首先推导出未考虑约束条件的 αnew,unclipped2 α 2 n e w , u n c l i p p e d 。为了叙述方便我们记:
引入记号变量
目标函数可写成
根据 α1y1=ζ−α2y2 α 1 y 1 = ζ − α 2 y 2 以及 yi2=1 y i 2 = 1 ,将两遍同乘一个 yi y i ,则可将 α1 α 1 表示为:
将 α1 α 1 带入到目标函数中,则目标函数变为只含α2的函数:
接下来我们关注一下问题的约束条件:
选择的两个变量得到最优化的解 αnew1 α 1 n e w 和 αnew2 α 2 n e w 后,我们要根据最优化的解求出对应的满足KKT条件的b值,因为KKT条件就是我们收敛的条件。所以我们继续推导出阈值b的更新:
推导b——首先来看一下KKT条件:
于是有:
由之前 E1 E 1 定义是得:
每次完成优化后,还需要更新 Ei E i , Ei E i 更新要用到 bnew b n e w ,以及所有
支持向量对应的
αj
α
j
其中,S是所有支持向量 xj x j 的集合。
3.SMO中拉格朗日乘子的启发式选择方法
SMO算法在每个子问题中选择两个变量优化,其中至少一个变量是违反KKT条件的
3.1 第一个变量的选择
SMO算法称选择第一个变量为外层循环,这个变量需要选择在训练集中违反KKT条件最严重的样本点。选择方法为
1.优先选择样本前面系数
0<αi<C
0
<
α
i
<
C
的
αi
α
i
作优化(称为无界样例),判断它们是否满足KKT条件。
2.如果这些样本点都满足KKT条件,那么遍历整个训练集,检验它们是否都满足KKT条件。
3.遍历完子集后,重新开始1,2,直到在执行1和2时没有任何修改就结束
遍历方法不止这一种,其他版本的例如Platt论文中的是指出先遍历整个样本,再遍历无界样本的算法。
那么大家最关心的的问题来了:为什么要选择违反KKT条件最严重的点进行优化呢?其次,优化后是否就能保证样本满足KKT条件?
这里需要引进一个概念——监视可行间隙
它是原始目标函数值和对偶目标函数值的间隙,对于凸二次优化来说这个间隙是零,]则原始目标函数
O(w,b)
O
(
w
,
b
)
与对偶目标函数
W(α)
W
(
α
)
的都是求极小值,它们的差为:
3.2 第二个变量的选择
首先我们来看之前得到的一个公式:
SMO算法称选择第二个变量为内层循环,假设我们在外层循环已经找到了 α1 α 1 , 则第二个变量 α2 α 2 的选择标准是让|E1−E2|有足够大的变化。因为 α1 α 1 已定,那么 E1 E 1 也确定了,所以要想|E1−E2|最大,只需要在 E1 E 1 为正时,选择最小的 Ei E i 作为 E2 E 2 , 在 E1 E 1 为负时,选择最大的 Ei E i 作为 E2 E 2 ,可以将所有的 Ei E i 保存下来加快迭代。
确定第二个乘子方法:
1、首先在无界乘子中寻找使得|E_1-E_2|最大的样本;
2、如果1中没找到则从随机位置查找无界乘子样本;
3、如果2中也没找到,则从随机位置查找整个样本(包含界上和无界乘子)。
最后的收敛条件是在界内( 0<αi<C 0 < α i < C )的样例都能够遵循KKT条件,且其对应的 αi α i 只在极小的范围内变动。
4.SMO算法总结(统计学习方法中的算法)
SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。
假设输入是m个样本
(x1,y1),(x2,y2),...,(xm,ym)
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
,其中x为n维特征向量。y为二元输出,值为1,或者-1.精度e。
输出是近似解α
1)取初值
α0=0,k=0
α
0
=
0
,
k
=
0
2)按照3.1节的方法选择
αk1
α
1
k
,接着按照3.2节的方法选择
αk2
α
2
k
,求出新的
3)根据约束条件求出剪辑后的 αk+12 α 2 k + 1 和 αk+11 α 1 k + 1 ,更新 α α 为;
4)计算 bk+1 b k + 1 和 Ei E i
5)在精度e范围内检查是否满足如下的终止条件:
0≤αi≤C,i=1,2...m 0 ≤ α i ≤ C , i = 1 , 2... m
αk+1i=0⇒yig(xi)≥1 α i k + 1 = 0 ⇒ y i g ( x i ) ≥ 1
0<αk+1i<C⇒yig(xi)=1 0 < α i k + 1 < C ⇒ y i g ( x i ) = 1
αk+1i=C⇒yig(xi)≤1 α i k + 1 = C ⇒ y i g ( x i ) ≤ 1
6)如果满足则结束,返回 αk+1 α k + 1 ,否则转到步骤2。
5.总结
文章内容范围比较大,完成比较仓促,在公式书写上可能存在问题,希望大家能批评指正,我会及时修改过来,谢谢大家。
7.14 一更:对编程代码中的一部分理解
if (L == H),
% continue to next i.
continue;
end
eta = 2 * K(i,j) - K(i,i) - K(j,j);
if (eta >= 0),
% continue to next i.
continue;
end
if (abs(alphas(j) - alpha_j_old) < tol),
% continue to next i.
% replace anyway
alphas(j) = alpha_j_old;
continue;
end
其实这三段代码含义有类似之处,我们知道所选的两个参数第一个参数是判断不满足KKT条件,这里要求的a2目的是为了|E2-E1|最大,如果a2没有明显的优化的话
或者a2就是常量的话,则并不需要求最优解,迭代后值不变,只需要带到目标函数中计算最后的值。
这里第一段L=H,说明a2是定值,即并不需要优化就是最优值。第二段
η
η
是alpha(j)的最优修改量,
η
η
大于等于0的情况说明,说明
η
η
极小值在边界上取,对应的a2也是定值,不需要优化。第三段发现优化后的a2与原值基本没有变化,相当于没有优化。因此都直接跳入到下一个循环中。最后的b要满足带入所有的样本中都满足KKT条件。
但是代码中为什么不继续计算更新后的b,而是直接跳到下一个循环中(继续b的式子在这3个判断之后),毕竟每次更新计算都要用到b,希望大神指点一下