轉自http://www.cnblogs.com/pinard/p/6111471.html
在SVM的前三篇裏,我們優化的目標函數最終都是一個關於α α向量的函數。而怎麼極小化這個函數,求出對應的α α向量,進而求出分離超平面我們沒有講。本篇就對優化這個關於α α向量的函數的SMO算法做一個總結。
1. 回顧SVM優化目標函數
我們首先回顧下我們的優化目標函數:
min α 12 ∑ i=1,j=1 m α i α j y i y j K(x i ,x j )−∑ i=1 m α i
s.t.∑ i=1 m α i y i =0
0≤α i ≤C
我們的解要滿足的KKT條件的對偶互補條件爲:
α ∗ i (y i (w ∗ ∙ϕ(x i )+b ∗ )−1)=0
根據這個KKT條件的對偶互補條件,我們有:
α ∗ i =0⇒y i (w ∗ ∙ϕ(x i )+b)≥1
0≤α ∗ i ≤C⇒y i (w ∗ ∙ϕ(x i )+b)=1
α ∗ i =C⇒y i (w ∗ ∙ϕ(x i )+b)≤1
由於w ∗ =∑ j=1 m α ∗ j y j ϕ(x j ) ,我們令g(x)=w ∗ ∙ϕ(x)+b=∑ j=1 m α ∗ j y j K(x,x j )+b ∗ ,則有:
α ∗ i =0⇒y i g(x i )≥1
0≤α ∗ i ≤C⇒y i g(x i )=1
α ∗ i =C⇒y i g(x i )≤1
2. SMO算法的基本思想
上面這個優化式子比較複雜,裏面有m個變量組成的向量α 需要在目標函數極小化的時候求出。直接優化時很難的。SMO算法則採用了一種啓發式的方法。它每次只優化兩個變量,將其他的變量都視爲常數。由於∑ i=1 m α i y i =0 .假如將α 3 ,α 4 ,...,α m
固定,那麼α 1 ,α 2 之間的關係也確定了。這樣SMO算法將一個複雜的優化算法轉化爲一個比較簡單的兩變量優化問題。
爲了後面表示方便,我們定義K ij =ϕ(x i )∙ϕ(x j )
由於α 3 ,α 4 ,...,α m
都成了常量,所有的常量我們都從目標函數去除,這樣我們上一節的目標優化函數變成下式:
min α 1 ,α 1 12 K 11 α 2 1 +12 K 22 α 2 2 +y 1 y 2 K 12 α 1 α 2 −(α 1 +α 2 )+y 1 α 1 ∑ i=3 m y i α i K i1 +y 2 α 2 ∑ i=3 m y i α i K i2
s.t.α 1 y 1 +α 2 y 2 =−∑ i=3 m y i α i =ς
0≤α i ≤Ci=1,2
3. SMO算法目標函數的優化
爲了求解上面含有這兩個變量的目標優化問題,我們首先分析約束條件,所有的α 1 ,α 2 都要滿足約束條件,然後在約束條件下求最小。
根據上面的約束條件α 1 y 1 +α 2 y 2 =ς0≤α i ≤Ci=1,2 ,又由於y 1 ,y 2 均只能取值1或者-1,
這樣α 1 ,α 2 在[0,C]和[0,C]形成的盒子裏面,並且兩者的關係直線的斜率只能爲1或者-1,也就是說α 1 ,α 2 的關係直線平行於[0,C]和[0,C]形成的盒子的對角線,如下圖所示:
由於α 1 ,α 2 的關係被限制在盒子裏的一條線段上,所以兩變量的優化問題實際上僅僅是一個變量的優化問題。不妨我們假設最終是α 2 的優化問題。由於我們採用的是啓發式的迭代法,假設我們上一輪迭代得到的解是α old 1 ,α old 2 ,假設沿着約束方向α 2 未經剪輯的解是α new,unc 2 .本輪迭代完成後的解爲α new 1 ,α new 2
由於α new 2 必須滿足上圖中的線段約束。假設L和H分別是上圖中α new 2 所在的線段的邊界。那麼很顯然我們有:
L≤α new 2 ≤H
而對於L和H,我們也有限制條件如果是上面左圖中的情況,則
L=max(0,α old 2 −α old 1 )H=min(C,C+α old 2 −α old 1 )
如果是上面右圖中的情況,我們有:
L=max(0,α old 2 +α old 1 −C)H=min(C,α old 2 +α old 1 )
也就是說,假如我們通過求導得到的α new,unc 2 ,則最終的α new 2 應該爲:
α new 2 =⎧ ⎩ ⎨ ⎪ ⎪ Hα new,unc 2 L L≤α new,unc 2 >HL≤α new,unc 2 ≤Hα new,unc 2 <L
那麼如何求出α new,unc 2 呢?很簡單,我們只需要將目標函數對α 2 求偏導數即可。
首先我們整理下我們的目標函數。
爲了簡化敘述,我們令
E i =g(x i )−y i =∑ j=1 m α ∗ j y j K(x i ,x j )+b−y i
,
其中g(x) 就是我們在第一節裏面的提到的
g(x)=w ∗ ∙ϕ(x)+b=∑ j=1 m α ∗ j y j K(x,x j )+b ∗
我們令
v i =∑ i=3 m y j α j K(x i ,x j )=g(x i )−∑ i=1 2 y j α j K(x i ,x j )−b
這樣我們的優化目標函數進一步簡化爲:
W(α 1 ,α 2 )=12 K 11 α 2 1 +12 K 22 α 2 2 +y 1 y 2 K 12 α 1 α 2 −(α 1 +α 2 )+y 1 α 1 v 1 +y 2 α 2 v 2
由於α 1 y 1 +α 2 y 2 =ς ,並且y 2 i =1 ,可以得到α 1 用α 2 表達的式子爲:
α 1 =y 1 (ς−α 2 y 2 )
將上式帶入我們的目標優化函數,就可以消除α 1 ,得到僅僅包含α 2 的式子。
W(α 2 )=12 K 11 (ς−α 2 y 2 ) 2 +12 K 22 α 2 2 +y 2 K 12 (ς−α 2 y 2 )α 2 −(α 1 +α 2 )+(ς−α 2 y 2 )v 1 +y 2 α 2 v 2
忙了半天,我們終於可以開始求α new,unc 2 了,現在我們開始通過求偏導數來得到α new,unc 2 。
∂W∂α 2 =K 11 α 2 +K 22 α 2 −2K 12 α 2 −K 11 ςy 2 +K 12 ςy 2 +y 1 y 2 −1−v 1 y 2 +y 2 v 2 =0
整理上式有:
(K 11 +K 22 −2K 12 )α 2 =y 2 (y 2 −y 1 +ςK 11 −ςK 12 +v 1 −v 2 )
=y 2 (y 2 −y 1 +ςK 11 −ςK 12 +(g(x 1 )−∑ j=1 2 y j α j K 1j −b)−(g(x 2 )−∑ j=1 2 y j α j K 2j −b))
將ς=α 1 y 1 +α 2 y 2 帶入上式,我們有:
(K 11 +K 22 −2K 12 )α new,unc 2 =y 2 ((K 11 +K 22 −2K 12 )α old 2 y 2 +y 2 −y 1 +g(x 1 )−g(x 2 ))
=(K 11 +K 22 −2K 12 )α old 2 +y2(E 1 −E 2 )
我們終於得到了α new,unc 2 的表達式:
α new,unc 2 =α old 2 +y2(E 1 −E 2 )K 11 +K 22 −2K 12 )
利用上面講到的α new,unc 2 和α new 2 的關係式,我們就可以得到我們新的α new 2 了。利用α new 2 和α new 1 的線性關係,我們也可以得到新的α new 1 。
4. SMO算法兩個變量的選擇
SMO算法需要選擇合適的兩個變量做迭代,其餘的變量做常量來進行優化,那麼怎麼選擇這兩個變量呢?
4.1 第一個變量的選擇
SMO算法稱選擇第一個變量爲外層循環,這個變量需要選擇在訓練集中違反KKT條件最嚴重的樣本點。對於每個樣本點,要滿足的KKT條件我們在第一節已經講到了:
α ∗ i =0⇒y i g(x i )≥1
0≤α ∗ i ≤C⇒y i g(x i )=1
α ∗ i =C⇒y i g(x i )≤1
一般來說,我們首先選擇違反0≤α ∗ i ≤C⇒y i g(x i )=1 這個條件的點。如果這些支持向量都滿足KKT條件,再選擇違反α ∗ i =0⇒y i g(x i )≥1 和
α ∗ i =C⇒y i g(x i )≤1 的點。
4.2 第二個變量的選擇
SMO算法稱選擇第二一個變量爲內層循環,假設我們在外層循環已經找到了α 1 ,
第二個變量α 2 的選擇標準是讓|E1−E2| 有足夠大的變化。由於α 1 定了的時候,E 1 也確定了,所以要想|E1−E2| 最大,只需要在E 1 爲正時,選擇最小的E i 作爲E 2 ,
在E 1 爲負時,選擇最大的E i 作爲E 2 ,可以將所有的E i 保存下來加快迭代。
如果內存循環找到的點不能讓目標函數有足夠的下降, 可以採用遍歷支持向量點來做α 2 ,直到目標函數有足夠的下降,
如果所有的支持向量做α 2 都不能讓目標函數有足夠的下降,可以跳出循環,重新選擇α 1
4.3 計算閾值b和差值E i
在每次完成兩個變量的優化之後,需要重新計算閾值b。當0≤α new 1 ≤C
時,我們有
y 1 −∑ i=1 m α i y i K i1 −b 1 =0
於是新的b new 1 爲:
b new 1 =y 1 −∑ i=3 m α i y i K i1 −α new 1 y 1 K 11 −α new 2 y 2 K 21
計算出E 1 爲:
E 1 =g(x 1 )−y 1 =∑ i=3 m α i y i K i1 +α old 1 y 1 K 11 +α old 2 y 2 K 21 +b old −y 1
可以看到上兩式都有y 1 −∑ i=3 m α i y i K i1 ,因此可以將b new 1 用E 1 表示爲:
b new 1 =−E 1 −y 1 K 11 (α new 1 −α old 1 )−y 2 K 21 (α new 2 −α old 2 )+b old
同樣的,如果0≤α new 2 ≤C ,
那麼有:
b new 2 =−E 2 −y 1 K 12 (α new 1 −α old 1 )−y 2 K 22 (α new 2 −α old 2 )+b old
最終的b new 爲:
b new =b new 1 +b new 2 2
得到了b new 我們需要更新E i :
E i =∑ S y j α j K(x i ,x j )+b new −y i
其中,S是所有支持向量x j 的集合。
好了,SMO算法基本講完了,我們來歸納下SMO算法。
5. SMO算法總結
輸入是m個樣本(x 1 ,y 1 ),(x 2 ,y 2 ),...,(x m ,y m ), ,
其中x爲n維特徵向量。y爲二元輸出,值爲1,或者-1.精度e。
輸出是近似解α
1)取初值α 0 =0,k=0
2)按照4.1節的方法選擇α k 1 ,接着按照4.2節的方法選擇α k 2 ,求出新的α new,unc 2 。
α new,unc 2 =α k 2 +y 2 (E 1 −E 2 )K 11 +K 22 −2K 12 )
3)按照下式求出α k+1 2
α k+1 2 =⎧ ⎩ ⎨ ⎪ ⎪ Hα new,unc 2 L L≤α new,unc 2 >HL≤α new,unc 2 ≤Hα new,unc 2 <L
4)利用α k+1 2 和α k+1 1 的關係求出α k+1 1
5)按照4.3節的方法計算b k+1 和E i
6)在精度e範圍內檢查是否滿足如下的終止條件:
∑ i=1 m α i y i =0
0≤α i ≤C,i=1,2...m
α k+1 i =0⇒y i g(x i )≥1
0≤α k+1 i ≤C⇒y i g(x i )=1
α k+1 i =C⇒y i g(x i )≤1
7)如果滿足則結束,返回α k+1 ,否則轉到步驟2)。
SMO算法終於寫完了,這塊在以前學的時候是非常痛苦的,不過弄明白就豁然開朗了。希望大家也是一樣。寫完這一篇, SVM系列就只剩下支持向量迴歸了,勝利在望!