1. 程式人生 > >機器學習數學原理(7)——SVM支援向量機

機器學習數學原理(7)——SVM支援向量機

機器學習數學原理(7)——SVM支援向量機

這篇博文筆者將預設讀者已經瞭解了最優間隔分類器以及泛化拉格朗日乘子法,如果部分讀者還不是很瞭解,我這裡給出前面一篇博文的連結《機器學習數學原理(6)——最優間隔分類器》。總之,這篇博文將不會再贅述相關的知識,而是直接給出其結論。

由於筆者水平有限,如果讀者發現任何不妥或者錯誤之處,歡迎批評指出。

1 簡介

我們來看看前面最優間隔分類器的前提:線性可分的樣本空間。但是很遺憾的是大部分的需要解決的問題都不是線性可分的樣本空間的問題,因此SVM支援向量機演算法孕育而生。

支援向量機(Support Vector Machine,SVM)

Corinna CortesVapnik等於1995年首先提出的,它在解決小樣本、非線性及高維模式識別中表現出許多特有的優勢,並能夠推廣應用到函式擬合等其他機器學習問題中。
在機器學習中,支援向量機(SVM,還支援向量網路)是與相關的學習演算法有關的監督學習模型,可以分析資料,識別模式,用於分類和迴歸分析。

在機器學習中,SVM是一個非常樸實但十分重要的演算法,甚至有著舉足輕重的地位。很多人都把SVM看做是機器學習中最好的分類演算法。雖然這樣的說法有些不妥,但逐一證明其的重要性。

SVM的核心思想便是將線性不可分的特徵空間對映到一個更加高維的空間使其能夠線性可分,從而在高維特徵空間構建最優間隔分類器實現分類

。接下來便是具體的的推導了。

2 Kernel核函式

要想了解SVM支援向量機演算法,首先得了解核函式(Kernel),但是這裡我們需要知道的是核函式並不僅僅能應用到SVM支援向量機中,還有很多其他的領域也會大量使用核函式的思想。

2.1 核函式的引出

任何方法的產生都是建立在一個問題上的,那麼首先我們來看一下核函式針對的問題。

在上一篇博文中我們說明了最優間隔分類器並且匯出了優化問題的對偶優化問題如下:

當然還得滿足KKT條件。

現在我們來考慮SVM的核心思想將線性不可分的特徵空間對映到一個更加高維的空間,即我們需要將x通過函式對映成另外一個特徵向量φ(x)

,然後在高維的空間使用最優間隔分類器,則式子變為如下:

那麼現在問題便來了,φ(x)的維度可能非常的高,甚至有可能是無限維的,這如果使用計算機進行計算會付出巨大的計算代價,有時候甚至無法計算!

這時候便是核函式的表演舞臺了。我們觀察式子,發現其實我們根本不需要講對映函式φ顯式的求出來,而只需要求出那個內積便可以了,於是這裡定義

K便是核函式。

下面我們來舉個例子幫助讀者更加深刻的理解核函式對於減少運算複雜度的作用。

我們現在以x作為樣本空間來分兩類,x的維度為3。假如我們現在選取的對映函式φ

現在我們來計算內積

這樣一來核函式的計算複雜度只有O(3),而如果直接使用φ來進行內積的話計算複雜度為O(9)(這裡的書寫有些不規範,但讀者領會到意思就行),從而計算複雜度減小了,值得一提的是,當K採用高斯型核函式的時候,對應的φ有無限維(這裡筆者就不給出證明了,有興趣的讀者可以自己查閱資料),而顯然我們無法直接計算φ的內積,則我們可以發現核函式會大大提高計算效率。

這裡筆者給出一些常用的核函式(從網上copy的,筆者還是有點懶的)

剛才所說的高斯型核函式就是圖中的徑向基核函式。

這裡有一種不是很嚴謹的關於核函式的直觀理解,即核函式的值表示了兩個樣本的相似程度。

2.2 核函式的合法性

現在我們已經定義出了核函式,那麼現在便來討論一下核函式的合法性,所謂的合法性即核函式對應的φ是否存在

比如我們這裡給一個比較極端的例子,K=-1,這個顯然是找不到對應的φ的。那麼下面我們便來討論核函式合法的充要條件。

下面我們假設核函式K(x,z)是合法的,同時假設有m個樣本。現在我們定義一個**核函式矩陣(Kernel Matrix)**k(為m*m尺寸),其中位於(i,j)上的元素值為:

現在我們給出任意一個特徵向量z,我們可以發現:

說明k為一個半正定矩陣,同時由核函式K的定義我們可以看出k還是一個對稱矩陣。

同時我們也可以證明反過來依然成立,即核函式矩陣對稱半正定是核函式合法的充要條件。該定理也被稱為Mercer定理

至此我們便將核函式的大概說完了,即現在我們可以在高維的空間非常有效率的計算內積。

3 正則化以及非線性例子

正則化主要是通過增加懲罰項來防止演算法過擬合,防止異常點對分類器進行干擾的一種手段,這裡筆者不準備詳細敘述了,如果感興趣的讀者可以參考下面這篇博文:《正則化方法:L1和L2 regularization、資料集擴增、dropout》。通過正則化後的優化模型變為:

4 SMO演算法

現在我們已經一步一步的將優化問題模型表示了出來:

接下來我們就應該通過演算法來確定α了。通常我們採用的演算法為SMO演算法(Sequential Minimal Optimization),但是為了方便讀者理解這個演算法,我們先來看一下另外一個演算法:座標上升演算法(Coordinate Ascent)

4.1 座標上升演算法

我們現在先來看一個無約束的優化問題:

座標上升演算法的核心思想便是每次只改變一個引數來優化,其餘引數看做常量。寫成虛擬碼形式即為

while(收斂){
    for(int i=1;i<=m;i++){
        αi = argmax W;//通過調節單變數αi使得W最大。
    }
}

引數更新的情況類似於下圖(只有兩個引數的時候):

這個方法很好理解,但是任然有一些細節問題,但筆者不準備詳細敘述了。

4.2 SMO演算法

SMO演算法的思想和座標上升演算法大致相同,SMO演算法可以看做有約束條件的座標上升演算法。我們現在來看看我們的優化模型:

我們可以發現,如果我們想像座標上升演算法一樣的思路進行,有一個很大的問題就是,我們不能只改變一個引數而固定其他引數,因為由於約束條件的存在,當其他引數固定過後剩下的那個引數自然也就固定了,所以現在我們選擇改變兩個引數而固定其他引數。

假設現在我們選擇更新α1和α2。那麼從約束條件我們可以得出:

現在我們來看看優化空間:

可以發現通過優化空間我們可以確定α1的取值範圍,然後我們把α2用α1表示出來然後代入L中我們就可以得到一個單變數的優化問題,剩下的就很容易解決了。下面筆者給出虛擬碼方便讀者理解:

while(收斂){
    選擇更新引數對αi,αj;
    固定其他引數,通過使L取得最大值從而更新αi,αj;
}

也非常的清晰易懂。當然這兒也有很多的細節問題需要讀者自己下來查閱資料了,比如如何選擇更新引數對使得演算法更加高效。

到這裡SVM支援向量機的介紹就基本完了,在實際應用中,SVM支援向量機還分為不同的形式(大部分都是通過正則化方式的不同來分的),故如果用於實際,讀者還需要對SVM進行一個更加深入的學習。