拥护向量机(SVM)(二)---优化算法
一、原理概述
根据上一篇文章《支持向量机(SVM)(一)---基本原理》我们得到的SVM的对偶形式的约束优化难题,我们接下来要面对的问题是如何求解下面的最优化问题:
在上述问题中,变量时拉格朗日乘子,每个变量对应于一个样本点
,该优化问题纵然理论上行通过通用的二次规划(QP)求解软件进行求解,但在实际数据规模较大时,通用QP求解器效率过低,难以处理数千甚至上百万的训练样本,为此我们来介绍Platt提出的序列最小最优化(SMO)算法。
SMO算法是一种启发式算法,其基本思路为:若所有变量的解都满足此最优化难题的KKT条件(Karush-Kuhn-Tucker conditions),则说明当前解已达到最优;否则,每次只优化两个拉格朗日乘子和
,固定其他变量,针对这两个变量构建一个二次规划问题,子难题的两个变量中,一个变量是违反KKT条件最严重的那一个,另一个由约束条件自动确定。从而将复杂的大规模二次规划问题转化为一系列可解析求解的二维子障碍,使得 SVM 在大样本条件下也能高效训练。
自由变量,根据约束条件就是需要注意的是子难题的两个变量中只有一个可知如果
确定,那么
也就随之确定。因此子问题中同时更新两个变量。
整个SMO算法包括两部分内容:求解两个比哪里那个二次规划的解析方法和选择变量的启发方法。
二、两个变量二次规划求解方法
假设在一次优化过程中选择的两个变量是和
,其他变量
是固定的,这样我们就可以将SMO的最优化子问题写成(下述公式中省略了不含
的常数项):

其中,是常数,为了解决上述二次规划问题,我们需要先对约束条件进行分析,然后再此约束条件下求极小。由于现在只有两个变量
,约束可以使用二维空间的几何图形进行表示:

根据不等式约束,使得
在上图的正方形内部;根据等式约束
,使得
在平行于正方形对角线的直线上。由于
在该线段上通过等式约束呈线性关系,问题实质上转化为了单变量的最优化问题,后面大家将按照
的最优化问题进行介绍。
假设难题的最初可行解为,最优解为
,在沿着约束方向未经剪辑(未考虑不等式约束)时
的最优解为
。
由于需满足不等式约束,即:
其中L与H表示所在对角线段端点的界。
当时
当时,
为了求解上述问题,我们设置决策函数g(x),其表达式为:
根据决策函数可以计算预测误差,其计算公式为:
在求解过程中,首先求沿着约束方向未经剪辑时的最优解;然后再求剪辑后
的最优解。
在求解过程中,我们需要引入记号:
又因为,因此
可表示为:
将带回原目标函数,得到:

接下来,对求导并令其为0,得到:

将与
代入得到:
根据上述解,经过剪辑后,最优解为:
根据求得
为:
三、选择变量的启发方法
1、第一个变量选择(外层循环)
外层循环中,算法会在训练样本中选取违反KKT条件最为严重的样本点,并对其对应的变量作为第一个变量。具体来说,检验训练样本点是否满足KKT条件,即:

其中,
该检验是在范围内进行的。再检验过程中,外层循环首先遍历所有满足条件
的样本点,即在间隔边界上的支持向量点,检验它们是否满足KKT条件。假如这些点都满足KKT条件,则对整个训练集上的样本点进行检验。
2、第二个变量选择(内层循环)
假设在外层循环中已经找到第1个变量,先要找第二个变量
,它得选择标准使希望能够有足够大的变化。
根据前文推导的求解和
的公式可知,
是依赖于
的,因此为了加快计算,对于大多数问题我们都能够简单的找
的最大值时对应的
。
由于已定,
也就是定值了,那么若
为正,为保证
t最大则选择最小的
作为
;若
为负,则选择最大的
作为
。为了方便,在实际应用中可以将所有的
保存在一个表中。
在特殊情况下,如果上述办法无法充分使目标函数得到足够的下降,那么可以采用启发式规则继续选择,其思路为:遍历再建个边界上的拥护向量点,依次使其对应的变量作为
进行计算,直到目标函数得到了足够的下降。若找不到合适的
则遍历整个训练集。仍找不到合适的
则放弃第一次找到的变量
重新寻找一个新的
。
3、计算阈值b和预测误差E_i
在每次优化两个变量更新完后,我们应该重新对阈值b和预测误差E_i进行计算。
当时,由于KKT条件
可知:
(注:这里为类别标签,取值为+1或-1,所以
)
因此
根据E_1的定义:
可以将公式中的前两项可以写成:
因此最终的更新公式为:
同理允许得到的更新公式为:
如果同时满足条件
,那么
。如果
是0或者C,那么
和
符合KKT条件的阈值,这时选择它们的中点作为就是以及它们之间的数都
。
在每次做完两个变量的优化之后,还必须更新对应的E_i值,并将它们保存在列表中。其更新公式为:
其中,是所有支持向量
的集合。
最终我们可以得到SMO算法的伪代码:
算法:SMO(序列最小优化)
输入:训练集 T = {(x1, y1), …, (xN, yN)},惩罚参数 C,精度 ε
输出:拉格朗日乘子 α,偏置 b
1. 初始化 α ← 0,b ← 0
2. 重复:
2.1 选择一对违反 KKT 条件最严重的变量 (α1, α2)
2.2 在保持其余 α 不变的情况下,构建二变量子问题
2.3 计算未剪辑解 α2_unc
2.4 根据约束 [L, H] 对 α2_unc 进行剪辑,得到 α2_new
2.5 根据等式约束更新 α1_new
2.6 更新偏置 b
3. 直到所有 α 满足 KKT 条件 或 达到最大迭代次数
4. 输出 α, b
四、总结
SMO算法是支持向量机学习的一种快速算法,其特点是不断地将原二次规划问题分解为只有两个变量的二次规划子问题,并对子问题进行解析求解,直到所有变量满足KKT条件为止。这样通过启发式的方法得到原二次规划挑战的最优解。因为子挑战有解析解,因此每次计算子问题都很快,尽管计算子问题次数很多,但在总体仍是高效的。
五、参考文献
[1] 李航. 统计学习方法(第2版)[M]. 北京: 清华大学出版社, 2019.
[2] Harrington P. 机器学习实战[M]. 李锐译. 北京: 人民邮电出版社, 2013.

浙公网安备 33010602011771号