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》了。
我拜讀了一下,下面先說講義上對此方法的總結。
首先回到我們前面一直懸而未解的問題,對偶函數最後的優化問題:
要解決的是在參數上求最大值W的問題,至於和都是已知數。C由我們預先設定,也是已知數。
按照座標上升的思路,我們首先固定除以外的所有參數,然後在上求極值。等一下,這個思路有問題,因爲如果固定以外的所有參數,那麼將不再是變量(可以由其他值推出),因爲問題中規定了
因此,我們需要一次選取兩個參數做優化,比如和,此時可以由和其他參數表示出來。這樣迴帶到W中,W就只是關於的函數了,可解。
這樣,SMO的主要步驟如下:
意思是,第一步選取一對和,選取方法使用啓發式方法(後面講)。第二步,固定除和之外的其他參數,確定W極值條件下的,由表示。
SMO之所以高效就是因爲在固定其他參數後,對一個參數優化過程很高效。
下面討論具體方法:
假設我們選取了初始值滿足了問題中的約束條件。接下來,我們固定,這樣W就是和的函數。並且和滿足條件:
由於都是已知固定值,因此爲了方面,可將等式右邊標記成實數值。
當和異號時,也就是一個爲1,一個爲-1時,他們可以表示成一條直線,斜率爲1。如下圖:
然後反代入W中,得
展開後W可以表示成。其中a,b,c是固定值。這樣,通過對W進行求導可以得到,然而要保證滿足,我們使用表示求導求出來的,然而最後的,要根據下面情況得到:
下面進入Platt的文章,來找到啓發式搜索的方法和求b值的公式。
這邊文章使用的符號表示有點不太一樣,不過實質是一樣的,先來熟悉一下文章中符號的表示。
文章中定義特徵到結果的輸出函數爲
原始的優化問題爲:
求導得到:
經過對偶後爲:
這裏與W函數是一樣的,只是符號求反後,變成求最小值了。和是一樣的,都表示第i個樣本的輸出結果(1或-1)。
由公式(7)代入(1)中可知,
這個過程和之前對偶過程一樣。
重新整理我們要求的問題爲:
與之對應的KKT條件爲:
這個KKT條件說明,在兩條間隔線外面的點,對應前面的係數爲0,在兩條間隔線裏面的對應爲C,在兩條間隔線上的對應的係數在0和C之間。
將我們之前得到L和H重新拿過來:
之前我們將問題進行到這裏,然後說將用表示後代入W中,這裏將代入中,得
其中
這裏的和代表某次迭代前的原始值,因此是常數,而和是變量,待求。公式(24)中的最後一項是常數。
其中
代入(24)中,得
如果的二階導數大於0(凹函數),那麼一階導數爲0時,就是極小值了。
假設其二階導數爲0(一般成立),那麼上式化簡爲:
將w和v代入後,繼續化簡推導,得(推導了六七行推出來了)
通常情況下目標函數是正定的,也就是說,能夠在直線約束方向上求得最小值,並且。
那麼
在特殊情況下,可能不爲正,如果核函數K不滿足Mercer定理,那麼目標函數可能變得非正定,可能出現負值。即使K是有效的核函數,如果訓練樣本中出現相同的特徵x,那麼仍有可能爲0。SMO算法在不爲正值的情況下仍有效。爲保證有效性,我們可以推導出就是的二階導數,,沒有極小值,最小值在邊緣處取到(類比),時更是單調函數了,最小值也在邊緣處取得,而的邊緣就是L和H。這樣將和分別代入中即可求得的最小值,相應的還是也可以知道了。具體計算公式如下:
至此,迭代關係式出了b的推導式以外,都已經推出。
b每一步都要更新,因爲前面的KKT條件指出了和的關係,而和b有關,在每一步計算出後,根據KKT條件來調整b。
b的更新有幾種情況:
來自羅林開的ppt
這樣全部參數的更新公式都已經介紹完畢,附加一點,如果使用的是線性核函數,我們就可以繼續使用w了,這樣不用掃描整個樣本庫來作內積了。
w值的更新方法爲:
根據前面的
公式推導出。
12 SMO中拉格朗日乘子的啓發式選擇方法
終於到了最後一個問題了,所謂的啓發式選擇方法主要思想是每次選擇拉格朗日乘子的時候,優先選擇樣本前面係數的作優化(論文中稱爲無界樣例),因爲在界上(爲0或C)的樣例對應的係數一般不會更改。
這條啓發式搜索方法是選擇第一個拉格朗日乘子用的,比如前面的。那麼這樣選擇的話,是否最後會收斂。可幸的是Osuna定理告訴我們只要選擇出來的兩個中有一個違背了KKT條件,那麼目標函數在一步迭代後值會減小。違背KKT條件不代表,在界上也有可能會違背。是的,因此在給定初始值=0後,先對所有樣例進行循環,循環中碰到違背KKT條件的(不管界上還是界內)都進行迭代更新。等這輪過後,如果沒有收斂,第二輪就只針對的樣例進行迭代更新。
在第一個乘子選擇後,第二個乘子也使用啓發式方法選擇,第二個乘子的迭代步長大致正比於,選擇第二個乘子能夠最大化。即當爲正時選擇負的絕對值最大的,反之,選擇正值最大的。
最後的收斂條件是在界內()的樣例都能夠遵循KKT條件,且其對應的只在極小的範圍內變動。
至於如何寫具體的程序,請參考John C. Platt在論文中給出的僞代碼。
13 總結
這份SVM的講義重點概括了SVM的基本概念和基本推導,中規中矩卻又讓人醍醐灌頂。起初讓我最頭疼的是拉格朗日對偶和SMO,後來逐漸明白拉格朗日對偶的重要作用是將w的計算提前並消除w,使得優化函數變爲拉格朗日乘子的單一參數優化問題。而SMO裏面迭代公式的推導也着實讓我花費了不少時間。
對比這麼複雜的推導過程,SVM的思想確實那麼簡單。它不再像logistic迴歸一樣企圖去擬合樣本點(中間加了一層sigmoid函數變換),而是就在樣本中去找分隔線,爲了評判哪條分界線更好,引入了幾何間隔最大化的目標。
之後所有的推導都是去解決目標函數的最優化上了。在解決最優化的過程中,發現了w可以由特徵向量內積來表示,進而發現了核函數,僅需要調整核函數就可以將特徵進行低維到高維的變換,在低維上進行計算,實質結果表現在高維上。由於並不是所有的樣本都可分,爲了保證SVM的通用性,進行了軟間隔的處理,導致的結果就是將優化問題變得更加複雜,然而驚奇的是鬆弛變量沒有出現在最後的目標函數中。最後的優化求解問題,也被拉格朗日對偶和SMO算法化解,使SVM趨向於完美。
另外,其他很多議題如SVM背後的學習理論、參數選擇問題、二值分類到多值分類等等還沒有涉及到,以後有時間再學吧。其實樸素貝葉斯在分類二值分類問題時,如果使用對數比,那麼也算作線性分類器。