SMO算法(Sequential minimal optimization)要解决的对偶问题
maxα −12∑i=1m∑j=1mαiαjy(i)y(j)⟨x(i),x(j)⟩+∑i=1mαi max α − 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y ( i ) y ( j ) ⟨ x ( i ) , x ( j ) ⟩ + ∑ i = 1 m α i
s.t. ∑i=1mαiyi=0 s.t. ∑ i = 1 m α i y i = 0
0⩽αi⩽C, i=1,...,m 0 ⩽ α i ⩽ C , i = 1 , . . . , m
该问题的收敛条件
αi=0αi=C0<αi<C⇒y(i)(wTx(i)+b)⩾1⇒y(i)(wTx(i)+b)⩽1⇒y(i)(wTx(i)+b)=1 α i = 0 ⇒ y ( i ) ( w T x ( i ) + b ) ⩾ 1 α i = C ⇒ y ( i ) ( w T x ( i ) + b ) ⩽ 1 0 < α i < C ⇒ y ( i ) ( w T x ( i ) + b ) = 1
SMO算法中的“minimal”表示我们希望一次迭代改变最小数量的 αi α i ,在该算法中只需要改变2个
Coordinate ascent
坐标上升法的特点是,尽管可能需要比较多的迭代次数,但是每一步迭代的代价非常低
SMO算法采用了Coordinate ascent的思想
考虑满足约束条件的 α1,α2,...,αm α 1 , α 2 , . . . , α m ,现在我们采用Coordinate ascent的思想来完成一次迭代,假设我们固定 α2,...,αm α 2 , . . . , α m ,取 α1 α 1 进行优化,这样做可行吗?
回答是不可行,因为约束 ∑i=1mαiyi=0 ∑ i = 1 m α i y i = 0 始终是存在的,这意味着固定 α2,...,αm α 2 , . . . , α m ,则 α1 α 1 的取值只能是唯一的,所以不能只取 αi α i 进行优化,而应该取一对 αi α i , αj α j 进行优化
假设我们固定 α3,…,αm α 3 , … , α m ,取 α1 α 1 , α2 α 2 进行优化
则 α1y(1)+α2y(2)=ζ α 1 y ( 1 ) + α 2 y ( 2 ) = ζ
以 α1 α 1 , α2 α 2 为坐标轴,画出如下示意图

由于 α1 α 1 , α2 α 2 需要满足下列3个条件
0⩽α1⩽C 0 ⩽ α 1 ⩽ C
0⩽α2⩽C 0 ⩽ α 2 ⩽ C
α1y(1)+α2y(2)=ζ α 1 y ( 1 ) + α 2 y ( 2 ) = ζ
故 (α1,α2) ( α 1 , α 2 ) 可行的位置为图中红色线段, α1 α 1 , α2 α 2 各自可行的位置为图中绿色线段,换句话说, α1 α 1 , α2 α 2 的取值范围被各自限定在一个区间内
假设我们选取 α2 α 2 进行优化,并设 α2 α 2 可行的上下界分别为 H H 和 L L ,即 L⩽α2⩽H L ⩽ α 2 ⩽ H
首先我们利用 α1y(1)+α2y(2)=ζ α 1 y ( 1 ) + α 2 y ( 2 ) = ζ 消去 α1 α 1 ,最终得到一个只包含 α2 α 2 的式子,这个式子的最高次数为 2 2 ,可以直接套用公式求出最优解 α∗2 α 2 ∗ (初中就已经学过如何求二次函数的最值)
然后还需要检查 α∗2 α 2 ∗ 是否在区间 [L,H] [ L , H ] 内,如果不是,需要进行处理,得到迭代后的 αnew2 α 2 n e w ,处理方法如下
αnew2=⎧⎩⎨⎪⎪Hif α∗2>Hα∗2if L⩽α∗2⩽HLif α∗2<L(46)(47)(48) α 2 n e w = { (46) H i f α 2 ∗ > H (47) α 2 ∗ i f L ⩽ α 2 ∗ ⩽ H (48) L i f α 2 ∗ < L
再利用 αnew1y(1)+αnew2y(2)=ζ α 1 n e w y ( 1 ) + α 2 n e w y ( 2 ) = ζ 求出 αnew1 α 1 n e w ,此时,本次迭代的工作完成
【重新思考】
假设参数更新前为 [αold1αold2αold3αold4⋯αoldm] [ α 1 old α 2 old α 3 old α 4 old ⋯ α m old ]
我们选择变量 α1 α 1 和 α2 α 2 进行更新
参数更新后为 [αnew1αnew2αold3αold4⋯αoldm] [ α 1 new α 2 new α 3 old α 4 old ⋯ α m old ]
那么有
αold1+αold2=−∑i=3mαoldi=ζ α 1 old + α 2 old = − ∑ i = 3 m α i old = ζ
αnew1+αnew2=−∑i=3mαoldi=ζ α 1 new + α 2 new = − ∑ i = 3 m α i old = ζ
为了计算 ζ ζ ,可以使用 αold1+αold2 α 1 old + α 2 old 计算,或者使用 −∑i=3mαoldi − ∑ i = 3 m α i old 计算,显然,计算简单的是后者
这就是为什么需要使用 αold1 α 1 old 和 αold2 α 2 old 的原因