SMO算法是干什么的?有什么作用?

作者:[已重置]
链接:http://www.zhihu.com/question/40546280/answer/88539689
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

SMO(Sequential Minimal Optimization)是针对求解SVM问题的Lagrange对偶问题,一个二次规划式,开发的高效算法。传统的二次规划算法的计算开销正比于训练集的规模,而SMO基于问题本身的特性(KKT条件约束)对这个特殊的二次规划问题的求解过程进行优化。对偶问题中我们最后求解的变量只有Lagrange乘子 {\vec \alpha }向量,这个算法的基本思想就是每次都只选取一对 \left( {​{\alpha _i},{\alpha _j}} \right),固定 {\vec \alpha }向量其他维度的元素的值,然后进行优化,直至收敛。

SMO干了什么?
首先,整个对偶问题的二次规划表达如下:
\begin{align}\mathop {\max }\limits_{\vec \alpha } & \quad \sum\limits_{i = 1}^n {​{\alpha _i}}  - \frac{1}{2}\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {​{\alpha _i}{\alpha _j}{y_i}{y_j}{\bf{x}}_i^T{​{\bf{x}}_j}} } \\s.t.& \quad \sum\limits_{i = 1}^n {​{\alpha _i}{y_i}}  = 0 \\& \quad {\alpha _i} \ge 0, \quad i = 1,2, \ldots ,n\end{align}
SMO在整个二次规划的过程中也没干别的,总共干了两件事:
  • 选取一对参数\left( {​{\alpha _i},{\alpha _j}} \right)
  • 固定{\vec \alpha }向量的其他参数,将\left( {​{\alpha _i},{\alpha _j}} \right)代入上述表达式进行求最优解获得更新后的\left( {​{\alpha _i},{\alpha _j}} \right)
SMO不断执行这两个步骤直至收敛。

因为有约束 \sum\limits_{i = 1}^n {​{\alpha _i}{y_i}}  = 0存在,实际上 \[{​{\alpha _i}}\]\[{​{\alpha _j}}\]的关系也可以确定。 {\alpha _i}{y_i} + {\alpha _j}{y_j} = C这两个参数的和或者差是一个常数。
<img src="https://i-blog.csdnimg.cn/blog_migrate/c5879661e015c7d04266b0197adb35cd.png" data-rawwidth="633" data-rawheight="274" class="origin_image zh-lightbox-thumb" width="633" data-original="https://pic1.zhimg.com/071f3351b3eee2db40fea3ba944f9d7c_r.png">所以虽然宣传上说是选择了一对 所以虽然宣传上说是选择了一对 \left( {​{\alpha _i},{\alpha _j}} \right),但还是选择了其中一个,将另一个写作关于它的表达式代入目标函数求解。

为什么SMO跑的那么快,比提出之前的算法不知道高到哪里去了?
正如上面提到的,在固定其他参数以后,这就是一个 单变量二次规划问题,仅有的约束也是这个变量 \alpha _i \ge 0,显然有闭式解。不必再调用数值优化算法。

KKT条件是对偶问题最优解的 必要条件
\begin{cases}{​{\alpha _i} \ge 0}\\{​{y_i}f\left( {​{​{\bf{x}}_i}} \right) - 1 \ge 0}\\{​{\alpha _i}\left( {​{y_i}f\left( {​{​{\bf{x}}_i}} \right) - 1} \right) = 0}\end{cases}

除了第一个非负约束以外,其他约束都是根据目标函数推导得到的最优解必须满足的条件,如果违背了这些条件,那得到的解必然不是最优的,目标函数的值会减小。

所以在SMO迭代的两个步骤中,只要 \left( {​{\alpha _i},{\alpha _j}} \right)中有一个违背了KKT条件,这一轮迭代完成后,目标函数的值必然会增大。Generally speaking,KKT条件违背的程度越大,迭代后的优化效果越明显,增幅越大。

怎样跑的更快?
和梯度下降类似,我们要找到使之优化程度最大的方向(变量)进行优化。所以SMO先选取违背KKT条件程度最大的变量,那么第二个变量应该选择使目标函数值增大最快的变量,但是这个变量怎么找呢?比较各变量优化后对应的目标函数值的变化幅度?这个样子是不行的,复杂度太高了。

SMO使用了一个启发式的方法,当确定了第一个变量后,选择使两个变量对应样本之间最大的变量作为第二个变量。直观来说,更新两个差别很大的变量,比起相似的变量,会带给目标函数更大的变化。间隔的定义也可以借用偏差函数
\[{E_i} = \max \left( {​{y_i}f\left( {​{​{\bf{x}}_i}} \right) - 1,0} \right)\]
我们要找的也就是使对于 \alpha_i来说使 \left| {​{E_i} - {E_j}} \right|最大的 \alpha_j

很惭愧,只做了一点微小的工作。

References

[1] Platt, John. "Sequential minimal optimization: A fast algorithm for training support vector machines." (1998).



最近刚看完smo算法的代码,所以试着回答题主的问题。
解决svm首先将原始问题转化到对偶问题,而对偶问题则是一个凸二次规划问题,理论上你用任何一个解决凸二次规划的软件包都可以解决,但是这样通常来说很慢,大数据情况下尤其不实际,smo是微软研究院的大神发明的解决svm对偶问题的优化算法,可以更快找到好的解。通常而言分简化版和优化版smo算法。
简化版:每次迭代随机选取alpha_i和alpha_j,当然其中要有一个违反kkt条件,通常先选一个违反kkt条件的alpha_i,然后随机选择一个alpha_j,然后用类似坐标上升(下降)的算法来优化目标函数,具体细节题主可以看相关代码,推荐《machine learning in action》的svm部分,但是这样的优化方式并不是最快的;
优化版:用启发式的算法选择alpha_j,即选择alpha_j,使得|Ei-Ej|最大,至于为什么,因为变量的更新步长正比于|Ei-Ej|,也就是说我们希望变量更新速度更快,其余的和简化版其实区别不大;
应该还有其他版本的smo,没看过不做评论,希望对题主有用。


作者:司徒功源
链接:http://www.zhihu.com/question/40546280/answer/87204403
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值