SMO论文学习2

Working Set Selection Using Second Order Information for Training Support Vector Machines(2005)

      上一篇论文《Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines(1998)》是SMO的开篇之作,里面包含SMO的主体思想,其中关于拉格朗日乘子alpha的选取是启发式的,没有严格的数学证明。这篇文章主要讨论alpha的选取问题,提出了一种更有效地方法并有理论保障。
      同时这篇文章也是libsvm中核心类Solver的主体思想,主要讲在SMO中的working set selection问题,文章在一阶近似的基础上提出了二阶近似方法从而使得SMO问题收敛更快,并有理论保障。
SVM的优化问题如下:
SMO论文学习2_第1张图片

       分解算法只更新拉格朗日乘子alpha_i的一个固定大小的子集,其他保持不变。因此,每当更新一个新子集加入到工作集,另一个子集要被移除。在这个算法中,目标是每次在数据的一个小的子集上优化全局问题。SMO算法是将分解算法思想推向极致得出的,即每次迭代仅优化两个点的最小子集,算法的流程如下:
SMO论文学习2_第2张图片

       但是,如何find a two-element working set B,上面并没有讲。下面直接贴出本篇论文的Select_B 方法:

1、一阶近似的Working set选取方法:

SMO论文学习2_第3张图片

上面主要用到了对偶问题(1)式KKT条件,很好理解,稍微贴一张KKT条件的图:

SMO论文学习2_第4张图片

至于说为什么它与一阶近似有关,文章里面有解释,求知欲强的可以自己看看原文。

2、二阶近似的Working set选取方法:
SMO论文学习2_第5张图片



上面的算法的流程还是相对清晰的。下面来看看基于二阶近似的Working set选取SMO的伪代码(Algorithm 2):

Inputs:
	y: array of {+1, -1}: class of the i-th instance
	Q: Q[i][j] = y[i]*y[j]*K[i][j]; K: kernel matrix
	len: number of instances
	
//parameters
eps = 1e-3 // stopping tolerance
tau = 1e-12
//main routine
initialize alpha array A to all zero
initialize gradient array G to all -1
while(1)
{
	(i,j) = selectB()
	if (j == -1)
		break
	//working set is (i,j)
	a = Q[i][i]+Q[j][j]-2*y[i]y[j]*Q[i][j]
	if (a <= 0)
		a = tau
	b = -y[i]*G[i]+y[j]*G[j]
	
	//update alpha 
	oldAi = A[i], oldAj = A[j]
	A[i] += y[i]*b/a
	A[j] -= y[j]*b/a
	
	//project alpha back to the feasible region 
	sum = y[i]*oldAi + y[j]*oldAj
	if A[i] > C
		A[i] = C
	if A[i] < 0
		A[i] = 0
	A[j] = y[j]*(sum - y[i]*A[i])
	
	if A[j] > C
		A[j] = C
	if A[j] < 0
		A[j] = 0
	A[i] = y[i]*(sum - y[j]*A[j])
	
	//update gradient
	deltaAi = A[i] - oldAi,   deltaAj = A[j] - oldAj
	for t = 1 to len
		G[t] += Q[t][i]*deltaAi + Q[t][j]*deltaAj
}
procedure selectB
	//select i
	i = -1
	G_max = -inf
	G_min = inf
	for t = 1 to len
		if(y[t]==+1 and A[t] < C) or (y[t]==-1 and A[t] >0)
			{
				if(-y[t]*G[t] >= G_max)
					{
						i = t
						G_max = -y[t]*G[t]
					}
			}
			
	//select j
	j = -1
	obj_min = inf
	for t = 1 to len
	{
		if(y[t]==+1 and A[t] >0)or(y[t]==-1 and A[t] < C)
		{
			b = G_max + y[t]*G[t]
			if (-y[t]*G[t] <= G_min)
				G_min = -y[t]*G[t]
			if (b > 0)
			{
					a = Q[i][i]+Q[t][t]-2*y[i]*y[t]*Q[i][t]
					if (a <= 0)
						a = tau
					if (-(b*b)/a <= obj_min)
					{
						j = t
						obj_min = -(b*b)/a
					}
			}
		}
	}
	
	if (G_max-G_min < eps)
		return (-1,-1)
	
	return (i,j)
end procedure


你可能感兴趣的:(机器学习技法,svm,机器学习)