什麼是SVM
SVM是Support Vector Machine(支持向量機)的英文縮寫,是上世紀九十年代興起的一種機器學習算法,在目前神經網絡大行其道的情況下依然保持着生命力。有人說現在是神經網絡深度學習的時代了,AI從業者可以不用瞭解像SVM這樣的古董了。姑且不說SVM是否真的已經沒有前途了,僅僅是SVM在數學上優美的推導就值得後來者好好欣賞一番,這也是筆者迄今爲止見過機器學習領域最優美的數學推導。
和大多數二分類算法一樣,SVM算法也是致力於在正例和反例之間找出一個超平面來將它們區分開來,如下圖所示:
圖1
如圖所示,正例用“+”號表示,反例用“-”號表示。從圖中可以看出,正例和反例是線性可分的。學習器的目的就是要學出一條如圖所示的紅色超平面將正例和反例區分開來。這也是其他非SVM分類器的共同目標,即:
而SVM與其它分類器所不同的是它引入了“支持向量”這一概念,反映到圖中也就是紅色的小點所代表的向量。(注:由於筆者作圖時採用的SVM是軟間隔的版本,因此支持向量不像是大多數教科書上採用硬間隔的SVM那樣)由SVM的優化目標我們可以知道:樣本空間中任意一個點x到該超平面的的距離可寫爲:
假設超平面可以完全正確地將所有樣本分類,則對於任意一個樣本(xi,yi)來說都有如下性質(注:樣本的標籤用+1代表正例,-1代表反例):
訓練樣本中使上式成立的樣本稱爲支持向量,兩個異類支持向量到超平面距離之和爲:
上式被稱爲“間隔”。SVM的優化目標是爲了找到這樣一個劃分超平面,該超平面能使間隔最大化,則SVM的優化目標可以表示爲如下形式:
這就是SVM的基本數學表達,接下來就要對SVM問題進行求解。從上面的數學形式可以看出這是一個優化問題,可以使用拉格朗日乘子法求解其對偶問題。由於本文不是專門介紹SVM的,因此忽略掉具體的推導,直接給出SVM的對偶問題表達:
由於採用了拉格朗日乘子法,因此該對偶問題還有一個KKT條件約束,即要求:
以上,就是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分類器。