svm的smo演算法

sunmenggmail發表於2012-04-10

轉自:http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html

向作者表示感謝!

11 SMO優化演算法(Sequential minimal optimization)

SMO演算法由Microsoft Research的John C. Platt在1998年提出,併成為最快的二次規劃優化演算法,特別針對線性SVM和資料稀疏時效能更優。關於SMO最好的資料就是他本人寫的《Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machines》了。

我拜讀了一下,下面先說講義上對此方法的總結。

首先回到我們前面一直懸而未解的問題,對偶函式最後的優化問題:

clip_image001

要解決的是在引數clip_image003上求最大值W的問題,至於clip_image005clip_image007都是已知數。C由我們預先設定,也是已知數。

按照座標上升的思路,我們首先固定除clip_image009以外的所有引數,然後在clip_image009[1]上求極值。等一下,這個思路有問題,因為如果固定clip_image009[2]以外的所有引數,那麼clip_image009[3]將不再是變數(可以由其他值推出),因為問題中規定了

clip_image010

因此,我們需要一次選取兩個引數做優化,比如clip_image009[4]clip_image012,此時clip_image012[1]可以由clip_image009[5]和其他參數列示出來。這樣迴帶到W中,W就只是關於clip_image009[6]的函式了,可解。

這樣,SMO的主要步驟如下:

clip_image013

意思是,第一步選取一對clip_image015clip_image017,選取方法使用啟發式方法(後面講)。第二步,固定除clip_image015[1]clip_image017[1]之外的其他引數,確定W極值條件下的clip_image015[2]clip_image017[2]clip_image015[3]表示。

SMO之所以高效就是因為在固定其他引數後,對一個引數優化過程很高效。

下面討論具體方法:

假設我們選取了初始值clip_image003[1]滿足了問題中的約束條件。接下來,我們固定clip_image019,這樣W就是clip_image009[7]clip_image012[2]的函式。並且clip_image009[8]clip_image012[3]滿足條件:

clip_image020

由於clip_image019[1]都是已知固定值,因此為了方面,可將等式右邊標記成實數值clip_image022

clip_image023

clip_image025clip_image027異號時,也就是一個為1,一個為-1時,他們可以表示成一條直線,斜率為1。如下圖:

image

橫軸是clip_image009[9],縱軸是clip_image012[4]clip_image009[10]clip_image012[5]既要在矩形方框內,也要在直線上,因此

clip_image044clip_image046

同理,當clip_image025[1]clip_image027[1]同號時,

clip_image048clip_image050

然後我們打算將clip_image009[11]clip_image012[6]表示:

clip_image051

然後反代入W中,得

clip_image052

展開後W可以表示成clip_image054。其中a,b,c是固定值。這樣,通過對W進行求導可以得到clip_image012[7],然而要保證clip_image012[8]滿足clip_image056,我們使用clip_image058表示求導求出來的clip_image012[9],然而最後的clip_image012[10],要根據下面情況得到:

clip_image059

這樣得到clip_image061後,我們可以得到clip_image009[12]的新值clip_image063

下面進入Platt的文章,來找到啟發式搜尋的方法和求b值的公式。

這邊文章使用的符號表示有點不太一樣,不過實質是一樣的,先來熟悉一下文章中符號的表示。

文章中定義特徵到結果的輸出函式為

clip_image064

與我們之前的clip_image066實質是一致的。

原始的優化問題為:

clip_image067

求導得到:

clip_image068

經過對偶後為:

clip_image069

s.t. clip_image070

clip_image071

這裡與W函式是一樣的,只是符號求反後,變成求最小值了。clip_image073clip_image075是一樣的,都表示第i個樣本的輸出結果(1或-1)。

經過加入鬆弛變數clip_image077後,模型修改為:

clip_image078

clip_image079

由公式(7)代入(1)中可知,

clip_image080

這個過程和之前對偶過程一樣。

重新整理我們要求的問題為:

clip_image081

與之對應的KKT條件為:

clip_image082

這個KKT條件說明,在兩條間隔線外面的點,對應前面的係數clip_image084為0,在兩條間隔線裡面的對應clip_image084[1]為C,在兩條間隔線上的對應的係數clip_image084[2]在0和C之間。

將我們之前得到L和H重新拿過來:

clip_image085

clip_image086

之前我們將問題進行到這裡,然後說將clip_image009[13]clip_image012[11]表示後代入W中,這裡將代入clip_image088中,得

clip_image090

其中

clip_image091

這裡的clip_image093clip_image095代表某次迭代前的原始值,因此是常數,而clip_image009[14]clip_image012[12]是變數,待求。公式(24)中的最後一項是常數。

由於clip_image009[15]clip_image012[13]滿足以下公式

clip_image097

因為clip_image099的值是固定值,在迭代前後不會變。

那麼用s表示clip_image101,上式兩邊乘以clip_image103時,變為:

clip_image104

其中

clip_image106

代入(24)中,得

clip_image107

這時候只有clip_image012[14]是變數了,求導

clip_image109

如果clip_image088[1]的二階導數大於0(凹函式),那麼一階導數為0時,就是極小值了。

假設其二階導數為0(一般成立),那麼上式化簡為:

clip_image110

將w和v代入後,繼續化簡推導,得(推導了六七行推出來了)

clip_image112

我們使用clip_image114來表示:

clip_image115

通常情況下目標函式是正定的,也就是說,能夠在直線約束方向上求得最小值,並且clip_image117

那麼我們在(30)兩邊都除以clip_image114[1]可以得到

clip_image118

這裡我們使用clip_image061[1]表示優化後的值,clip_image012[15]是迭代前的值,clip_image120

與之前提到的一樣clip_image061[2]不是最終迭代後的值,需要進行約束:

clip_image121

那麼

clip_image122

在特殊情況下,clip_image114[2]可能不為正,如果核函式K不滿足Mercer定理,那麼目標函式可能變得非正定,clip_image114[3]可能出現負值。即使K是有效的核函式,如果訓練樣本中出現相同的特徵x,那麼clip_image114[4]仍有可能為0。SMO演算法在clip_image114[5]不為正值的情況下仍有效。為保證有效性,我們可以推匯出clip_image114[6]就是clip_image088[2]的二階導數,clip_image124clip_image088[3]沒有極小值,最小值在邊緣處取到(類比clip_image126),clip_image128時更是單調函式了,最小值也在邊緣處取得,而clip_image012[16]的邊緣就是L和H。這樣將clip_image130clip_image132分別代入clip_image088[4]中即可求得clip_image088[5]的最小值,相應的clip_image130[1]還是clip_image132[1]也可以知道了。具體計算公式如下:

clip_image134

至此,迭代關係式出了b的推導式以外,都已經推出。

b每一步都要更新,因為前面的KKT條件指出了clip_image084[3]clip_image136的關係,而clip_image138和b有關,在每一步計算出clip_image084[4]後,根據KKT條件來調整b。

b的更新有幾種情況:

clip_image140

來自羅林開的ppt

這裡的界內指clip_image142,界上就是等於0或者C了。

前面兩個的公式推導可以根據clip_image144

和對於clip_image142[1]clip_image146的KKT條件推出。

這樣全部引數的更新公式都已經介紹完畢,附加一點,如果使用的是線性核函式,我們就可以繼續使用w了,這樣不用掃描整個樣本庫來作內積了。

w值的更新方法為:

clip_image147

根據前面的

clip_image068[1]

公式推匯出。

12 SMO中拉格朗日乘子的啟發式選擇方法

終於到了最後一個問題了,所謂的啟發式選擇方法主要思想是每次選擇拉格朗日乘子的時候,優先選擇樣本前面係數clip_image142[2]clip_image084[5]作優化(論文中稱為無界樣例),因為在界上(clip_image084[6]為0或C)的樣例對應的係數clip_image084[7]一般不會更改。

這條啟發式搜尋方法是選擇第一個拉格朗日乘子用的,比如前面的clip_image012[17]。那麼這樣選擇的話,是否最後會收斂。可幸的是Osuna定理告訴我們只要選擇出來的兩個clip_image084[8]中有一個違背了KKT條件,那麼目標函式在一步迭代後值會減小。違背KKT條件不代表clip_image142[3],在界上也有可能會違背。是的,因此在給定初始值clip_image084[9]=0後,先對所有樣例進行迴圈,迴圈中碰到違背KKT條件的(不管界上還是界內)都進行迭代更新。等這輪過後,如果沒有收斂,第二輪就只針對clip_image142[4]的樣例進行迭代更新。

在第一個乘子選擇後,第二個乘子也使用啟發式方法選擇,第二個乘子的迭代步長大致正比於clip_image149,選擇第二個乘子能夠最大化clip_image149[1]。即當clip_image151為正時選擇負的絕對值最大的clip_image153,反之,選擇正值最大的clip_image153[1]

最後的收斂條件是在界內(clip_image142[5])的樣例都能夠遵循KKT條件,且其對應的clip_image084[10]只在極小的範圍內變動。

至於如何寫具體的程式,請參考John C. Platt在論文中給出的虛擬碼。

13 總結

這份SVM的講義重點概括了SVM的基本概念和基本推導,中規中矩卻又讓人醍醐灌頂。起初讓我最頭疼的是拉格朗日對偶和SMO,後來逐漸明白拉格朗日對偶的重要作用是將w的計算提前並消除w,使得優化函式變為拉格朗日乘子的單一引數優化問題。而SMO裡面迭代公式的推導也著實讓我花費了不少時間。

對比這麼複雜的推導過程,SVM的思想確實那麼簡單。它不再像logistic迴歸一樣企圖去擬合樣本點(中間加了一層sigmoid函式變換),而是就在樣本中去找分隔線,為了評判哪條分界線更好,引入了幾何間隔最大化的目標。

之後所有的推導都是去解決目標函式的最優化上了。在解決最優化的過程中,發現了w可以由特徵向量內積來表示,進而發現了核函式,僅需要調整核函式就可以將特徵進行低維到高維的變換,在低維上進行計算,實質結果表現在高維上。由於並不是所有的樣本都可分,為了保證SVM的通用性,進行了軟間隔的處理,導致的結果就是將優化問題變得更加複雜,然而驚奇的是鬆弛變數沒有出現在最後的目標函式中。最後的優化求解問題,也被拉格朗日對偶和SMO演算法化解,使SVM趨向於完美。

另外,其他很多議題如SVM背後的學習理論、引數選擇問題、二值分類到多值分類等等還沒有涉及到,以後有時間再學吧。其實樸素貝葉斯在分類二值分類問題時,如果使用對數比,那麼也算作線性分類器。

相關文章