支持向量機(SVM)中的 SMO算法

1. 前言

最近又從新複習了一遍支持向量機(SVM)。其實我的感受SVM總體能夠分紅三個部分:html

1. SVM理論自己:包括最大間隔超平面(Maximum Margin Classifier),拉格朗日對偶(Lagrange Duality),支持向量(Support Vector),核函數(Kernel)的引入,鬆弛變量的軟間隔優化(Outliers),最小序列優化(Sequential Minimal Optimization)等。算法

2. 核方法(Kernel):其實核方法的發展是能夠獨立於SVM來看待的,核方法在不少其它算法中也會應用到。緩存

3. 優化理論:這裏主要介紹的是最小序列優化(Sequential Minimal Optimization),優化理論的發展也是獨立於SVM的。函數

 

2. SVM理論基礎

SVM的理論基礎在上一篇博客的總結中能夠參考:http://www.cnblogs.com/bentuwuying/p/6444249.html工具

對於支持向量機(SVM)的簡單總結:學習

1. Maximum Margin Classifier

2. Lagrange Duality

3. Support Vector

4. Kernel

5. Outliers

6. Sequential Minimal Optimization

 我的以爲SMO又能夠分爲兩部分:優化

(1)如何選擇每次迭代時候的目標工做集,即選擇哪兩個拉格朗日乘子來迭代。spa

(2)如何對選擇好的工做集(拉格朗日乘子)進行更新迭代。.net

 

3. SMO最初的版本(Platt,1998)

  

    

      

SMO就是要解這個凸二次規劃問題,這裏的C是個很重要的參數,它從本質上說是用來折中經驗風險和置信風險的,C越大,置信風險越大,經驗風險越小;而且全部的拉格朗日乘子都被限制在了以C爲邊長的大盒子裏。SMO的出現使得咱們沒必要去求助於昂貴的第三方工具去解決這個凸二次規劃問題,目前對它的改進版本不少,這一節先介紹它的最初形式和思想。3d

SMO是Microsoft Research的John C. Platt在《Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines》一文中提出的,其基本思想是將Vapnik在1982年提出的Chunking方法推到極致,即:經過將原問題分解爲一系列小規模凸二次規劃問題而得到原問題解的方法,每次迭代只優化由2個點組成的工做集,SMO算法每次啓發式地選擇兩個拉格朗日乘子同時固定其它拉格朗日乘子來找到這兩個拉格朗日乘子的最優值,直到達到中止條件

 

(1)、 KKT條件

        SMO是以C-SVC的KKT條件爲基礎進行後續操做的,這個KKT條件是:

    

    

    

其中

上述條件其實就是KT互補條件,SVM學習——軟間隔優化一文,有以下結論:

      

      

從上面式子能夠獲得的信息是:當時,鬆弛變量,此時有:,對應樣本點就是誤分點;當時,鬆弛變量爲零,此時有,對應樣本點就是內部點,即分類正確而又遠離最大間隔分類超平面的那些樣本點;而時,鬆弛變量爲零,有,對應樣本點就是支持向量。

(2)、凸優化問題中止條件

       對於凸優化問題,在實現時總須要適當的中止條件來結束優化過程,中止條件能夠是:

       一、監視目標函數的增加率,在它低於某個容忍值時中止訓練,這個條件是最直白和簡單的,可是效果很差;

       二、監視原問題的KKT條件,對於凸優化來講它們是收斂的充要條件,可是因爲KKT條件自己是比較苛刻的,因此也須要設定一個容忍值,即全部樣本在容忍值範圍內知足KKT條件則認爲訓練能夠結束;

       三、監視可行間隙,它是原始目標函數值和對偶目標函數值的間隙,對於凸二次優化來講這個間隙是零,以一階範數軟間隔爲例:

原始目標函數與對偶目標函數的差爲:

                            

                                     

                                     

                                     

                                     

定義比率:,能夠利用這個比率達到某個容忍值做爲中止條件。

 

(3)、SMO思想

        沿襲分解思想,固定「Chunking工做集」的大小爲2,每次迭代只優化兩個點的最小子集且可直接得到解析解,算法流程:

 

image
 
 

(4)、僅含兩個Langrange乘子解析解

       爲了描述方便定義以下符號:

                                          

                                         

                                          

因而目標函數就變成了:

                                            

                                                         

                                                      

                                                                                               

                                                      

                                                                                     

                                                      

                                                                     

                                                                     

                                                      

                                                                    

注意第一個約束條件:,能夠將看做常數,有(爲常數,咱們不關心它的值),等式兩邊同時乘以,獲得爲常數,其值爲,咱們不關心它,)。將用上式替換則獲得一個只含有變量的求極值問題:

                                         

                                                                                                   

這下問題就簡單了,對求偏導數獲得:

                                        

帶入上式有:

                    

帶入,用,表示偏差項(能夠想象,即便分類正確,的值也可能很大)、(是原始空間向特徵空間的映射),這裏能夠當作是一個度量兩個樣本類似性的距離,換句話說,一旦選擇核函數則意味着你已經定義了輸入空間中元素的類似性

最後獲得迭代式:

                                        

注意第二個約束條件——那個強大的盒子:,這意味着也必須落入這個盒子中,綜合考慮兩個約束條件,下圖更直觀:

image

異號的情形

image

同號的情形

能夠看到兩個乘子既要位於邊長爲C的盒子裏又要在相應直線上,因而對於的界來講,有以下狀況:

                                           

整理得下式:

                                          

又由於,消去後獲得:

                                          

 

(5)、啓發式的選擇方法

        根據選擇的中止條件能夠肯定怎麼樣選擇點能對算法收斂貢獻最大,例如使用監視可行間隙的方法,一個最直白的選擇就是首先優化那些最違反KKT條件的點,所謂違反KKT條件是指:

                                          

                                          

                                          

由前面的中止條件3可知,對可行間隙貢獻最大的點是那些

                                          

                                         其中

取值大的點,這些點致使可行間隙變大,所以應該首先優化它們,緣由以下:

        一、當知足KKT條件:即時,

當違背KKT條件:即時,,因而

可見,因爲違背KKT條件致使可行間隙變大;

        二、當知足KKT條件:即時,

當違背KKT條件:即

              若,其中

              若,其中

可見,因爲違背KKT條件依然致使可行間隙變大;

        三、當知足KKT條件:即時,

當違背KKT條件:即時,,其中

可見,因爲違背KKT條件仍是會致使可行間隙變大。

        SMO的啓發式選擇有兩個策略:

        啓發式選擇1:

        最外層循環,首先,在全部樣本中選擇違反KKT條件的一個乘子做爲最外層循環,用「啓發式選擇2」選擇另一個乘子並進行這兩個乘子的優化,接着,從全部非邊界樣本中選擇違反KKT條件的一個乘子做爲最外層循環,用「啓發式選擇2」選擇另一個乘子並進行這兩個乘子的優化(之因此選擇非邊界樣本是爲了提升找到違反KKT條件的點的機會),最後,若是上述非邊界樣本中沒有違反KKT條件的樣本,則再從整個樣本中去找,直到全部樣本中沒有須要改變的乘子或者知足其它中止條件爲止。

        啓發式選擇2:

        內層循環的選擇標準能夠從下式看出:

                                             

要加快第二個乘子的迭代速度,就要使最大,而在上沒什麼文章可作,因而只能使最大。

肯定第二個乘子方法:

        一、首先在非界乘子中尋找使得最大的樣本; 
        二、若是1中沒找到則從隨機位置查找非界乘子樣本; 
        三、若是2中也沒找到,則從隨機位置查找整個樣本(包含界上和非界乘子)。

 

(6)、關於兩乘子優化的說明  

         由式子

                    

        可知:

                   

因而對於這個單變量二次函數而言,若是其二階導數,則二次函數開口向下,能夠用上述迭代的方法更新乘子,若是,則目標函數只能在邊界上取得極值(此時二次函數開口向上),換句話說,SMO要能處理取任何值的狀況,因而在時有如下式子:

一、時:

                         

二、時:

                         

                       

三、                   

                                            

                                            

                                                                                 

                                            

                                                 

                                            

                                                 

分別將乘子帶入獲得兩種狀況下的目標函數值: 。顯然,哪一種狀況下目標函數值最大,則乘子就往哪兒移動,若是目標函數的差在某個指定精度範圍內,說明優化沒有進展。

        另外發現,每一步迭代都須要計算輸出進而獲得,因而還要更新閾值,使得新的乘子知足KKT條件,考慮至少有一個在界內,則須要知足,因而的迭代能夠這樣獲得:

一、設在界內,則:

                        

又由於:    

                        

因而有:

                        

                        

等式兩邊同乘後移項得:

                         

                               

二、設在界內,則:

                        

三、設都在界內,則:狀況1和狀況2的值相等,任取一個;

四、設都不在界內,則:取值爲狀況1和狀況2之間的任意值。

 

(7)、提升SMO的速度       

       從實現上來講,對於標準的SMO能提升速度的地方有:

       一、能用緩存的地方儘可能用,例如,緩存核矩陣,減小重複計算,可是增長了空間複雜度;

       二、若是SVM的核爲線性核時候,可直接更新,畢竟每次計算的代價較高,因而能夠利用舊的乘子信息來更新,具體以下:

,應用到這個性質的例子能夠參見SVM學習——Coordinate Desent Method

       三、關注能夠並行的點,用並行方法來改進,例如可使用MPI,將樣本分爲若干份,在查找最大的乘子時能夠如今各個節點先找到局部最大點,而後再從中找到全局最大點;又如中止條件是監視對偶間隙,那麼能夠考慮在每一個節點上計算出局部可行間隙,最後在master節點上將局部可行間隙累加獲得全局可行間隙。

       對標準SMO的改進有不少文獻,例如使用「Maximal Violating Pair 」去啓發式的選擇乘子是一種頗有效的方法,還有使用「 Second Order Information」的方法,我以爲理想的算法應該是:算法自己的收斂速度能有較大提升,同時算法可並行程度也較高。

 

4. SMO更新的版本(Fan,2005)

 前面提到過,SMO能夠分爲兩部分:

(1)如何選擇每次迭代時候的目標工做集,即選擇哪兩個拉格朗日乘子來迭代。

(2)如何對選擇好的工做集(拉格朗日乘子)進行更新迭代。

而如何選擇工做集,是SMO算法很重要的一個部分,由於不一樣的選擇方式能夠致使不一樣的訓練速度。

Rong-En Fan等人在2005的paper《Working Set Selection Using Second Order Information for Training Support Vector Machines》介紹了每次迭代時幾種不一樣的工做集選擇方法。

首先仍是放出SMO須要優化的目標函數:

 

(1)Algorithm 1 (SMO-type decomposition method)

 

 (2)WSS 1 (Working set selection via the 「maximal violating pair」)

 

這個working set selection是Keerthi等人在2001年提出的,在2001年發佈的libSVM中有所應用。

該working set selection能夠由(1)式的KKT條件得出:假設存在向量是(1)式的解,則必然存在實數和兩個非負向量使得下式成立:

其中,是目標函數的梯度。

上面的條件能夠被重寫爲:

進一步,有

令,

則目標函數存在最優解的條件是:

 

由上面這個關於「Violating pair」的定義能夠看出,最大程度上違反(6)式條件的{i, j} pair 便是working set的最佳選擇,由於咱們須要對這些最違反(6)式的{i, j} pair作更新迭代,讓它們符合(6)式的要求,便會逐步讓目標函數獲得最優值。具體的理論定理以下:

 有趣的是,選擇最大程度上違反KKT條件的{i, j} pair 與 「求目標函數的一階近似的最小值」時候取得的{i, j} pair是一致的。即經過WSS 1得到的{i, j} pair知足:

經過定義,(8a)的目標函數便是對的一階近似進行求最優解:

其中,是因爲,而(8b)和(8c)是因爲。因爲(8a)是線性函數,則避免了目標函數取值無窮小。

第一眼看上去,(7)式彷佛須要對全部的拉格朗日乘子遍歷一遍纔可以找出最優的{i,j} pair,然而,WSS 1能夠在線性時間複雜度內找到最優值。證實以下:

Proof

 

(3)A New Working Set Selection

上面是使用了目標函數的一階近似做爲代替進行優化,因而乎,咱們能夠再進一步,使用目標函數的二階近似做爲代替進行優化:

 

 (4)WSS 2 (Working set selection using second order information)

下面的理論證實按照WSS 2能夠有效地解決(11)式中的最優值問題:

 

(5)Non-Positive Definite Kernel Matrices

前面的方法並無涵蓋的狀況,對於這種狀況,Chen等人在2006年給出瞭解決方法:

 

(6)WSS 3 (Working set selection using second order information: any symmetric K)

 

因而,使用WSS 3來對SMO-type 分解方法選擇working set的步驟爲:

(7)Algorithm 2 (An SMO-type decomposition method using WSS 3)

 

相關文章
相關標籤/搜索