SMO算法

SMO(序列最小优化)算法,由John Platt提出,给出了一种有效的解决由SVM导出的对偶问题的方法,让我们首先先介绍一下坐标上升算法。

坐标上升

考虑到解决非限制最优化问题:
maxαW(α1,α2,...,αm)
现在,我们认为W仅仅是以 αi 为参数的函数,现在开始忽略所有这个问题与SVM之间的关系。我们现在已经见到两个最优化算法,梯度下降法和牛顿算法。我们要学习的新算法叫做坐标上升:
SMO算法_第1张图片
在最内层循环中,我们要保持除了一些 αi 所有的变量不变,然后重新最小化W对应于参数 αi ,在这里我们更新的顺序为 α1,α2,....,αm,α1,α2,.... ,这里有一个描述这个过程的图片:
SMO算法_第2张图片
图中的椭圆是我们想要最优化的二次方程的等高线。坐标上升被初始化为(-2,-2),并且在图中也画出了它到全局最大化的路径。注意到,坐标上升的每步都是平行于一条坐标轴,原因是我们一次只优化一个变量。

SMO

现在我们来推导SMO算法。这里是我们要解决的对偶问题:
SMO算法_第3张图片
如果 αis 满足约束条件18-19。现在我们假设保持 α2,...,αm 不变,然后按照上面的方法调整 α1 。这样我们能否改进算法?回答是否定的,由于约束条件(19)我们可以得到
α1=y(1)Σmi=2αiy(i)
因此可以得到 α1 是由其他的 α 决定的,因此如果保持 α2,...αm ,那么由于约束条件我们就不能再改变 α1 了。
因此,如果我们想要更新 αi ,我们必须至少同时改变两个 α 以满足约束条件,SMO算法,可以简单的描述如下:
直到收敛{
1选择一对将要更新的 αi αj (使用方法找到两个可以使全局最大最快的两个变量)
2用对应的 αi αj 重新优化 W(α) 并且保持其他的 αk ( ki,j )固定
}
为了检验算法收敛,我们可以检查KKT条件是否符合一些误差 tol , tol 是收敛误差参数,通常会设置为大约0.01到0.001之间。
SMO算法高效的原因是计算更新 αi αj 将会非常高效。下面简单的推导一下。
假设我们现在的 αi 满足约束条件,我们固定 α1,α2,....,αm 并且想要重优化关于 α1 α2 W(α1,α2,...,αm) 由于约束条件我们得到:这里写图片描述
由于等式右边是一个固定值,所以我们可以用常量 ζ 表示:
α1y(1)+α2y(2)=ζ (20)
因此可以把约束条件画出为:
SMO算法_第4张图片
从约束条件(18),我们得知 α1 α2 必须在盒子 [0,C]×[0,C] 里面,同时也必须在 α1y(1)+α2y(2)=ζ 这条线上,因此可以得到 LαH ,否则 (α1,α2) 不能同时满足盒子和直线。我们可以得到 α1 关于 α2 的函数,因此目标 W(α) 可以写为:
因此这是一个只有 α2 的二次变量,也就是说他可以表示为 aα22+bα2+c ,如果我们忽略了约束条件(18),这样我们就能够通过求导等于0来最大化二次方程。我们将要使用 αnew,unclipped2 代表 α 的结果。由于约束条件的限制可以得到
这里写图片描述
最后,在已经找到了 αnew2 之后我们可以使用等式(20)带回然后找到最优化值 αnew1
还有问题就是如何选取要更新的 αi α2 ,还有就是当使用SMO算法的时候如何更新b.

你可能感兴趣的:(机器学习)