今日拜读了Platt的关于SMO的论文:Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines。直译过来就是:序列最小优化:一种训练支持向量机的快速方法。然后根据论文及查询的相关资料整理了这篇内容。

文章目录

  • 一、论文内容概述
    • 论文摘要
    • 1 简介部分
      • 1.2 以前的支持向量方法
    • 2 序列最小优化
      • 2.1求解两个拉格朗日乘数
      • 2.2选择优化哪个乘数的启发式方法
      • 2.3阈值计算
      • 2.4线性支持向量机的优化
      • 2.5 代码细节
      • 2.6与以往算法的关系
    • 3基准SMO
      • 3.1 收入预测
    • 4 论文结论
  • 二、SMO算法数学原理及过程推导
    • 1 SVM问题回顾:
    • 2 SMO算法
      • 2.1两个朗格朗日乘子的解析解
      • 2.2 选择哪两个乘子需要被优化的启发方法
      • 2.3 更明确的优化方法说明
        • 2.3.1 第一个变量的选择
        • 2.3.2 第二个变量的选择
      • 2.4 计算阈值b和差值
      • 2.5 论文中计算阈值的推导
    • 3 线性SVM的一个优化
  • 三、SVM算法总结
  • 四、SMO解决对偶问题的二次规划

一、论文内容概述

论文摘要

本文提出了一种新的训练支持向量机的算法:序列最小优化算法。训练一个支持向量机需要解决一个非常大的二次规划(quadratic programming ,QP)优化问题。SMO将这个大的QP问题分解为一系列可能的最小的QP问题。这些小QP问题被解析地解决了,避免了使用一个耗时的数值QP优化作为一个内环。SMO所需的内存量在训练集大小上是线性的,这允许SMO处理非常大的训练集。由于避免了矩阵计算,对于各种测试问题,SMO的训练集规模介于线性和二次之间,而标准的chunking SVM算法的训练集规模介于线性和三次之间。SMO的计算时间主要由支持向量机的评估决定,因此SMO对于线性支持向量机和稀疏数据集是最快的。在真实世界的稀疏数据集上,SMO可以比分块算法快1000倍以上。

1 简介部分

在过去的几年中,人们对支持向量机(SVMs)产生了浓厚的兴趣。已有经验表明,支持向量机在各种各样的问题上,如手写体字符识别[12]、人脸检测[15]、行人检测[14]和文本分类[9],都具有良好的泛化性能。
然而,支持向量机的使用仍然局限于一小部分研究者。一个可能的原因是支持向量机的训练算法很慢,特别是对于大问题。另一种解释是,SVM训练算法复杂、微妙,对于一般工程师来说难以实现。
本文提出了一种新的支持向量机学习算法,该算法概念简单,易于实现,速度一般较快,对于困难的支持向量机问题比标准的支持向量机训练算法有更好的尺度特性。这种新的支持向量机学习算法称为序列最小优化算法(Sequential minimum Optimization, SMO)。与之前使用数值二次规划(QP)作为内环的SVM学习算法不同,SMO使用解析的QP步骤。
本文首先对支持向量机进行了概述,并对目前支持向量机的训练算法进行了回顾。SMO算法的详细介绍,包括解决分析QP一步,启发式选择哪些变量优化内部循环,如何设置的描述SVM的门槛,一些特殊情况,优化算法的伪代码,SMO其他算法之间的关系。
SMO已经在两个真实数据集和两个人工数据集上进行了测试。本文介绍了对这些数据集进行SMO计时和标准“分块”算法的结果,并给出了基于这些计时的结论。最后,有一个附录,描述了解析优化的推导。

###1.1 支持向量机概述

图1 一个线性支持向量机
Vladimir Vapnik在1979年发明了支持向量机[19]。在其最简单的线性形式,支持向量机是一种分离超平面的正面例子的负面例子最大的保证金(参见图1)。在线性情况下,定义的是超平面的距离最近的正面和负面的例子。线性支持向量机的输出公式为:

其中w是超平面的法向量x是输入向量。分离的超平面是平面u=0。最近的点在平面u = 1上。边际m是这样的:

边际最大化可通过以下优化问题[4]表示:

式中,xi为第i个训练例,yi为第i个训练例SVM的正确输出。对于类中的正例,yi的值为+1,对于负例,yi的值为-1。
利用拉格朗日定理,这个优化问题可以转化为对偶形式,即目标函数Y完全依赖于一组拉格朗日乘数ai,:
(其中N为训练例数),受不等式约束,

一个线性等式约束,

每个拉格朗日乘子与每个训练示例之间存在一一对应关系。一旦确定了拉格朗日乘数,则可由拉格朗日乘数导出法向量r w和阈值b

由于使用前可以从训练数据中通过式(7)计算出r w,因此评估一个线性SVM所需的计算量与非零支持向量的数量是不变的。
当然,不是所有的数据集都是线性可分的。可能没有超平面可以将正面的例子和负面的例子分开。在上面的公式中,不可分离的情况将对应一个无穷解。然而,在1995年,科尔特斯和他的同事们开始了他们的工作。Vapnik[7]建议对原始优化声明(3)进行修改,该修改允许,但惩罚,未能达到正确的边界示例。修改是:

其中,xi是允许裕度失效的松弛变量,C是一个参数,它用少量的裕度失效来交换较大的裕度。将新的优化问题转化为对偶形式时,只需将约束(5)转化为框约束即可:

变量xi根本没有出现在对偶公式中。

支持向量机可以进一步推广为非线性分类器[2]。非线性支持向量机的输出由拉格朗日乘数显式计算:

其中K是一个核函数,它度量输入向量rx与存储的训练向量rx j之间的相似性或距离。K的例子包括高斯、多项式和神经网络非线性[4]。如果K为线性,则恢复线性SVM(1)方程。
拉格朗日乘数ai仍然是通过二次程序计算的。非线性改变了二次型,但对偶目标函数Y在a中仍然是二次型

上式(11)中的QP问题就是SMO算法要解决的QP问题。为了使上述QP问题是正定的,核函数K必须服从Mercer s条件[4]。
Mercer 定理:任何半正定的函数都可以作为核函数。
Karush-Kuhn-Tucker (KKT)条件是一个正定QP问题的最优点的充要条件。QP问题(11)的KKT条件特别简单。当,对于所有的i, QP问题被解决:

其中ui为第i个训练示例的SVM输出。请注意,KKT条件可以一次在一个示例上求值,这在SMO算法的构造中非常有用。

1.2 以前的支持向量方法

由于支持向量机的庞大规模,其产生的QP问题(11)不能通过标准QP技术轻易解决。(11)中的二次形式包含一个矩阵,它的元素个数等于训练样本个数的平方。如果有超过4000个训练示例,这个矩阵就不能放入128mb。
Vapnik[19]描述了一种求解SVM QP的方法,该方法被称为分块。分块算法利用了这样一个事实,即如果移除对应于零拉格朗日乘数的矩阵的行和列,那么二次形式的值是相同的。因此,大的QP问题可以分解为一系列小的QP问题,其最终目标是识别出所有非零的拉格朗日乘子**,抛弃所有零的拉格朗日乘子。**每一步,将解决一个QP问题,包括下面的例子:每一个非零的拉格朗日乘子的最后一步,和M坏的例子,这违反了马条件(12)[4],对于一些M(参见图2)的价值。如果有少于M例子违反马条件在一个步骤中,所有的违反实例被添加。每个QP子问题都用前一个子问题的结果初始化。在最后一步,整个非零拉格朗日乘子集合已经被识别,因此最后一步解决了大QP问题。

分块极大地减小了矩阵的大小,从训练例数的平方近似为非零拉格朗日乘数的平方。然而,**分块仍然不能处理大规模的训练问题,**因为即使这个简化后的矩阵也无法装入记忆。

图2。有三种训练支持向量机的方法:分块法、Osunas算法和SMO。对于每种方法,说明了三个步骤。每一步的水平细线表示训练集,厚框表示该步骤优化的拉格朗日乘数。分块时,每步增加固定数目的样本,而每步丢弃零拉格朗日乘数。因此,每步训练的示例数趋于增长。对于Osuna s算法,每一步优化的示例数是固定的:每一步在问题中添加和丢弃的示例数都是相同的。对于SMO,每一步只有两个示例进行了分析优化,因此每一步都非常快。
1997年,Osuna等人[16]证明了一个定理,提出了一套全新的支持向量机QP算法。该定理证明了大的QP问题可以分解为一系列小的QP子问题。只要在前面子问题的示例中增加至少一个违反KKT条件的示例,每一步都将减少总体目标函数,并保持一个符合所有约束条件的可行点。因此,如果一个QP子问题序列中总是添加至少一个违规者,则保证其收敛性。注意,分块算法遵从定理的条件,因此将收敛。

Osuna等人建议对每个QP子问题保持一个大小恒定的矩阵,这意味着在每一步[16]中添加和删除相同数量的示例(参见图2)。使用一个大小恒定的矩阵将允许对任意大小的数据集进行训练。在Osuna论文[16]中给出的算法中,每一步加一个例,减一个例。很明显,这是低效的,因为它将使用一个完整的数值QP优化步骤来使一个训练示例服从KKT条件。在实践中,研究人员根据未公布的启发式[17]对多个例子进行加减运算。在任何情况下,所有这些方法都需要一个数值QP求解器。数字QP是出了名的难以把握;有许多数值精度问题需要解决。

2 序列最小优化

序列最小优化(SMO)是一个简单的算法,可以快速解决SVM QP问题,不需要任何额外的矩阵存储,也根本不使用数值QP优化步骤。SMO将整个QP问题分解为QP子问题,利用Osuna‘s定理保证收敛性。Osuna’s theorem简单的意思就是每次将QP问题分解成QP子问题迭代执行,当每次迭代求解的QP子问题中至少包含一个不满足KKT条件的example的时候,这个算法最终会收敛。

与前面的方法不同,SMO选择在每一步中解决尽可能小的优化问题。对于标准SVM QP问题,最小的优化问题涉及两个拉格朗日乘数,因为拉格朗日乘数必须服从线性等式约束。在每一步,SMO选择两个拉格朗日乘数共同优化,找到这些乘数的最优值,并更新SVM以反映新的最优值(见图2)。

SMO的优点在于可以解析地求解两个拉格朗日乘数。因此,完全避免了数值QP优化。算法的内部循环可以用少量的C代码表示,而不是调用整个QP库例程。虽然在算法过程中求解了更多的优化子问题,但每个子问题的求解速度都非常快,因此整个QP问题的求解速度也很快。

此外,SMO根本不需要额外的矩阵存储。因此,一个普通的个人计算机或工作站的内存可以容纳非常大的SVM训练问题。由于SMO中没有使用矩阵算法,因此它不太容易受到数值精度问题的影响。

SMO有两个组成部分:**求解两个拉格朗日乘数的解析方法,以及选择优化哪个乘数的启发式方法**。

图1所示。两个拉格朗日乘数必须满足全问题的所有约束条件。不等式约束使拉格朗日乘数处于方框中。线性等式约束使它们位于一条对角线上。因此,SMO的一个步骤是必须在对角线段上找到目标函数的最优解。

2.1求解两个拉格朗日乘数

为了求解两个拉格朗日乘数,SMO首先计算这两个乘数的约束条件,然后求解约束条件下的最小值。为了方便起见,所有引用第一个乘数的量将具有下标1,而所有引用第二个乘数的量将具有下标2。由于只有两个乘数,约束可以很容易地在二维上显示(见图3)。约束条件(9)使拉格朗日乘数位于一个框内,而线性等式约束条件(6)使拉格朗日乘数位于一条对角线上。因此,目标函数的约束最小必须躺在一个对角线线段(如图3)。这个约束解释了为什么两个的最低数量是可以优化的拉格朗日乘数法:如果SMO只优化一个乘法器,它不能满足线性等式约束的每一步。

对角线段的端点可以很简单地表示。在不失一般性的前提下,算法首先计算第二个拉格朗日乘子a2,然后用a2计算对角线线段的端点。如果目标y1不等于目标y2,那么下面的界限适用于a2:

如果目标y1等于目标y2,那么下面的边界适用于a2:

目标函数沿对角线的二阶导数可表示为:

一般情况下,目标函数为正,在线性等式约束方向上存在最小值,且h大于零。在本例中,SMO计算约束方向上的最小值

其中
是第i个训练例子的误差。下一步,通过将无约束的最小值剪切到线段的末端来找到有约束的最小值:

现在,让s = y1y2。a1的值是从新的、被裁剪的a2中计算出来的


在不寻常的情况下,h不会是正的。如果核函数K不服从Mercer s条件,则会出现负h,从而导致目标函数变得不确定。如果有多个训练示例具有相同的输入向量x,那么即使在正确的核函数中也可以出现零h。在任何情况下,即使h不为正,SMO也可以工作,在这种情况下,目标函数Y应该在线段的每个端点取值:


SMO将拉格朗日乘数移动到目标函数的最小值的端点。如果目标函数在两端是相同的(舍入误差在一个小e内),并且内核服从Mercer s条件,则联合极小化就无法进行。下面将描述该场景。(Mercer定理:任何半正定对称函数都可以作为核函数。)

2.2选择优化哪个乘数的启发式方法

只要SMO在每一步总是优化和改变两个拉格朗日乘数,并且在这一步之前至少有一个拉格朗日乘数违反了KKT条件,那么每一步都将根据Osuna s定理[16]降低目标函数。这样就保证了收敛性。为了加快收敛速度,SMO使用启发式方法选择两个拉格朗日乘数共同优化。

有两种单独的选择启发式:一种用于第一种拉格朗日乘数,另一种用于第二种。第一种启发式的选择提供了SMO算法的外部循环外部循环首先遍历整个训练集,确定每个示例是否违反KKT条件(12)。如果一个例子违反了KKT条件,那么它就有资格进行优化。在一次遍历整个训练集之后,外部循环将迭代所有拉格朗日乘数不是0也不是C的例子(无边界的例子)。同样,每个示例将根据KKT条件进行检查,违反的示例将符合优化条件加粗样式。外部循环重复传递无界示例,直到所有无界示例都服从e中的KKT条件。然后,外循环返回并遍历整个训练集。外循环在对整个训练集进行单次遍历和对无界子集进行多次遍历之间交替进行,直到整个训练集满足e内的KKT条件,至此算法终止

第一选择启发式将CPU时间集中在最有可能违反KKT条件的示例上:无界子集。随着SMO算法的进展,在边界上的示例可能会保持在边界上,而不在边界上的示例会随着其他示例的优化而移动。因此,SMO算法将遍历非有界子集,直到该子集是自一致的,然后SMO将扫描整个数据集,搜索由于优化非有界子集而违反KKT的任何有界示例。

注意,对KKT条件进行检查,使其在满足的范围内。通常,e被设为10-3。识别系统通常不需要将KKT条件满足到高精度:对于正边际上的示例,输出介于0.999和1.001之间是可以接受的。如果需要产生非常高的精度输出,SMO算法(和其他支持向量机算法)的收敛速度就不会那么快。

一旦选择了第一个拉格朗日乘子,SMO就选择第二个拉格朗日乘子,使联合优化过程中所采取的步骤规模最大。现在,计算核函数K是很耗时的,所以SMO用公式(16)中分子的绝对值来近似步长:|E E | 12。SMO为训练集中的每个未绑定示例保留一个缓存的错误值E,然后选择一个错误来近似地最大化步长。如果E1为正数,SMO选择一个误差最小的示例E2。如果E1为负数,SMO选择一个误差最大的例子E2。

在不寻常的情况下,SMO不能使用上述第二选择启发式取得积极进展。例如,如果第一个和第二个训练示例的输入向量x相同,就不能取得积极的进展,这使得目标函数变成半定的。在这种情况下,SMO使用二次选择启发式的层次结构,直到它找到一对可以取得正进展的拉格朗日乘数通过对两个拉格朗日乘子的联合优化,使步长非零,可以确定正进程。第二选择启发式的层次结构包括以下内容。如果上述启发式没有取得积极进展,则SMO开始遍历未绑定的示例,搜索第二个可以取得积极进展的示例。如果没有一个非绑定示例取得积极进展,则SMO开始遍历整个训练集,直到找到一个取得积极进展的示例。通过non-bound迭代的例子和迭代整个训练集随机启动位置,为了不让SMO偏向于在训练集的开头例子。在极简并的情况下,没有一个例子会使一个适当的第二个例子。当这种情况发生时,第一个示例将被跳过,而SMO将继续处理另一个选择的第一个示例。

2.3阈值计算

在每一步之后重新计算阈值b,以便对两个优化示例都满足KKT条件。当新的a1不在边界处时,下面的阈值b1是有效的,因为当输入为x1时,它迫使SVM的输出为y1:

当新的a2没有上界时,下面的阈值b2是有效的,因为当输入为x2时,它迫使SVM的输出为y2:

当b1和b2都有效时,它们是相等的。当两个新的拉格朗日乘子都有界且L不等于H时,则b1和b2之间的区间均为符合KKT条件的阈值。SMO选择的阈值介于b1和b2之间。

2.4线性支持向量机的优化

为了计算一个线性SVM,只需要存储一个权值向量r w,而不需要存储所有非零拉格朗日乘数对应的训练示例。如果联合优化成功,则需要更新存储的权值向量以反映新的拉格朗日乘子值。由于支持向量机的线性特性,使得权值向量的更新比较容易:

2.5 代码细节

下面的伪代码描述了整个SMO算法:

target = desired output vector
point = training point matrix
procedure takeStep(i1,i2)if (i1 == i2) return 0alph1 = Lagrange multiplier for i1y1 = target[i1]E1 = SVM output on point[i1] – y1 (check in error cache)s = y1*y2Compute L, H via equations (13) and (14)if (L == H)return 0k11 = kernel(point[i1],point[i1])k12 = kernel(point[i1],point[i2])k22 = kernel(point[i2],point[i2])eta = k11+k22-2*k12if (eta > 0){a2 = alph2 + y2*(E1-E2)/etaif (a2 < L) a2 = Lelse if (a2 > H) a2 = H}else{Lobj = objective function at a2=LHobj = objective function at a2=Hif (Lobj < Hobj-eps)a2 = Lelse if (Lobj > Hobj+eps)a2 = Helsea2 = alph2}if (|a2-alph2| < eps*(a2+alph2+eps))return 0a1 = alph1+s*(alph2-a2)Update threshold to reflect change in Lagrange multipliersUpdate weight vector to reflect change in a1 & a2, if SVM is linearUpdate error cache using new Lagrange multipliersStore a1 in the alpha arrayStore a2 in the alpha arrayreturn 1
endprocedureprocedure examineExample(i2)y2 = target[i2]alph2 = Lagrange multiplier for i2E2 = SVM output on point[i2] – y2 (check in error cache)r2 = E2*y2if ((r2 < -tol && alph2 < C) || (r2 > tol && alph2 > 0)){if (number of non-zero & non-C alpha > 1){i1 = result of second choice heuristic (section 2.2)if takeStep(i1,i2)return 1}loop over all non-zero and non-C alpha, starting at a random point{i1 = identity of current alphaif takeStep(i1,i2)return 1}loop over all possible i1, starting at a random point{i1 = loop variableif (takeStep(i1,i2)return 1}}return 0
endproceduremain routine:numChanged = 0;examineAll = 1;while (numChanged > 0 | examineAll){numChanged = 0;if (examineAll)loop I over all training examplesnumChanged += examineExample(I)elseloop I over examples where alpha is not 0 & not CnumChanged += examineExample(I)if (examineAll == 1)examineAll = 0else if (numChanged == 0)examineAll = 1
}

2.6与以往算法的关系

SMO算法结合了支持向量机算法和优化算法。SMO算法可以被认为是Osuna算法的一种特殊情况,其中优化的规模为2,每个步骤都用新的乘子替换通过良好的启发式选择的新的乘子。

SMO算法与Bregman方法[3]或行操作方法[5]一类优化算法密切相关。这些方法用于求解带有线性约束的凸规划问题。它们是迭代方法,其中每一步都将当前的原始点投影到每个约束上。未修改的Bregman方法不能直接解决QP问题(11),因为支持向量机中的阈值在对偶问题中产生了线性等式约束。如果每步只投影一个约束,就违反了线性等式约束。用更专业的术语来说,在所有可能的权向量rw的组合空间上最小化权向量rw的范数的原始问题产生了一个Bregman d -投影,它没有唯一的最小[3][6]。

有趣的是,在支持向量机中,阈值b被固定在0,而不是被求解。固定阈值支持向量机不会有线性等式约束(6)。因此,每次只需要更新一个拉格朗日乘子,可以使用行操作方法。遗憾的是,由于式(8)中的松弛变量xi,传统的Bregman方法仍然不适用于这类支持向量机。松弛变量的存在使得Bregman Dprojection在权向量r w和松弛变量xi的组合空间中变得不唯一.

幸运的是,SMO可以被修改来解决固定阈值支持向量机。SMO将更新单个拉格朗日乘数,使其在相应维度上达到Y的最小值。更新规则为:

这个更新方程强制SVM的输出为y1(类似于Bregman方法或Hildreth的QP方法[10])。在计算新的a之后,它被剪切到[0,C]区间(与以前的方法不同)。拉格朗日乘子优化的选择与2.2节中描述的第一选择启发式相同。

线性SVM的固定阈值SMO在概念上类似于感知器松弛规则[8],其中感知器的输出在出现误差时进行调整,从而使输出精确地位于边缘。然而,固定阈值SMO算法有时会减少训练输入在权值向量中的比例,以使边际最大化。松弛规则不断增加权值向量中的训练输入量,因此,它不是最大边际。高斯核的固定阈值SMO也与资源分配网络(RAN)算法[18]有关。当run检测到某些类型的错误时,它将分配一个内核来准确地修复错误。SMO将执行类似的操作。然而,SMO/SVM会调整核的高度以最大化特征空间中的边际,而RAN会简单地使用LMS来调整核的高度和权重。

3基准SMO

在一系列基准测试中,将SMO算法与标准分块SVM学习算法进行了对比。两种算法都是用c++编写的,使用的是Microsoft s Visual c++ 5.0编译器。两种算法都运行在运行Windows NT 4的已卸载的266 MHz奔腾II处理器上。

两种算法都是为了利用输入向量的稀疏性而编写的。更具体地说,内核函数在内部循环中依赖于点积。如果输入是一个稀疏向量,那么一个输入可以存储为一个稀疏数组,点积将仅仅对非零输入进行迭代,将非零输入与相应权重相乘累积起来。如果输入是一个稀疏的二进制向量,那么可以存储输入中的“1”的位置,并且点积将与输入中的“1”位置对应的权值相加。

分块算法使用投影共轭梯度算法[11]作为它的QP求解器,如Burges[4]所建议的。为了确保分块算法是一个公平的基准测试,Burges比较了他的分块代码在运行Solaris的200 MHz Pentium II上的速度和基准分块代码的速度(关闭稀疏点积代码)。速度是可比较的,这表明基准分块代码是合理的基准。

为了确保分块代码和SMO代码达到相同的精度,需要进行一些处理。如果输出与正确值或半空间之间的距离超过10-3,则SMO代码和分块代码都将标识违反KKT条件的示例。选择10-3的阈值作为分类任务中不显著的错误。投影共轭梯度代码有一个停止阈值,它描述了目标函数在每一步[4]的最小相对改进。如果投影共轭梯度采取了相对改进小于最小值的步骤,则共轭梯度代码终止并采取另一个分块步骤。Burges[4]建议对这个最小值使用常数10-10
在下面的实验中,以10-10的精度停止投影共轭梯度往往会使KKT违反大于10-3,特别是对于非常大规模的问题。因此,基准分块算法使用以下启发式来设置共轭梯度停止阈值。阈值从3x10-10开始。每个分块步骤后,对于所有拉格朗日乘数没有上界的例子,都要计算输出。计算这些输出是为了计算阈值(请参阅[4])。每个例子都提出了一个阈值。如果提议的最大阈值比提议的最小阈值大2x10-3,那么KKT条件不可能在10-3内被满足。因此,从下一个块开始,共轭梯度阈值降低了3倍。这种启发式将优化共轭梯度的速度:它将只对最困难的问题使用高精度。对于下面描述的大多数测试,阈值保持在3x10-10。使用的最小阈值为3.7x10-12,这发生在最大的web页面分类问题的分块结束时。
在一个收入预测任务、一个网页分类任务和两个不同的人工数据集上测试了SMO算法。所有表中列出的所有时间都以CPU秒为单位。

3.1 收入预测

用于测试SMO速度的第一个数据集是UCI“成人”数据集,可以在ftp://ftp.ics.uci.edu/pub/machinlearningdatabases/adult上获得。支持向量机被赋予了一个家庭的人口普查表的14个属性。支持向量机的任务是预测该家庭的收入是否大于$50,000。在14个属性中,8个是分类属性,6个是连续属性。为了便于实验,将这6个连续属性离散为五分位,共得到123个二进制属性,其中14个为真。在“成人”训练集中有32562个例子。针对这个问题训练了两种不同的支持向量机:一种是线性支持向量机,另一种是使用方差为10的高斯核的径向基函数支持向量机。选择此方差来最小化验证集的错误率,线性SVM的C的极限值为0.05,RBF/SVM的极限值为1。同样,选择这个极限值是为了最小化验证集上的错误。

实验这一块的内容目前不进行过多介绍,有兴趣可以查看原论文进行了解




4 论文结论

SMO是一种改进的支持向量机训练算法。与其他SVM训练算法一样,SMO将一个大的QP问题分解为一系列小的QP问题。与其他算法不同的是,SMO利用了尽可能小的QP问题,可以快速、分析地解决这些问题,通常可以显著提高其伸缩性和计算时间。

SMO在实际问题和人为问题上都进行了测试。从这些测试中,可以推导出以下结论:

  • 当用户不能方便地访问二次编程包和/或不希望调优QP包时,可以使用SMO。
  • SMO在支持向量机上做得很好,因为许多拉格朗日乘数都是有限的。
  • SMO在线性支持向量机中表现很好,因为SMO的计算时间主要由SVM的评估决定,而且对一个线性支持向量机的评估可以表示为单个点积,而不是线性核的和。
  • SMO在具有稀疏输入的支持向量机(甚至是非线性支持向量机)中表现良好,因为可以减少内核计算时间,直接加快SMO的速度。由于分块在QP代码中花费了大部分时间,因此它既不能利用SVM的线性特性,也不能利用输入数据的稀疏性。
  • SMO在处理大型问题时表现良好,因为它根据训练集的大小进行伸缩比对迄今为止尝试过的所有测试问题进行分块要好。

对于不同的测试集,SMO的训练时间在N到N之间的经验尺度为2.2。组块训练时间在~ n1.2 ~ n3.4之间。SMO的扩展可能比分块要好一个数量级。对于真实的测试集,SMO对于线性支持向量机可以快1200倍,对于非线性支持向量机可以快15倍。

由于SMO易于使用,并且能更好地适应训练集的大小,因此它很有可能成为标准的SVM训练算法。在得出最终结论之前,还需要针对其他QP技术进行更多的基准试验和最佳的Osuna启发法。

二、SMO算法数学原理及过程推导

1 SVM问题回顾:

在SVM过程中,将不可完全分离的case中最终推导得出了对偶优化问题(5.33),将其最大化目标函数转换为最小化目标函数的形式,并引入核函数,如下式所示:


SMO算法致力于求解式子(11)描述的QP问题,为了使这个QP问题是正定的,核函数K必须要满足Mercer条件。
上述QP问题的KKT条件为,当对所有的i都满足:

其中ui是SVM在第i个训练样本上的输出。
式子(12)的物理意义:
当αi = 0时,向量xi被理想正确分类,落在两个边界超平面之外,此时必定满足yiui >= 1
当0 < αi < C时,向量xi恰好落在两个边界超平面上,此时必定满足yiui = 1
当αi = C时,向量xi落在两个边界超平面之间,此时必定满足yiui <= 1

2 SMO算法

SMO算法将整个QP问题分解成QP子问题,使用Osuna’s theorem确保收敛。Osuna’s theorem简单的意思就是每次将QP问题分解成QP子问题迭代执行,当每次迭代求解的QP子问题中至少包含一个不满足KKT条件的example的时候,这个算法最终会收敛。

SMO算法在每一步迭代中都选择可能存在的最小规模的QP子问题,对标准SVM的QP来讲,由于拉格朗日乘子必须要满足式子(11)中的线性等式约束:

因此,可能存在的最小规模的QP子问题要包括两个拉格朗日乘子。
SMO算法在每一步迭代中都选择两个拉格朗日乘子来进行联合优化,以找到这些乘子的最优值,并且更新SVM以反映出新的优化值。

SMO的优势基于这样的事实,对两个拉格朗日乘子的解是存在解析解的,低效率的数值QP优化问题可以被完全避免。尽管在SMO算法过程中要求解更多的优化子问题,但每个子问题都很快,因此整个QP问题得以快速求解。

SMO算法包含两部分的内容:解两个拉格朗日乘子的解析方法,选择两个乘子的启发式方法

2.1两个朗格朗日乘子的解析解

为了解这两个拉格朗日乘子,SMO首先计算在这些乘子上的约束,然后解约束最小。因为只有两个拉格朗日乘子,等式约束很容易在二维上展示出来,如下图所示:

式子(11)中边界约束0 <= α <= C决定了拉格朗日乘子必须在一个box中取值,线性等式约束又决定了其必须落在一条对角线上,因此,目标函数的约束最小值必须位于对角线段上。这个约束同时也解释了为什么原QP问题的可能的最小子问题至少包含两个拉格朗日乘子:如果SMO只优化了一个乘子,则它不能在每一步都满足线性等式约束。

对角线段的端点可以非常容易的表示,不失一般性,算法首先计算第二个拉格朗日乘子α2,并以α2计算对角线段的端点。计算出来的α2不一定满足边界约束,需要对其进行裁剪,这需要确定α2的上下界,有两种情况需要考虑:

情况1:y1 != y2的情况下,有α1 - α2 = k,where k is a constant

α2的上下界为:
L = max(0,-k) = max(0,α2 - α1)
H = min(C,C-k) = min(C,C + α2 - α1)

情况2:y1 = y2的情况下,有α1 + α2 = k,where k is a constant

α2的上下界为:
L = max(0,k - C) = max(0,α1 + α2 - C)
H = min(C,k) = min(C, α1 + α2)

接下来,我们推导用于更新α的解析迭代式。
我们首先计算α2的迭代式,每次更新只考虑两个乘子α1和α2,由于

SMO(序列最小优化)算法论文及原理详述相关推荐

  1. 统计学习方法第七章作业:SVM非线性支持向量机之SMO序列最小优化算法代码实现

    SMO序列最小优化算法 import numpy as np import math from sklearn.metrics import accuracy_score from sklearn.m ...

  2. SMO(序列最小优化算法)解析

    什么是SVM SVM是Support Vector Machine(支持向量机)的英文缩写,是上世纪九十年代兴起的一种机器学习算法,在目前神经网络大行其道的情况下依然保持着生命力.有人说现在是神经网络 ...

  3. 支持向量机SVM序列最小优化算法SMO

    支持向量机(Support Vector Machine)由V.N. Vapnik,A.Y. Chervonenkis,C. Cortes 等在1964年提出.序列最小优化算法(Sequential ...

  4. 一文看懂 序列最小最优化算法---SMO

    一.SMO的背景介绍 序列最小最优化算法(sequential minimal optimization,SMO)于1998年被John Platt发明,是一种用于解决支持向量机训练期间出现的二次规划 ...

  5. DL之LSTM:LSTM算法论文简介(原理、关键步骤、RNN/LSTM/GRU比较、单层和多层的LSTM)、案例应用之详细攻略

    DL之LSTM:LSTM算法论文简介(原理.关键步骤.RNN/LSTM/GRU比较.单层和多层的LSTM).案例应用之详细攻略 目录 LSTM算法简介 1.LSTM算法论文 1.1.LSTM算法相关论 ...

  6. 《Python智能优化算法:从原理到代码实现与应用》出版啦

    <Python智能优化算法:从原理到代码实现与应用> 各位亲爱的小伙伴,让各位久等了.我们撰写的<Python智能优化算法:从原理到代码实现与应用>由电子工业出版社出版了. 本 ...

  7. 砥志研思SVM(四) 序列最小最优化算法(SMO)论文翻译

  8. smo算法matlab实现,SVM之序列最小最优化算法(SMO算法)

    SVM回顾 支持向量机(SVM)的一大特点是最大化间距(max margin).对于如上图的二分类问题,虽然有很多线可以将左右两部分分开,但是只有中间的红线效果是最好的,因为它的可活动范围(margi ...

  9. 序列最小最优化算法(SMO算法)

    前面三篇我已经谈了谈我对支持向量机的理解,推到了各类支持向量机的对偶算法,我们有很多最优化算法来求解这个问题,但是样本容量很大时,这些算法会变得非常低效.人们就提出了很多快速实现算法,SMO算法就是其 ...

最新文章

  1. iOS经典面试题之深入解析类Class的iskindOfClass与isMemberOfClass的底层原理
  2. 【Android开发】Android应用程序目录结构
  3. CF 1642 F. Two Arrays 随机 + sosdp
  4. 华为照片在哪个文件夹_原来华为手机还能这样清理垃圾,怪不得你的手机可以多用5年...
  5. java xsd 解析 xml文件_Java针对XSD文件验证XML文件的最佳方法是什么?
  6. 点在不规则图形内算法python_目标检测算法中规则矩形和不规则四边形IOU的Python实现...
  7. 创造型模式——工厂模式
  8. Written English-书面-一般过去时
  9. 说说我眼中的IT界加班文化
  10. 虚拟机上的linux里安装ngnix,虚拟机(linux)下安装nginx的步骤教程
  11. win10下装win7双系统_电脑安装双系统win7+win10,安装顺序不同,使用会有什么不同?...
  12. AWT_Swing_初始化(Java)
  13. mount error(12): Cannot allocate memory解决办法
  14. 西门子plc 用c语言编程,西门子PLC常用指令举例
  15. 百度、阿里、美团、头条…论剑AI,这里有开发者想知道的未来
  16. 应用 1:千帆竞发 ——分布式锁
  17. Unity 使用ContentSizeFitter刷新不及时的问题
  18. RDKit|分子修改与编辑
  19. Android如何隐藏应用程序的图标
  20. 无图言屌?YYImage 设计思路,实现细节剖析

热门文章

  1. 【JS】函数的 arguments 对象
  2. easyExcel 导出海量数据
  3. matlab取整 四舍五入
  4. MC音乐网免费解析下载工具
  5. windows taskkill强制关闭进程拒绝访问解决方法
  6. Quartz动态改变Cron表达式,来实现动态执行Spring定时任务
  7. WebRTC 基于GCC的拥塞控制(下)
  8. 半导体行业集团采购管理系统:简化企业采购流程,以数字化畅通采购信息渠道
  9. 用C语言编写一个程序,输入半径,输出圆周长、圆面积和圆球体积(圆周率取3.14)?
  10. DataGridView 选中一行不变色