Sequential Minimal Optimization(SMO,序列最小優化算法)初探

什麼是SVM


SVM是Support Vector Machine(支持向量機)的英文縮寫,是上世紀九十年代興起的一種機器學習算法,在目前神經網絡大行其道的狀況下依然保持着生命力。有人說如今是神經網絡深度學習的時代了,AI從業者能夠不用瞭解像SVM這樣的古董了。姑且不說SVM是否真的已經沒有前途了,僅僅是SVM在數學上優美的推導就值得後來者好好欣賞一番,這也是筆者迄今爲止見過機器學習領域最優美的數學推導。算法

和大多數二分類算法同樣,SVM算法也是致力於在正例和反例之間找出一個超平面來將它們區分開來,以下圖所示:網絡

 
圖1

如圖所示,正例用「+」號表示,反例用「-」號表示。從圖中能夠看出,正例和反例是線性可分的。學習器的目的就是要學出一條如圖所示的紅色超平面將正例和反例區分開來。這也是其餘非SVM分類器的共同目標,即:機器學習

 
 

而SVM與其它分類器所不一樣的是它引入了「支持向量」這一律念,反映到圖中也就是紅色的小點所表明的向量。(注:因爲筆者做圖時採用的SVM是軟間隔的版本,所以支持向量不像是大多數教科書上採用硬間隔的SVM那樣)由SVM的優化目標咱們能夠知道:樣本空間中任意一個點x到該超平面的的距離可寫爲:函數

 
 

假設超平面能夠徹底正確地將全部樣本分類,則對於任意一個樣本(xi,yi)來講都有以下性質(注:樣本的標籤用+1表明正例,-1表明反例):學習

 
 

訓練樣本中使上式成立的樣本稱爲支持向量,兩個異類支持向量到超平面距離之和爲:優化

 
 

上式被稱爲「間隔」。SVM的優化目標是爲了找到這樣一個劃分超平面,該超平面能使間隔最大化,則SVM的優化目標能夠表示爲以下形式:spa

 
 

這就是SVM的基本數學表達,接下來就要對SVM問題進行求解。從上面的數學形式能夠看出這是一個優化問題,可使用拉格朗日乘子法求解其對偶問題。因爲本文不是專門介紹SVM的,所以忽略掉具體的推導,直接給出SVM的對偶問題表達:3d

 
 

因爲採用了拉格朗日乘子法,所以該對偶問題還有一個KKT條件約束,即要求:orm

 
 

以上,就是SVM的一些相關介紹。須要特別說明的是,以上的推導都是創建在「硬間隔」的基礎上,「硬間隔」要求樣本集中每個樣本都知足約束條件。在現實中每每很難肯定合適的核函數使得訓練樣本在特徵空間中是線性可分的,緩解該問題的一個辦法是容許支持向量機在一些樣本上出錯,爲此引入「軟間隔」的概念。具體來講,「硬間隔」要求全部參與訓練的樣本都必須知足SVM的約束條件,而「軟間隔」容許有部分樣本不知足這樣的約束。因爲本文不是專門論述SVM的,所以就不展開講「軟間隔」所帶來的一些新的問題,只說一下「軟間隔」條件下新的優化目標:對象

 
 

KKT條件爲:

 
 

其中,C爲容忍度因子,能夠理解爲SVM對「軟間隔」的支持度。若C爲無窮大,則全部的訓練樣本均必須知足SVM的約束條件,C值越小就容許越多的樣本不知足約束條件。

SMO算法思想


經過觀察SVM的優化目標咱們能夠發現其最終的目的是要計算出一組最優的alpha和常數項b的值。SMO算法的中心思想就是每次選出兩個alpha進行優化(之因此是兩個是由於alpha的約束條件決定了其與標籤乘積的累加等於0,所以必須一次同時優化兩個,不然就會破壞約束條件),而後固定其餘的alpha值。重複此過程,直到達到某個終止條件程序退出並獲得咱們須要的優化結果。接下來,就具體推導一下SMO算法的細節。

算法數學推導


因爲SVM中有核函數的概念,所以咱們用Kij來表示在覈函數K下向量i和向量j的計算值。如今假定咱們已經選出alpha1和alpha2兩個待優化項,而後將原優化目標函數展開爲與alpha1和alpha2有關的部分和無關的部分:

 
 

其中c是與alpha1和alpha2無關的部分,在本次優化中當作常數項處理。由SVM優化目標函數的約束條件:

 
 

能夠獲得:

 
 

將優化目標中全部的alpha1都替換爲用alpha2表示的形式,獲得以下式子:

 
 

此時,優化目標中僅含有alpha2一個待優化變量了,咱們如今將待優化函數對alpha2求偏導獲得以下結果:

 
 

已知:

 
 

將以上三個條件帶入偏導式子中,獲得以下結果:

 
 

化簡後得:

 
 

記:

 
 

若n<=0則退出本次優化,若n>0則可獲得alpha2的更新公式

 
 

此時,咱們已經獲得了alpha2的更新公式。不過咱們此時還須要考慮alpha2的取值範圍問題。由於alpha2的取值範圍應該是在0到C之間,可是在這裏並不能簡單地把取值範圍限定在0至C之間,由於alpha2的取值不只僅與其自己的範圍有關,也與alpha1,y1和y2有關。設alpha1*y1+alpha2*y2=k,畫出其約束,在這裏要分兩種狀況,即y1是否等於y2。咱們在這裏先來考慮y1!=y2的狀況:在這種狀況下alpha1-alpha2=k:

 
圖2

能夠看出此時alpha2的取值範圍爲:

 
 

當y1=y2時,alpha1+alpha2=k:

 
圖3

能夠看出此時alpha2的取值範圍爲:

 
 

以上,能夠總結出alpha2的取值上下界的規律:

 
 

故可獲得alpha2的取值範圍:

 
 

由alpha_old1y1+alpha_old2y2=alpha_new1y1+alpha_new2y2可得alpha1的更新公式:

 
 

接下來,須要肯定常數b的更新公式,在這裏首先須要根據「軟間隔」下SVM優化目標函數的KKT條件推導出新的KKT條件,獲得結果以下:

 
 

因爲如今alpha的取值範圍已經限定在0至C之間,也就是上面KKT條件的第三種狀況。接下來咱們將第三種KKT條件推廣到任意核函數的情境下:

 
 

由此咱們能夠獲得常數b的更新公式:

 
 

其中Ei是SVM的預測偏差,計算式爲:

 
 

以上,筆者就已經把SMO算法的大部分細節推導出來了。接下來,咱們能夠根據這些推導對SMO算法進行實現,而且用咱們的算法訓練一個SVM分類器。

SMO的算法實現


SMO算法的實現仍是比較複雜的,有不少細節,咱們不用一一關注,只用抓住其中兩個特別重要的點就好了:一、如何選取每次迭代的alpha對;二、如何肯定SVM優化程序的退出條件。筆者將就這兩個主要問題進行論述。首先關注第一個問題:如何選取alpha對。

咱們能夠簡化一下第一個問題:假定如今已經選取了第一個待優化的alpha,如何選取另外一個alpha?在SMO算法中爲了讓迭代次數儘可能少,收斂速度儘可能快,算法要求咱們選取的兩個alpha有儘量大的「差別」。在算法的實現中咱們用預測的偏差值來表徵一個alpha的效果。那麼兩個aplha儘量不一樣反映在算法上就是兩個alpha所對應的預測偏差值之差的絕對值最大,該思想用代碼表現出來以下圖所示:

 
圖4

上面的代碼反映出了這樣一種思想:首先傳入第一個alpha所對應的索引值「i」,而後搜索偏差列表eCache,在其中找到與「i」所對應的偏差值相差絕對值最大的那個索引值「j」,則另外一個alpha的索引值就定爲「j」。若偏差值列表eCache尚未初始化則從全部的索引值中隨機選取一個索引值做爲另外一個alpha的索引值。

那麼第一個alpha如何選取呢?這個問題與另外兩個問題是相關的:第一個問題是選取的alpha值是否違反KKT條件,若是該alpha值違反了KKT條件則該alpha是不可以做爲優化對象的;第二個問題與SMO優化算法的優化終止條件有關,一般SMO算法會在一個死循環中反覆執行兩個過程,第一個過程是遍歷全部的alpha值,每掃描到一個alpha就將其做爲alpha對的第一個值傳入內循環,同時根據上一段提出的選取準則選擇另外一個alpha。遍歷完一次alpha值以後若alpha值被優化器改變的次數不爲0則本次循環結束同時修改一些標誌量而後進入下一次循環。下一次循環執行第二個過程:遍歷alpha值列表中全部不爲0的值,每掃描到一個不爲0的alpha值以後就將其傳入內循環,而後執行和上面相同的過程。重複執行上述過程,最終,當某次循環遍歷優化全部alpha列表後卻沒有一個alpha值被優化器改變則程序認爲優化任務完成了,程序退出。代碼以下:

 
圖5

以上,就是SMO算法在實現時的一些細節。完整的SMO實現仍是比較複雜的,有不少的小細節須要注意,在這裏就不一一論述了。

相關文章
相關標籤/搜索