[ML从入门到入门] 支持向量机:从SVM的推导过程到SMO的收敛性讨论
引言
支持向量机(Support Vector Machine,SVM)在70年代由苏联人 Vladimir Vapnik 提出,主要用于处理二分类问题,也就是研究如何区分两类事物。
本文主要介绍支持向量机如何解决线性可分和非线性可分问题,最后还会对 SMO 算法进行推导以及对 SMO 算法的收敛性进行简要分析,但受限于篇幅,本文不会对最优化问题、核函数、原问题和对偶问题等前置知识做过于深入的介绍,需要了解相关知识的读者朋友请移步其它文章、资料。
SVM 推导过程主要参考自胡浩基教授的机器学习公开课程;SMO 算法相关则主要来自于 Platt 的论文以及网上公开资料,相关链接见文章末尾。
快速理解
举一个粗糙的例子。
科学家收集到一批天体的观测数据,现在需要按行星和恒星两种类型对这些未知天体进行分类。显然这是一项费时费力的工作,我们希望通过机器学习算法,让计算机自动帮我们做区分。
我们拿到了往年一批已经分类好的天体数据样本,将这些样本绘制到一个二维坐标系上,如下:
这是一个简单的二维特征空间,通过肉眼观察这些数据我们发现,恒星和行星这两种天体,根据他们的辐射强度和质量的不同,分别聚集在坐标系的左下角和右上角两个区域。
于是我们根据自己的判断作了这样一条直线:
这时,我们就拥有了一条可以区分恒星和行星的直线,当点落在直线左侧的可判断为行星,如果落在右侧则为恒星。
但是上面这条直线是我们凭借经验所作,显然在坐标系中能够划分这两类天体的直线有无数条,如下图:
这种情况下,如何定义一个性能指标去找到一条最合适的直线就是支持向量机要解决的首要问题。
Vapnik 提出了使用如下一对平行线的 间隔(Margin)来作为这个性能指标,间隔越大,意味着最终获得的直线更具普适性,如下图:
上面坐标系中,首先是在两种样本中间找一对平行线,我们从 0 开始扩大平行线的间隔 d,直到两条线分别经过两种样本的一个或多个点为止,这些点被称为 支持向量(Support Vector),当间隔 d 最大时,两条平行线的正中间我们可以取到第三条平行线,如下图红色虚线所示:
在众多的分界线当中,这条红色直线被认为是一个最优解,称为 决策边界(Decision Boundary)。
上面的例子中,两种样本各自会有一片聚集密度较高的区域,而远离这片区域,样本逐渐变得稀疏,样本越稀疏意味着落到该区域的概率越低。决策边界直线在兼顾划分不同样本的同时,还需要放置在两种样本之间最不可能出现的区域,那么,当间隔 d 取最大时即为最理想的状态。
目前为止我们可以得到一些初期结论:
实际应用场景中,我们经常会遇到比上面例子复杂得多的问题。例如通过图像区分月季和玫瑰,我们需要从颜色、花瓣形状、叶子形状等等多个特征进行综合判断,训练样本最终会落到一个多维特征空间中,此时划分两种训练样本的边界将会是一个超平面,称为 分离超平面(Separating Hyperplane)。
支持向量机本质是用线性方程去解决二分类问题,而在实际问题中,不同的样本在特征空间中往往“犬牙交错”,SVM 这种“一刀切”的方式似乎将变得不再奏效。别担心,后面笔者将会花大篇幅着墨如何处理这种线性不可分的样本。
支持向量机的两种模型
支持向量机有 线性模型、非线性模型 两种模型,分别用于处理线性可分、线性不可分的训练样本集。
线性可分的例子
为了方便推导,接下来对样本做一些定义。
训练样本的定义
比如现在有 class1 和 class2 两种训练样本,分布在这样一个二维特征空间中:
那么,对于第 个训练样本,可以用 向量 和 标签 去定义它:
其中:
,
标签 可以理解为第 个样本所属的类别,SVM 用于处理二分类问题,那么我们可以使用 、 分别表示 class1 和 class2 两种训练样本。
从上面二维特征空间的例子,进一步推广到 维特征空间中的 个训练样本:
可以记作:
其中:
,
现在我们已经知道了训练样本的定义,那么接下来将对 SVM 线性、非线性两种模型分别进行讨论。
线性模型
如果训练样本 线性可分(Linear Separable),我们在特征空间中,可以定义这样一个线性方程来表示分离超平面:
其中, 是变量, 是 的系数,两者是维度相同的向量, 代表转置, 是某个实数:
我们通过调整 和 来移动分离超平面,使其正确分割开所有样本。
一个正确分类所有样本的 SVM 线性模型可以记作:
对于 ,
,使:
,有:
a) 若 ,则
b) 若 ,则
上面 a、b 是为了方便推导而人为做出的定义,针对不同的场景我们会逐步修改这些定义,希望读者朋友们在后续的推导中能够灵活变通,举一反三。
联立 a、b 可以进一步简化得到:
换句话说,满足公式1就代表着样本能够被正确分类。
一个可用的 SVM 模型,除了能够正确分类所有训练样本之外,还需要让间隔 最大化,如何用代数式表达最大化 是接下来要讨论的话题。
回顾高中知识,点 到直线 的距离为:
由此可以推导出,向量 到超平面 的距离:
这里我们需要再明确一个事实,无论我们如何对分离超平面的方程进行缩放,方程表示的都是同一个超平面,即:
那么,我们总是可以找到一个缩放倍数 ,使得分离超平面对于支持向量 ,有:
因为每个支持向量到超平面的距离都是相等的,任何一个支持向量 到分离超平面的距离将会是:
上一节我们已经知道,支持向量是到分离超平面最近的点,结合上面支持向量到超平面的距离 ,我们可以对任何一个向量 做进一步的定义:
那么此时 (公式1),则变为:
前面提到,支持向量机的任务是去找到一个最大的间隔 ,于是我们最终得到了一个优化问题,它的 目标函数(Objective Function)和限制条件如下(为了简化书写,、 重新定义为 、,同时为了求导方便,目标函数也做了改造):
这个最优化问题是一个二次规划问题,二次规划(Quadratic Programming)是凸优化问题中的一种,它要求满足以下条件:
a)目标函数为二次函数
b)限制条件为一次函数
一个二次规划问题,要么无解,要么只有一个极值(这里不展开证明,我们直接使用这个结论)。
最后,回顾一下整个推导过程:
非线性模型
现实场景中,训练样本在特征空间的分布通常是 非线性可分(Non-linear Separable)的。
一些线性不可分的情况
如果样本线性不可分,将导致上一小节的最优化问题无法求解,下面介绍如何对线性不可分问题进行求解。
引入松弛变量
在图(2)中,因为两种训练样本存在小部分交叠的区域导致样本线性不可分,属于可容忍的范围,这时应该放宽限制条件,给每个训练样本引入一个松弛变量(Slack Variable),使一些离群的样本也能被分类,限制条件改造为():
最小化:
这里的 被称为 正则项(Regulation Trem), 值越大,对目标函数的惩罚力度就越大,此时目标函数就需要相应地缩小 的值,直观的表现是被错误分类的点会变少或到决策边界的距离会变短。
加入松弛变量后,取得最优解时可能得到类似下图的 SVM 模型:
无法解决问题,于是与问题和解了
在引入了松弛变量后,图(2)的问题得到了较好的解决,但如果直接套用到图(1)这种情况中,得到模型将会非常糟糕,因为决策边界在图(1)中可能会变为这样:
非常糟糕,但至少让你的生日蛋糕得到了很好的切分
显然,我们需要另辟蹊径处理这种情况。
低维映射到高维
对于上面这种情况,一般我们的想法是去构造一条曲线来区分两种样本,而 Vapnik 则提出了另一个极具创造性的思路。他的想法是对样本向量进行升维,因为在越高维的空间中,我们越是有概率用分离超平面区分两种样本。好比我们在网购时,商家给出商品的参数越多,我们越是能够判断商品质量的优劣。
接下来的一个例子,将演示如何通过对线性不可分的样本进行升维,使得样本线性可分。
一个二维特征空间中线性不可分的例子
上面的二维特征空间中存在线性不可分的四个向量,这四个向量分别属于 、 两种标签:
为了使这些样本变得线性可分,需要人为地制定一个规则 ,比如使用非线性函数,将向量映射到高维空间:
四个向量经过升维将变为:
不要忘了我们的目标是要求出 和 ,回顾一下 SVM 最优化问题的限制条件(公式1):
在通过 对向量 进行升维后,限制条件公式变为:
(注意: 的维度也将得到提升,与 保持一致)
不考虑优化目标,仅满足限制条件的情况下,下面是众多答案的其中一个:
,
验证一下答案,将 和 代回限制条件公式,可以得到:
通过 的值可以看到,我们已经成功将样本分成了两类。
当然,这是燃尽脑细胞后得出的一个结果,而这还是在不考虑优化目标且只有5维的情况下,可想而知,在更高维的情况下,运算将会变得多么艰难。
前面我们提到 和 的维度始终保持一致,当 映射成一个无限维向量时, 也将变为一个无限维的向量,此时的方程变得难以求解。不仅是高维情况下的运算难题,如何找到一个合适的 使样本变得线性可分也不是一件容易的事。
为了解决这些问题,SVM 借助了 核函数(Kernel Function),通过一系列转换,核函数可以替换分离超平面方程中无限维的 和 ,使得方程可解。
核函数
感谢核函数,我们不再需要关心 的显式表达,也就是不需要知道 是如何对向量进行升维的,只通过核函数就可以计算两个升维后的向量 、 的内积,它们的关系如下:
核函数 有明确的代数式,高斯核、多项式核是两种常用的核函数:
高斯核:
多项式核:
多项式核中的阶数 是有限的,那么 也将是有限维度的向量;但是高斯核对应的 则是一个无限维的向量,相关证明本文不做展开。
事实上,要使 成立也是有条件的,等式成立的充要条件如下(Mercer 定理):
条件 中的 是标量,代数式可以写成矩阵的形式如下,设 ,则:
所有核函数构成了一个 Gram 矩阵,矩阵具有半正定性,关于什么是半正定性见文末推荐阅读。
现在,我们已经知道了核函数的作用,接下来将讨论如何使用原问题以及原问题的对偶问题等理论,让无限维的超平面方程变得可解。
原问题
先来看一下最优化问题的 原问题(Prime Problem)如何定义,设函数的定义域为 :
这个定义具有非常高的普适性,目标函数是求最小化 ,加入一个负号之后就变成了求最大化 ; 同理,加入负号就变成 ,我们可以使用 来表示任何不等式;同样的, 可以表示任何等式。
顾名思义,我们可以将任意最优化问题转化为上面原问题的格式。当然,限制条件也是可选的,可以有一个或多个等式、不等式约束,我们上面展示的是最优化问题其中一种混合约束的情况,在做转换的时候需根据实际做增减。
对偶问题
接下来介绍原问题的 对偶问题(Dual Problem)。
对偶问题可以粗糙地理解为原问题的“镜像”,例如原问题目标是求最小值,那么其对偶问题就是求最大值。在 SVM 优化问题中,原问题及其对偶问题具有相同的极值点,此时求出对偶问题的解,也即原问题的解。
通过原问题可以得到拉格朗日函数 ,关于拉格朗日函数的介绍见文章末尾的推荐阅读,这里不做展开,只需知道拉格朗日函数可用于求对偶问题的极值点,后面会对这个函数求偏导:
上面公式 (1) 可以用向量形式写成公式 (2) ,这两种书写方式都是可行的。
有了拉格朗日函数即可构造对偶问题的目标函数。注意这里 的取值范围不受原问题中 限制条件的约束,对偶问题定义如下:
解释一下这个目标函数。 表示集合的下确界,在 SVM 的优化问题中可以直接理解为取集合中的最小值。 的意思是函数 接收两个入参 和 ,这时 和 就是已知的,然后在 的取值范围 中找到最小的 ;而优化目标是找到能使 值最大的 、。从编程角度理解,可以想象成是一个嵌套循环,内层循环找最小值,外层循环找最大值。
可以发现,原问题的优化目标是求最小值,而它的对偶问题中则变为求最大值。原问题及其对偶问题的特点是,两者的优化目标是相反的,而在特定条件下他们将拥有相同的极值点(如果原问题为二次规划问题,则为最值点),这就引出下一节要介绍的强对偶定理。关于原问题及对偶问题更详细的内容见文末推荐阅读。
凸函数
SVM 的优化目标是一个 凸函数(Convex Function),这里简要介绍一下凸函数的定义:
凸函数在不同专业领域有不同的称呼,你可以称它为凸函数或凹函数。它的特点是只有一个极值点,在本文中暂且认为凸函数的最值为最小值;它的另一个特点是在函数上任取两个不同的点连一条线段,两点之间凸函数总是在线段的下方。写成代数形式如下,当然,下面的式子同样适用于多维向量:
强对偶定理以及 KKT 条件
前面定义的原问题和对偶问题之间存在这样一个关系(弱对偶定理):
可以证明一下上面的定理:
不等式 可以进一步推出:
与 的差称为原问题与对偶问题的 对偶间距(Duality Gap),记作:
强对偶定理(Strong Duality Theorem)描述的是在特定条件下(更多条件见此Wiki链接),使得 的情况,下面是 SVM 优化问题满足的 LCQ 条件:
强对偶定理成立的条件下,,则有:
因为 ,又因为 且 ,所以必须满足条件:
上面这个条件被称为 互补松弛条件(Complementary Slackness Condition)。
我们将当前取得最优解时满足的所有条件罗列如下,这被称为 KKT 条件(Karush–Kuhn–Tucker Conditions):
简而言之,在强对偶定理成立的条件下,原问题及其对偶问题的最优解满足 KKT 条件的约束。
KKT 条件也是 SVM 优化问题取得最优解的充要条件,如果优化问题具有强对偶性,满足 KKT 条件也就意味着取得最优解。
顺便来看一下如何从几何层面理解弱对偶定理。将 映射到二维空间,假设得到一个“凹”形区域如下图:
如上图所示,对偶问题中,不同 值的 函数在 的作用下,最终在 的底部边缘取得最小值。
对偶问题的优化目标是使函数 取得最大值,我们将上面三个不同 值的 放到下图对比展示,显然,当 时对偶问题取得最优解:
又因为原问题的解只会在可行域上(,即阴影部分),这就导致对偶问题的最优解始终小于原问题的最优解:
同理,如果 是一个圆形或者类似圆形的区域,那么强对偶定理将成立:
了解了以上原问题、对偶问题和 KKT 条件的基本概念后,接下来开始将 SVM 的原问题转换为对偶问题。
SVM 的原问题转换为对偶问题
前面我们已经知道了原问题及其对偶问题的定义,本节将介绍如何获得 SVM 最优化问题的原问题及其对偶问题。
我们在加入松弛变量之后得到这样一个 SVM 的最优化问题(使用 是为了更明显地看出核函数如何发挥作用):
经过证明,SVM 最优化问题的目标函数是一个凸函数,那么它肯定有一个最小值。虽然还没开始推导,但我们已经可以看出它具有强对偶性。
先回顾一下原问题的定义:
对比发现,原问题的限制条件和 SVM 最优化问题的限制条件有一定差距,但是原问题的定义具有很高的普适性,可以对 SVM 最优化问题做一些改造,让它和原问题保持一致。只需让松弛变量小于等于 即可改造得到 SVM 最优化问题的原问题:
改造完成的原问题存在两个不等式约束,根据拉格朗日函数的定义,我们设引入的两个拉格朗日乘子分别为 、(关于拉格朗日函数见文末推荐阅读),此时得到 SVM 的对偶问题如下:
下图更直观地展示了整个推导过程:
为了方便后面的推导,需要进一步化简目标函数。前面说到 是求最小值,那么最小值必然在偏导为零时取得:
将结果代回目标函数,得:
最终,使用核函数替换 ,并化简,得到 SVM 对偶问题的目标函数:
这相当于在满足限制条件的前提下,将 、、 都转换为 。
将偏导为零时得到的结果联立原本的限制条件,得到新的限制条件:
可以看出最优化问题具有强对偶性,此时对偶问题的解即为 SVM 最优化问题的解。
到此,无限维向量 和 的内积已经被我们成功转化为核函数 ,我们只需求出有限维度的 。
SVM 的 KKT 条件
前面介绍了 KKT 条件,在接下来的章节中仍然会用到。趁热打铁,接下来综合 SVM 原问题和对偶问题的所有条件,进一步推出 SVM 的 KKT 条件。
SVM 原问题中,存在一组不等式约束:
根据拉格朗日函数的定义,分别为限制条件引入拉格朗日乘子,且不等式约束的乘子 和 都必须大于等于零,得到 SVM 对偶问题的拉格朗日函数:
优化问题具有强对偶性时,如果取得最优解 、、、、,则有:
得到 KKT 的互补松弛条件:
综上所述,整理得到 KKT 条件如下:
当满足上面所有条件时,SVM 取得最优解。
训练
上一节我们得到了 SVM 的对偶问题:
可以看到上面的最优化问题中,除了向量 ,其他参数都是已知的,训练的目的是为了求出合适的 使得 SVM 能对样本正确地分类。接下来要介绍的 SMO 算法是一种常用的求解 的算法,其表现出的突出性能,值得笔者花费笔墨介绍它的原理。
SMO 算法
为了提高 SVM 的训练效率,John Platt 在 1998 年发表的论文《Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines》中提出了 SMO 算法。其基本思路是在 中选出两个分量作为变量,比如 、,而其余的分量 则作为固定的常数,这些常数都会被赋予初始值,接着通过求导等过程求出 、 后,又会重新选出两个分量重复此过程,期间 的值将不断收敛,直到满足 KKT 条件时退出循环。
改造最优化问题
为了方便理解,我们设 中选出两个分量 、 作为变量,其他分量看作常量,那么目标函数将变为(为了方便读者阅读时与 Platt 的论文进行对比,这里把优化目标转换为求最小值):
为了书写方便,令 ,这里也别忘了前面提到核函数的交换性,即 。
又因为 ,将目标函数继续拆分化简得:
红框内是常数项,在接下来的求导中就会被舍弃,为了简化公式,在当前阶段我们就可以忽略这两项。忽略常数项后,重新整理一下当前得到的最优化问题:
目标函数求导
由于核函数构成的矩阵具有半正定性,目标函数是一个具有最小值的凸函数,形似碗,示意图如下:
接下来结合限制条件,将目标函数转换为只有变量 的一元函数。
令限制条件 ,等号两边乘上 ,可得 :
如果我们最开始只选择一个分量作为变量,那么该变量会永远等于一个常数,算法也将无法收敛,这是 SMO 算法必须选择两个变量的原因。
将上面的等式代入目标函数 ,得到只有变量 的目标函数:
我们可以用符号来替代一些项,便于后面的求导:
接下来对目标函数进行求导,得:
求变量
当导数为 0 时,得到一个新的 ,我们记作 ,而旧的值记作 。
令 ,得:
重新展开 和 ,得到 和 之间的关系:
可以重新记作:
可以发现, 其实就是 的二阶导,目标函数 是一个凸函数,正常情况下它的二阶导 将会大于 。
裁剪 以及求解
回顾一下目前最优化问题的限制条件:
上一小节我们使用 将目标函数转换为只有自变量 的一元函数,之后求导得到了 ,但由于不等式约束的存在,需要对 进行“裁剪”。
为了始终满足 的约束,训练开始时一般是把 所有的分量都初始化为 ,之后每次迭代中对 、 的调整都是基于旧值,新旧值之间的关系如下:
将这两个限制条件绘制到坐标系中,可以更直观地看出 的上下限,分别用 和 表示。
当 时:
当 时:
根据得到的上下限 和 对 进行“裁剪”,得到 :
如上图所示,落在红色线段上的点 将满足限制条件的约束,我们可以通过 求得 :
与 的关系
推导进行到这里,你会发现函数 中还有一个未知的常数项 ,SMO 每轮迭代都需要计算出 ,因为这关系到算法中的一个优化点,但是求解 的前提是知道 的输出值,为了解决这一问题,本节将介绍 的取值范围与 之间的关系,为下一节求解 做准备。
上文中,对于所有 ,我们设 SVM 的输出值:
而在原问题转对偶问题的那一节中,通过求偏导得到了 ,这说明 影响着分离超平面多项式中的系数,它和常数项 一样,对 SVM 模型能否正确工作起着决定性作用。
这个输出值代表着 SVM 对训练样本 的归类结果,在改变 时, 也随之变化,这说明 的取值影响着 SVM 对样本 的分类。
进入正题,下面我们来分析 与 之间的关系。
首先是上文得到的 KKT 条件:
又因为之前在对拉格朗日函数求偏导时,由 解得:
结合以上所有条件,分别对 三种可能的取值情况进行分析:
下面是推导过程:
最终得到 和 之间的关系:
前面我们讨论过,支持向量是离分离超平面最近的点,且所有支持向量到分离超平面的距离都相等,对于任意支持向量 ,满足下面的关系式:
显然,当 时,样本向量 在 SVM 模型中将作为支持向量。而除此之外的向量可能落在间隔内,也可能落在间隔外;可能被分离超平面正确分类,也可能被错误地分类。下面是一个简单的 SVM 模型例子,通过这个图可以更直观地看到样本和决策边界之间的关系:
更新偏置
偏置 是 中的常数项,但是它并不会影响 的求解结果,因为这一项在 时就已经被消除了,它间接影响的是一个提高算法收敛效率的优化点,这在下一节中再做介绍,在此之前先来看一下如何计算 。
上一小节我们确定了 的取值和 之间的关系,这为求解 创造了条件。如果 ,说明 为支持向量,直接将 代入 即可求得 ;如果 、 的值都不在 区间内,则分别代入 求得 、,再取他们的平均值作为 。
下面是求解步骤。
将 等号两侧分别乘以 ,进而求得 :
为了减少计算量,我们还使用了前面得到的 参与运算。
同理,求出 :
前面说到,本次迭代中的 、 如果都不属于支持向量,偏置 取 、 的平均值:
Platt 在他1998年的论文中,2.3 小节末尾这样写道:
大概意思是说,如果 不等于 ,、 都在边界上(等于 或 )的时候,从 到 区间内的取值都是符合 KKT 条件约束的,这也是为什么取 、 的平均值做为结果的原因。这里需要注意 不等于 这一前提,回看裁剪 那一节,你会发现只要 大于 ,我们就能大概率保证 、 其中至少有一个在 区间内。
那么在 的前提下, 时,是否会出现 、 同时等于 或同时等于 的情况?在这种特殊情况下,如果取平均值做为 ,就会导致其中一个 违背 KKT 条件,我们又该如何处理?
还是回到裁剪 那一节中寻找答案,从 的图里可以看出这种情况是有可能发生的,发生条件比较苛刻,分别是:
可以看到此时 ,在新旧值相等或变化极小的情况下,重新计算一遍 是低效且无意义的。代码实现时,建议是在循环中直接跳过出现这种情况的迭代,那么也就不会出现 无法满足 KKT 条件约束的问题。
用启发式方法选择两个变量
如何选择合适的 、 以提高 SMO 算法的收敛速度是接下来要探讨的内容,前文铺垫许久的 也将在本节发挥它的作用,事实上,如果不打算实现这一优化,我们完全可以在训练结束后再通过支持向量计算得到 ,但是大部分应用场景的训练集都非常庞大,我们必须见缝插针地对算法进行优化。
我们可以这样理解 SMO 的工作原理,SMO 每次从向量 中选择两个分量进行优化, 可以想象成一条直线的斜率,我们通过修改 来转动这条直线,使直线不断逼近某个角度,直到正确地分隔开所有训练样本,即最终目的是要使所有样本都符合 KKT 条件的约束。
显然,在某一次迭代中,仅通过优化两个样本系数得到的分离超平面不一定能够正确地分类所有样本,那么,我们可以选择当前被错误分类(违背 KKT 条件)的样本系数作为下一轮迭代待优化的变量,以此提高算法的收敛速度,这也是 Platt 的论文 2.2 节中提到的启发式选择乘子的基本思想。
这时前面求出的 就派上用场了。在某一轮迭代结束时,明确了 和 ,意味着可以通过函数 计算出当前违背了 KKT 条件的训练样本。
先介绍如何选择 。注意这里 的含义不是指第一个样本系数,它代表的是第一个待求的变量, 同理。
启发式算法会循环处理所有违背 KKT 条件的点,直到所有样本都满足 KKT 条件为止。循环内有两种子循环用于选择并处理变量,第一种是选所有违背 KKT 条件的样本系数做为 进行遍历,第二种是选择违背了 KKT 条件且不在边界上的样本系数( 且 )做为 进行遍历,且外层循环每次迭代只会执行其中一种子循环。整体流程是先执行一次第一种子循环,接着会一直调用第二种,直到 的样本都被正确分类,然后又会从头开始,不断重复此过程。需要注意的是,子循环的每次有效迭代都会导致分离超平面方程的系数 发生改变,有些待处理的点可能因此变得符合 KKT 条件,所以子循环在执行时,还需要跳过那些已经符合条件约束的点。
在子循环的每次迭代中,选出 后,再从 的样本系数中选出 ,选择标准是使得 的值达到最大。从 的求值公式可以看出 一定程度上反映了每次迭代的步长,增大步长有助于算法更快收敛。
可以发现启发式算法在选择 时,优先选择不在边界上的样本,Platt 在他的论文中称之为 非边界样本(non-bound example)。非边界样本做为支持向量,只是占训练样本中的少数,Platt 认为优先处理非边界样本有助于减少迭代次数,秉承这一原则, 也是从非边界样本中选出,只不过 不要求必须违背 KKT 条件,只要能使 的值最大即可。
优化项,更新
在线性 SVM 中,可选用线性核 进行运算,其实相当于不使用核函数,那么在程序实现 函数的时候,我们应该使用 参与运算而不是使用 :
直接参与运算会浪费大量算力,正确的做法是使用 计算 ,并对 做好缓存:
关于 SMO 算法收敛性的讨论
SMO 算法每次选择两个乘子进行优化的思想来自于 Osuna 等人所著的论文《An Improved Training Algorithm for Support Vector Machines》。
论文中, 中的变量被拆分为两个集合 和 , 被称为 工作集(Working Set),工作集中是待求的变量,SMO 中选出的两个乘子就是工作集; 则代表固定的变量集合。
Osuna 他们先是证明了,将 中的变量移动到 后,目标函数的输出仍然保持不变(见 3.2 节 Proposition 3.1)。也就是说, 中变量的值取得最优解后,将其中一些变量移动到 ,此时 中剩下的变量值仍然是当前目标函数的最优解。
但如果把 中的变量移动到 ,即目标函数待求的变量变多了,那么此时 中变量的值还是不是最优解就不得而知了。幸运的是,我们已经知道了 KKT 条件是目标函数取得最优解的充要条件,那么在每次迭代只取 中违背 KKT 条件的变量移动到 ,就能保证移动后 中的值不会是目标函数的解,也就不会导致优化过程做了无用功,这也是 SMO 算法在选择变量时,要求其中至少有一个变量违背 KKT 条件的原因。
总结一下上面的内容。 取得最优解后,将其中一些变量移入 , 中剩下的变量仍然是目标函数的解;但是从 中取出违背 KKT 条件的变量移动到 ,则会导致目标函数重新拥有待优化的空间。这说明 SMO 的每一次迭代都会让 往最优解靠近,又因为 SVM 是一个凸优化问题,算法将会在有限次迭代后收敛到全局最优解。
如果想了解更详细的推导过程,请移步这篇分析文章,或者直接阅读论文《Convergence of a Generalized SMO Algorithm for SVM Classifier Design》。
测试
在训练开始前需要保留一部分训练样本,这些样本不能参与训练,而是用于训练结束后检验模型的可用性。这一步非常重要,通过分析测试中无法正确分类的样本,将帮助我们更好地完善算法,例如用来判断模型是否过拟合或欠拟合、 的值是否需要调整、核函数如何选型等等。
在介绍 SMO 的那一节中就已经提到了 的计算方法,根据 SVM 的 KKT 条件,选一个支持向量 即可通过下面公式计算得到:
我们已经求出了 ,那么也就可以求出 :
然后将测试样本向量输入下面的函数就能获得 SVM 模型的输出:
将输出结果和样本标签进行对比,即可判断样本是否被正确分类。如果使用的是线性核,可以学习 SMO 算法将 缓存起来减少计算量。
其实关于测试还有很多学问,但是受限于篇幅以及本文重点是 SVM 算法,后续有机会在新文章中再做详细介绍。
参考资料
浙江大学胡浩基机器学习公开课程
Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines
An Improved Training Algorithm for Support Vector Machines
推荐阅读
正定(positive definite)与半正定(semi-positive definite)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~