機器學習(六)——支持向量機
概述
支持向量機(Support Vector Machine,SVM)是一個非常強大的分類模型,它曾經被稱爲萬能分類器。這個模型在數學的處理和推導上較爲複雜,本文會在大體上介紹這個模型的數學原理,對於證明細節將不會涉及。
本文主要討論二分類的問題,對於多元分類問題,SVM通常採用OVR的方法,將多分類問題轉化爲多個二元分類問題,具體實現方法與邏輯迴歸中相同,將不再贅述。
模型思路
首先我們考慮一個簡單的情況,我們有一系列含有兩個特徵的樣本,它們分別被分類爲0和1,我們將散點圖繪製出來,可以很自然地想到一個思路:是否可以用一條直線來將平面分成兩部分:一部分全部爲0,一部分全部爲1呢?於是我們畫出這樣的圖像:
![在這裏插入圖片描述]()
這樣可以用一條直線(或是點、平面、超平面)將兩類樣本完全分開的數據在學術上被稱爲線性可分,這條直線(或點、平面、超平面)被稱爲分離超平面。這類模型被稱爲線性支持向量機。
然而,現實情況下的數據往往不是這樣的,在絕大多數情況下,數據都不是線性可分的。這個時候,我們只能將偏差定義爲一個損失函數,然後找到使得損失函數最小的分離超平面。
代數抽象
接下來我們就將這個問題轉化爲代數問題,首先定義假設函數,也就是模型的形式。我們知道在線性支持向量機中,假設函數應當是點、直線、平面、超平面的形式,用一個公式表示出來,就是:
H(w):w⋅x+b=0對於線性可分的數據,我們發現實際上會有無數條直線能夠將兩種類別的數據分割開來,這時,我們怎麼選擇這條直線呢?有這樣的一個原則:我們需要找到一條直線(點、平面、超平面,以下皆用直線指代),使得對於不同類別的、距離這條直線最近的兩個點,到這條直線的距離相等,而且到這條直線的距離之和最大。設這兩個點到分離直線最近的點滿足:
w⋅x+b=±1 這就是上圖中的兩條虛線的直線方程。根據點到直線的距離公式,可以得到這兩個點到分離直線的距離爲:
l=∥w∥1(∥w∥表示向量的模) 這樣我們就能把問題轉化爲數學上的最優化問題:
max2任意X屬於類別1,任意X屬於類別0,∥l∥=∥w∥2w⋅x+b≥1w⋅x+b≤−1 爲了數學上方便處理,我們用y=1表示類別1,用y=−1表示類別0,我們可以方便地把兩個條件合併成一個,同時,因爲損失函數應當是一個最小化問題,通過取倒數再平方,我們可以將最大化問題轉化爲最小化問題:
miny(w⋅x2∥w∥2+b)≥1 2∥w∥就是線性可分情況的損失函數,接下來考慮誤分類的情況,對於SVM來說,分類正確的樣本對損失函數的貢獻應該爲0,分類錯誤或者處在兩條直線之間時,我們放寬上述優化問題的約束條件:
y(w⋅x+b)≥1−ξ移項後將不等號改爲等號,我們就將ξ作爲單個分類錯誤或者處在兩條直線之間的樣本對損失函數的貢獻,將兩種情況統一起來,我們可以得到單個樣本對損失函數的貢獻爲:
max(0,1−y(w⋅x+b))將我們上述的討論綜合起來,統一定義一個支持向量機的損失函數:
L(w)=2∥w∥2+C∑max(0,1−y(w⋅x+b)) 式子中C爲損失係數,是一個超參數,實際上是模型預測損失的權重,損失係數越大,模型就會越“在意”預測錯誤的損失,而輕視兩條虛線間的距離,從而導致虛線之間的距離更小。在實際應用中,對於C的處理與之前討論的超參數沒有什麼區別,一般採用網格搜索法或者根據實際需求來確定取值。
工程求解——拉格朗日對偶
接下來我們來討論怎麼求解SVM的最優化問題,這一段涉及的數學知識較多,我會盡量講述思路而忽略中間的數學推導。
首先來介紹拉格朗日對偶。我們把優化問題寫成一般形式:
mingi(θ)≥hi(θ)=f(θ)0(i=1,2,...,k)0(i=1,2,...,l)在高等數學中,我們學習過拉格朗日乘數法,我們就由拉格朗日乘數法定義拉格朗日函數:
L(θ,α,β)=f(θ)+i∑kαigi(θ)+i∑lβihi(θ)然後我們確定拉格朗日乘數α,β的值,讓L(θ,α,β)最大化,定義:
P(θ)=maxα,βL(θ,α,β)那麼整個最優化問題等價爲一個雙重優化問題(原始問題):
minP(θ)=minθmaxα,βL(θ,α,β)接下來來定義所謂的對偶問題,實際上就是將最大化和最小化過程換一個位置。我們不妨設D(α,β)=minθL(θ,α,β),得到對偶問題爲:
maxα,βD(α,β)=maxα,βminθL(θ,α,β)在滿足某些條件時,原始問題和對偶問題是等價的,我們將條件羅列如下:
- 函數f(θ)和gi(θ)都是凸函數;
- 函數hi(θ)爲仿射變換;
- 存在θ使得對於所有的函數gi都有gi(θ)<0.
回到SVM,在上一部分我們得到了SVM的損失函數,但在損失函數中包含一個在數學上難以處理的max(0,1−y(w⋅x+b)),因此,我們還用ξ代回式子中,將它轉化爲一個帶約束優化問題:
min2∥w∥2+y(w⋅x+b)≥ξ≥C∑ξ1−ξ0我們可以一一驗證上面的條件,發現SVM是滿足拉格朗日對偶的條件的。首先得到拉格朗日函數:
L(w,b,ξ,α,β)=2∥w∥2+C∑ξ−∑α[y(w⋅x+b)−1+ξ]−∑βξ於是對偶函數爲D(α,β)=minw,b,ξL(w,b,ξ,α,β),接下來求解這個函數,令它對三個自變量的偏導爲零:
∂w∂L=0⇒w=∑αyx∂ξ∂L=0⇒C−α−β=0∂b∂L=0⇒∑yα=0根據這三個公式,經過一系列比較複雜的計算,我們就能得到SVM最優化問題的對偶形式:
maxα∑αi−210≤αi≤C∑yiyjαiαj(xi⋅xj);∑αiyi=0預測公式可以寫爲:
yj^=sign(∑αiyi(xi⋅xj)+c)其中sign()爲符號函數。
將模型轉化爲對偶問題能夠讓我們深入地理解模型的訓練過程以及預測過程。並且由於將SVM的預測公式轉化成了對偶形式,也由此催生出了一種非常巧妙的增強SVM擬合能力的方法——核函數。
核函數
在討論核函數的定義之前,我們先來談談前面討論的線性支持向量機的缺點。很明顯的一件事情是我們只能使用直線來分割平面上的點,對於下面這類情況我們就無能爲力:
![在這裏插入圖片描述]()
但我們將它轉換到極座標下,就能夠用一條直線完全分離開。於是我們想到:是否能通過已知的數據構造特徵,從而使得兩類數據線性可分?這是完全合理的,但是存在着一個很重大的問題。如果我們將數據不斷地擴大維度,直接使用擴維後的數據訓練模型,則常常會導致模型的運算複雜度過高,工程上的時間成本過高。
核函數(kernel function)就提供了一個能夠進行數據擴維又不會使得運算過爲複雜的方法。從前面對偶形式的最優化問題可以看出,我們訓練模型時,實際上並不會對所有的特徵一一進行計算,我們只計算兩個向量之間的點積。如果能找到一個擴維方法,使得擴維之後的數據的兩向量的點積能夠方便地運算出來(運用級數的知識),我們就可以達到既擴維,又不會使運算複雜化的效果。
核函數的證明是比較困難的,但好在目前已經找到了許多可供使用的核函數:
線性核函數:多項式核函數:sigmoid核函數:拉普拉斯核函數:高斯核函數:xi⋅xj([γ(xi⋅xj)+coef]n)tanh(γ(xi⋅xj)+coef)exp(−γ∥xi−xj∥)exp(−γ∥xi−xj∥2)其中,後面三個核函數都相當於把數據映射到了無限維空間。式子中γ,coef,n都是超參數。
通過核函數,支持向量機對訓練數據的擬合能力得到了大大的提升,但也帶來了過擬合的問題。對於過擬合問題,我們在這裏不再討論。
小結
在這篇博文中主要介紹了支持向量機這個非常強大的分類模型。我認爲這可能是機器學習中最困難的一部分內容。在下一篇博文中,我將暫時擱置監督學習的內容,轉向機器學習的另一部分——無監督學習。