zoukankan      html  css  js  c++  java
  • SMO算法(转)

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

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

    SMO干了什么?
    首先,整个对偶问题的二次规划表达如下:
    egin{align}
mathop {max }limits_{vec alpha } & quad sumlimits_{i = 1}^n {{alpha _i}}  - frac{1}{2}sumlimits_{i = 1}^n {sumlimits_{j = 1}^n {{alpha _i}{alpha _j}{y_i}{y_j}{f{x}}_i^T{{f{x}}_j}} } \
s.t.& quad sumlimits_{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}} 
ight)
    • 固定{vec alpha }向量的其他参数,将left( {{alpha _i},{alpha _j}} 
ight)代入上述表达式进行求最优解获得更新后的left( {{alpha _i},{alpha _j}} 
ight)

    SMO不断执行这两个步骤直至收敛。

    因为有约束sumlimits_{i = 1}^n {{alpha _i}{y_i}}  = 0存在,实际上[{{alpha _i}}][{{alpha _j}}]的关系也可以确定。{alpha _i}{y_i} + {alpha _j}{y_j} = C这两个参数的和或者差是一个常数。

    所以虽然宣传上说是选择了一对left( {{alpha _i},{alpha _j}} 
ight),但还是选择了其中一个,将另一个写作关于它的表达式代入目标函数求解。

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

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

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

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

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

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

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

    References
    [1] Platt, John. "Sequential minimal optimization: A fast algorithm for training support vector machines." (1998).
  • 相关阅读:
    二进制,八进制,十进制,十六进制之间的转换
    using关键字的使用
    简单工厂和单例设计模式
    面向对象的七种设计原则
    第六章 初始继承和多态
    第五章项目:体检套餐管理系统
    第二章《深入C#数据类型》项目经理评分
    <<MySchool数据库设计优化>> 内部测试
    Python 日志处理(一) 按Nginx log_format 分割日志记录
    Python 爬虫练习(一) 爬取国内代理ip
  • 原文地址:https://www.cnblogs.com/shixisheng/p/7419949.html
Copyright © 2011-2022 走看看