上次详细的介绍了用最小二乘法求解结构风险最小化问题的分类支持向量机,并在文章最后给出了求解对偶问题的序列最小优化(Sequential Minimal Optimization, SMO)算法解的形式,但是并未提到其具体的解法。今天我将参考由John C. Platt 在1998年发表的一片名为《Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines》的论文中提到的比较快的二次规划优化算法,特别针对SVM和数据稀疏时性能更优.
OK,接下来,让我们一起了解这天才的想法是如何提炼出来的ba!!!
在开始之前,让我们首先定义特征到结果输出函数为:
这个u 与我们之前定义的f(x) = wTx + b 实质是一样的。接着,咱们重新定义咱们原始的优化问题,权当重新回顾:
类似地,采用Lagrange 乘数法可以得到;
j将上式引入核函数κ(·, ·) 可以得到:
此时,和前面类似可以得到:
引入松弛变量之后得到:
最终的优化目标为:
根据KKT条件可以得出a的取值意义为:
1. (1)式表明是正常分类,在边界内部,我们知道正确分类的点yif(xi) ≥ 0。
2. (2)式表明了是支持向量,在边界上。
3. (3)式表明了是在两条边界之间。
而最优解需要满足KKT 条件,即上述3 个条件都得满足,以下几种情况出现将会出现不满足:
所以要找出不满足KKT 条件的这些αi,并更新这些αi,但这些αi 又受到另外一个约束:
因此,我们通过另一个方法,即同时更新αi 和αj,要求满足下式,就能保证和为0 的约束。
消去αi,可得到一个关于单变量αj 的一个凸二次规划问题,不考虑其约束0 ≤ αj ≤ C,可以得其解为:
然后考虑约束0 ≤ αj ≤ C 可以得到αi 的解析解为:
把SMO 中对于两个参数求解过程看成线性规划来理解来理解的话,那么下图所表达式的辨识。
根据yi和yj 同号或异号,可得出两个上、下界分别为:
对于αi,有;
那么如果和求得αi 和αj 呢?对于αi,可以通过刚刚说的那3 种不满足KKT 的条件来找;而对于αj,可以通过max |Ei − Ej | 求得;而b 的更新则是:
每次更新完αi 和αj 后,都需要再重新计算b,及对应的Ei 和Ej。
SMO算法的计算步骤:
SMO 的主要步骤下图所示。其中迭代的两步是:
(1) 选择接下来要更新的一对αi 和αj:采用启发式的方法进行选择,以使目标函数最大程度地接近其全局最优值
(2) 将目标函数对αi 和αj 进行优化,保持其它所有的αk(k ̸= i, j) 不变
假定在某一次迭代中,需要更新α1 和α2,那么优化目标可以写成:
而更新α1 和α2 的步骤如下:
综上,SMO 算法的基本思想是将Vapnik 在1982 年提出的Chunking 方法推到极致,SMO 算法每次迭代只选出两个分量αi 和αj 进行调整,其它分量则保持固定不变,在得到解αi 和αj 之后,再用αi 和αj 改进其它分量。与通常的分解算法比较,尽管它可能需要更多的迭代次数,但每次迭代的计算量比较小,所以该算法表现出整理的快速收敛性,且不需要存储核矩阵,也没有矩阵运算。