7.4 序列最小最优化算法
序列最小优化算法(Sequential minimal optimization, SMO)是一种用于解决支持向量机训练过程中所产生优化问题的算法。SMO 由微软研究院的约翰·普莱特于 1998 年发明,目前被广泛使用于 SVM 的训练过程中,并在通行的 SVM 库 LIBSVM 中得到实现。1998 年,SMO 算法发表在 SVM 研究领域内引起了轰动,因为先前可用的 SVM 训练方法必须使用复杂的方法,并需要昂贵的第三方二次规划工具。而 SMO 算法较好地避免了这一问题。
SMO 算法主要用于解决如下凸二次规划的对偶问题
在这个问题中,变量是拉格朗日乘子,一个变量 \(\alpha_i\) 对应一个样本点 \((x_i,y_i)\),变量的总数等于训练样本容量 \(N\)。
SMO 算法是一种启发式算法,基本思路是:如果所有变量的解都满足此最优化问题的 KKT 条件,那么这么最优化问题的解就得到了。因为 KKT 条件是该最优化问题的充要条件。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题,这个二次规划问题的关于这两个变量的解应该更接近原始二次规划问题的解,重要的是,这两个变量可以通过解析方法来求解,这样就可以大大提高整个算法的计算速度。
整个 SMO 算法有两大部分组成,第一部分就是选择这两个变量的启发式的方法,第二部分是求解这两个变量的解析方法。
7.4.1 两个变量二次规划的求解方法
不失一般性,假设选择的两个变量是 \(\alpha_1\),\(\alpha_2\),其他变量 \(\alpha_i\ (i=3,4,\cdots,N)\) 是固定的。于是 SMO 的最优化问题的子问题可以写成:
其中,\(K_{ij}=K(x_i,x_j)\),\(\varsigma\) 是常数,并忽略了不含 \(\alpha_{1}\),\(\alpha_2\) 的常数项。
上图中显示了 \(\alpha_{1}\),\(\alpha_2\) 的取值范围,即位于平行于对角线的线段之上。所以两变量最优化问题实际上为单变量最优化问题,不妨考虑变量 \(\alpha_2\) 的最优化问题。
假设二次规划问题的初始可行解是 \(\alpha_1^\text{old}\),\(\alpha_2^\text{old}\),最优解为 \(\alpha_1^\text{new}\),\(\alpha_2^\text{new}\),并且假设在沿着约束方向未经剪辑时 \(\alpha_2\) 的最优解为 \(\alpha_2^\text{new,unc}\)。
由于 \(\alpha_2^\text{new}\) 需要满足不等式约束 \(0\leq\alpha_2^\text{new}\leq C\),所以最优值 \(\alpha_2^\text{new}\) 的取值范围必须满足
下面求解 \(L\) 和 \(H\):
\(\blacksquare\) 若 \(y_1\neq y_2\)
则由
得
利用
得
再结合
得
\(\blacksquare\) 若 \(y_1=y_2\)
则由
得
利用
得
再结合
得
记
令
当 \(i=1,2\) 时,\(E_i\) 为函数 \(g(x)\) 对输入 \(x_i\) 的预测值与真实输出 \(y_i\) 之差。
定理 7.6 两个变量最优化问题沿着约束方向未经剪辑时的解是
7.4.2 变量的选择方法
可以采用启发式的方法选择每次迭代中需要优化的向量。第一个向量可以选取不满足支持向量机 KKT 条件的向量,亦即不满足
的向量。其中
而第二个向量可以选择使得 \(|E_{1}-E_{2}|\) 最大的向量。
7.4.3 计算阈值 \(b\) 和差值 \(\text{E}_i\)
在每次完成两个变量的优化后,都要重新计算阈值 \(b\)。
\(\blacksquare\) 当 \(0<\alpha_1^\text{new}<C\) 时
于是
由 \(E_1\) 的定义式有
连立两式,得
\(\blacksquare\) 当 \(0<\alpha_2^\text{new}<C\) 时
同理
\(\blacksquare\) 当 \(0<\alpha_1^\text{new}<C\) 且 \(0<\alpha_2^\text{new}<C\) 时
\(\blacksquare\) 当 \(\alpha_1^\text{new}\),\(\alpha_2^\text{new}\) 是 0 或 \(C\) 时
\(b_{1}^\text{new}\),\(b_{2}^\text{new}\) 和它们之间的数都是满足 KKT 条件的阈值,这时选择它们的中点,即
在每次完成两个变量的优化之后,还必须更新对应的 \(E_i\) 值。\(E_i\) 值的更新需要用到 \(b^\text{new}\) 值,以及所有支持向量对应的 \(\alpha_j\)
其中 \(S\) 是所有支持向量 \(x_j\) 的集合。
7.4.4 SMO 算法
输入:训练数据集 \(T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}\),其中 \(x_i\in{\cal X}=\mathbb{R}^n\),\(y_i\in{\cal Y}=\{+1,-1\}\),\(i=1,2,\cdots,N\),适当的核函数 \(K(x,z)\),惩罚参数 \(C>0\),精度 \(\epsilon\)
输出:近似解 \(\hat{\alpha}\)
(1) 取初值 \(\alpha^{(0)}=0\),\(b_0=0\),令 \(k=0\)
(2) 计算 \(\eta\)
(4) 计算误差
(11) 更新 \(\alpha=\alpha^{(k+1)}\),若在精度 \(\epsilon\) 范围内满足停机条件
(12) 取 \(\hat{\alpha}=\alpha^{(k+1)}\)