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

今日拜读了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计算约束方向上的最小值
在这里插入图片描述

其中euy ii = -
是第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 0
	alph1 = Lagrange multiplier for i1
	y1 = target[i1]
	E1 = SVM output on point[i1] – y1 (check in error cache)
	s = y1*y2
	Compute L, H via equations (13) and (14)
	if (L == H)
		return 0
	k11 = kernel(point[i1],point[i1])
	k12 = kernel(point[i1],point[i2])
	k22 = kernel(point[i2],point[i2])
	eta = k11+k22-2*k12
	if (eta > 0)
	{
		a2 = alph2 + y2*(E1-E2)/eta
		if (a2 < L) a2 = L
		else if (a2 > H) a2 = H
	}
	else
	{
		Lobj = objective function at a2=L
		Hobj = objective function at a2=H
		if (Lobj < Hobj-eps)
			a2 = L
		else if (Lobj > Hobj+eps)
			a2 = H
		else
			a2 = alph2
	}
	if (|a2-alph2| < eps*(a2+alph2+eps))
		return 0
	a1 = alph1+s*(alph2-a2)
	Update threshold to reflect change in Lagrange multipliers
	Update weight vector to reflect change in a1 & a2, if SVM is linear
	Update error cache using new Lagrange multipliers
	Store a1 in the alpha array
	Store a2 in the alpha array
	return 1
endprocedure

procedure examineExample(i2)
	y2 = target[i2]
	alph2 = Lagrange multiplier for i2
	E2 = SVM output on point[i2] – y2 (check in error cache)
	r2 = E2*y2
	if ((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 alpha
			if takeStep(i1,i2)
				return 1
		}
		loop over all possible i1, starting at a random point
		{
			i1 = loop variable
			if (takeStep(i1,i2)
				return 1
		}
	}
	return 0
endprocedure

main routine:
	numChanged = 0;
	examineAll = 1;
	while (numChanged > 0 | examineAll)
	{
		numChanged = 0;
		if (examineAll)
			loop I over all training examples
				numChanged += examineExample(I)
		else
			loop I over examples where alpha is not 0 & not C
				numChanged += examineExample(I)
		if (examineAll == 1)
			examineAll = 0
		else 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,由于_{3},_{4},…,_{}都成了常量,所有的常量我们都从目标函数去除,这样我们上一节的目标优化函数变成下式:式子(11)中的目标函数可以写为:
在这里插入图片描述
注意在该公式推导中,用到yiyi=1,在SVM的数学原理中,已经求得:
在这里插入图片描述
那么,SVM在第i个样本上的输出为:
在这里插入图片描述
并设:
在这里插入图片描述
最终,目标函数变为:
在这里插入图片描述
要推出α2的更新迭代式,应该把目标函数中的α1想办法用α2表示,再对α2求导,令其导数等于0,这样就可以求出α2的更新迭代式了。
根据线性等式约束条件:
在这里插入图片描述
可以写出:
在这里插入图片描述
其中C为常数,在这个等式两边同乘y1:
在这里插入图片描述

在这里插入图片描述
则;
在这里插入图片描述
目标函数变为:

在这里插入图片描述
目标函数对α2求导:
在这里插入图片描述
使导数等于0:
在这里插入图片描述
沿对角线的目标函数的二阶导数可表示为:

在这里插入图片描述
在正常情况下,目标函数是正定的,因此沿线性等式约束的方向存在最小值,并且η必将大于零。 在这种情况下,SMO在约束方向计算最小值:
在这里插入图片描述
其中,Ei=ui-yi,是第i个训练样本的误差。
下一步,通过将无约束最小值剪切到线段的末端来找到约束最小值:
在这里插入图片描述
现在,,α1可以用α2new,clipped被更新:
因为
在这里插入图片描述
两式相减,得到:
在这里插入图片描述
在特殊情况下,η将不是正的。
如果核函数K不遵守Mercer条件,则会出现负η,这可能导致目标函数变得非正定。
如果多个训练示例具有相同的输入向量x,即使使用正确的核函数,也可能出现零η。
无论如何,即使η不是正的,SMO也会工作,在这种情况下,应该在线段的每一端评估目标函数Ψ:
在这里插入图片描述
SMO将拉格朗日乘子移动到具有目标函数最低值的端点。 如果目标函数在两端都是相同的(或者有一个小的误差)并且核函数满足Mercer条件,则联合最小化不能取得进展。

2.2 选择哪两个乘子需要被优化的启发方法

只要SMO在每一步都总是优化并改变两个拉格朗日乘子,并且其中至少有一个拉格朗日乘子在优化之前违反了KKT条件,那么根据Osuna定理,每次迭代都会降低目标函数的值,收敛性可以得到保证。为了加快收敛,SMO采用启发式方法选择两个拉格朗日乘子进行联合优化

两个单独的选择启发式:一个启发式用于选择第一个拉格朗日乘子,另一个启发式用于选择第二个拉格朗日乘子。

第一种启发式的选择用于SMO算法的外部循环。外循环首先遍历整个训练集,确定每个example是否违反KKT条件(12),如果一个example违反了KKT条件,则它是可以进行优化的。在一次遍历整个训练集之后,外部循环遍历所有其拉格朗日乘数既不是0也不是C的example(非约束example)。同样,根据KKT条件检查每个example,违反KKT条件的example可以进行优化。外部循环重复遍历非边界example,直到所有的非边界example在一个容忍误差ε内都满足KKT条件。然后外循环返回并遍历整个训练集。外循环环在整个训练集上的单次通过和在非边界子集上的多次通过之间保持交替,直到整个训练集服从ε内的KKT条件,于是算法终止。
在这里插入图片描述
第一种选择启发式将CPU时间集中在最有可能违反KKT条件的example上:非边界子集
随着SMO算法的迭代进行,位于边界的example大部分会继续保持在边界,而不在边界的example将随着其他example的优化而移动。因此,SMO算法将迭代非边界子集,直到该**子集是自洽(**该子集内所有example都在一定误差内满足KKT条件)的,然后SMO将扫描整个数据集以搜索由于优化非边界子集而已违反KKT条件的任何边界example。

注意一点,我们是在容忍误差ε范围内检查是否满足KKT条件的。 通常,ε设定为10-3。 一般识别系统通常不需要满足高精确度的KKT条件:正间隔的example可以在0.999和1.001之间输出。 如果需要产生非常高精度的输出,则SMO算法(和其他SVM算法)将不会快速收敛。

一旦选择了第一个拉格朗日乘子,SMO的第二种启发式就会选择第二个拉格朗日乘子来最大化联合优化期间所采取步长
不过,评估核函数K是耗时的,因此SMO通过等式(16)中分子的绝对值来近似步长:|E1 - E2|.
SMO为训练集中的每个非边界example保留缓存的误差值E,然后选择一个误差以使步长近似最大化。如果E1是正值,SMO会选择具有最小误差E2的example;如果E1是负值,SMO则会选择具有最大误差E2的example

在特殊情况下,SMO无法使用上述第二选择启发式方法取得积极进展。例如,如果第一和第二训练example具有相同的输入向量x,则不能进行有有效的积极的进展,这导致目标函数变为半正定的。在这种情况下,SMO使用第二选择启发式的层次结构,直到找到一对可以取得有效积极进展的拉格朗日乘子。通过在两个拉格朗日乘数的联合优化时产生非零步长,可以确定积极进展。第二选择启发式的层次结构包括以下内容。 如果上述启发式没有取得正数的结果值,那么SMO开始迭代非边界example,搜索可以取得正数结果值的第二个example。 如果没有任何非边界example取得正数结果值,则SMO开始迭代整个训练集,直到找到一个取得正数结果的example。 通过非边界example的迭代和通过整个训练集的迭代都在随机位置开始,以便不将SMO偏向训练集开始处的example。 在非常极端坏的情况下,没有一个example能够有第二个example。 发生这种情况时,跳过第一个example,SMO继续使用第一种启发式选择另外一个第一个example

2.3 更明确的优化方法说明

更明确的解释说法:这一部分就是SMO算法两个变量的选择

2.3.1 第一个变量的选择

SMO算法称选择第一个变量为外层循环,这个变量需要选择在训练集中违反KKT条件最严重的样本点。一般来说,我们首先选择违反这个条件的点。再选择违反和的点。

2.3.2 第二个变量的选择

SMO算法称选择第二个变量为内层循环,假设我们在外层循环已经找到了,第二个变量的选择标准是让有足够大的变化。由于定了的时候,也确定了,所以要想最大,只需要在为正时,选择最小的作为, 在为负时,选择最大的作为,可以将所有的保存下来加快迭代。

如果内存循环找到的点不能让目标函数有足够的下降, 可以采用遍历支持向量点来做,直到目标函数有足够的下降, 如果所有的支持向量做都不能让目标函数有足够的下降,可以跳出循环,重新选择。

2.4 计算阈值b和差值

在每次完成两个变量的优化之后,需要重新计算阈值b。当在这里插入图片描述
时,我们有:

在这里插入图片描述

于是新的^{}_{1}为:
**加粗样式**
计算出1为:

在这里插入图片描述

可以看到上两式都有y_{1}-\sum_{i=3}^m _{}_{}_{1}
因此可以将^{}_{1}用E1表示为:

在这里插入图片描述
最终的^{}为:

在这里插入图片描述

同样的,如果,那么有:

最终的为:

得到了^{}我们需要更新Ei:
在这里插入图片描述
其中,S是所有支持向量_{}的集合。

2.5 论文中计算阈值的推导

在每个迭代之后都需要重新计算阈值b,从而满足两个优化example的KKT条件。
当新的α1不在边界上时,以下阈值b1有效,因为当输入为x1时,它强制SVM的输出为y1:
在这里插入图片描述
在这里插入图片描述
当新α2不在边界上时,以下阈值b2有效,因为当输入为x2时,它强制SVM的输出为y2:
在这里插入图片描述
在这里插入图片描述
注意:这个地方,论文中的公式(20)(21)与所推导出来的表达形式不太一样。

当b1和b2都有效时,它们是相等的。 当两个新的拉格朗日乘子都处于边界并且L不等于H时,则位于b1和b2之间的值都是与KKT条件一致的阈值,可以任意选择。 SMO选择阈值在b1和b2中间一半的位置,此时b=0.5(b1+b2)。

在这里插入图片描述

原理部分内容参考链接:
https://blog.csdn.net/wolfcsharp/article/details/90210335
后来又看到了简书里面的一篇原理推导,感觉写的很好,推荐给大家:https://www.jianshu.com/p/242c1e407bac

3 线性SVM的一个优化

为了计算线性SVM,仅需要存储单个权重向量w,而不是对应于非零拉格朗日乘子的所有训练example。 如果联合优化成功,则需要更新存储的权重向量以反映新的拉格朗日乘子的值。 由于SVM的线性性质,权重向量更新很容易:
在这里插入图片描述
对带编号的公式不明确的部分,可直接查看上面论文部分的对应公式内容。

三、SVM算法总结

输入:m个样本(_{1},_{1}),(_{2},_{2}),…,(_{},_{}),其中x为n维特征向量。y为二元输出,值为1,或者-1。精度e。

输出:近似解。

1)取初值_{0}=0,=0。

2)按照2.4节中的第一个变量的选择方法选择_{1},接着第二个变量的选择方法选择_{2},求出新的^{,}{2}。
在这里插入图片描述
3)按照下式求出^{+1}
{2}:
在这里插入图片描述
4)利用{+1}_{2}和{+1}{1}的关系求出^{+1}{1}

5)按照2.3节的方法计算b^{k+1}和_{}.
6)在精度e范围内检查是否满足如下的终止条件:
在这里插入图片描述
7)如果满足则结束,返回^{+1},否则转到步骤2)。

四、SMO解决对偶问题的二次规划

SMO 的基本思路是先固定αi之外的所有参数,然后求αi的极值.由于
存在约束在这里插入图片描述
,若固定αi之外的其他变量,则αi 可由其他变量导出。于是,SMO 每次选择两个变量αi和αj,并固定其他参数.这样,在参数初始化后, SMO 不断执行如下两个步骤直至收敛:

  • 选取一对需更新的变量量αi和αj;
  • 固定αi和αj以外的参数,求解式(6.11)
    获得更新后的αi和αj.
    注意到只需选取的αi和αj 中有一个不满足KKT 条件(6.13) ,目标函数就
    会在选代后减小[Osuna et al., 1997]. 直观来看, KKT 条件违背的程度越大?则
    变量更新后可能导致的目标函数值减幅越大.于是, SMO 先选取违背KKT 条
    件程度最大的变量.第二个变量应选择一个使目标函数值减小最快的变量,但
    由于比较各变量所对应的目标函数值减幅的复杂度过高,因此SMO 采用了一
    个启发式:使选取的两变量所对应样本之间的问隔最大. 种直观的解释是,这
    样的两个变量有很大的差别,与对两个相似的变量进行更新相比,对它们进行
    更新会带给目标函数值更大的变化。

你可能感兴趣的:(数学基础,机器学习,算法,机器学习,算法)