支持向量機(SVM,Support Vecor Machine)是一種二分類算法,在集成學習和深度學習火起來之前支持向量機的使用非常廣泛,其分類效果好、適用性廣(線性、非線性都可用),功能真的是很棒棒,下來我們就來梳理一下支持向量機的原理。
1 支持向量機的原理
1)背景
回想一下之前講過的邏輯回歸和感知機,他們的目標都是找到一個將線性可分的數據一分為二的決策超平面:
如上圖所示,決策超平面的一側為正樣本,另一側為負樣本,但是我們可以發現,滿足這個特性的決策超平面并不是唯一的,在有限的線性可分樣本中,正負樣本點之間的間隔使得不同的決策超平面存在,那么如果樣本點繼續增加,這些決策超平面中那個分類效果最好呢?也就是說誰的泛華效果最好呢?——這就是支持向量機要解決的主要問題,也是支持向量機與感知機的主要區別。
2)支持向量
就上面的圖來說,主觀上看哪個超平面的分類泛化能力最強呢?我們認為紅色的那條可能會比較好,這條線距離最近的紅點區域和最近的藍點區域都比較遠,無論是紅點還是藍點,再向靠近超平面的方向增加一些點都沒問題,還可以被這條超平面分的比較開,那兩條虛線就沒有這么好的效果,如下圖所示,我們新增幾個點,可以看出其分類效果的差別:
似乎可以得出這樣的結論:超平面離直線兩邊的數據的間隔越大,對訓練集的數據的局限性或噪聲有最大的容忍能力,也就是所謂的魯棒性。
所以,如果所有的樣本點不只是可以被決策超平面分開,還和超平面保持一定的距離間隔,那么這樣的分類超平面是更優的,支持向量機就是要找到使這個間隔最大的決策超平面(即最大化下圖中的margin)。訓練樣本中和這個超平面距離最近的樣本點被稱為支持向量,如下圖虛線所經過的樣本點即為支持向量:
3)函數間隔、幾何間隔
最大化間隔的思想我們大概了解了,不過要最大化這個間隔首先得量化,怎么量化呢?
支持向量是距離分類超平面最近的樣本點,那么樣本點距離超平面的距離不就是支持向量與分類超平面的距離嗎?在前面的幾篇文章中我們也經常提到樣本點到超平面的距離的度量,這里我們就稍微詳細點說下函數間隔和幾何間隔。
函數間隔
在決策超平面確定的情況下,
能夠表示點
到超平面的距離遠近;
和
是否同號能夠表示分類是否正確,所以可用
來表示分類的正確性及確定性,我們在羅輯回歸和感知機中就有類似的用法,這就是函數間隔的概念,定義函數間隔
為:
幾何間隔
函數間隔雖然可以表示分類的正確性和確定性,但其缺點是只能在一個確定的超平面下比較樣本點到超平面的相對距離,不同參數的超平面條件下計算的距離是不能比較大小的,比如超平面
與
是同一個超平面,樣本點與其真實距離沒有變化,但是函數距離卻翻了一倍,因此我們需要將參數加以約束,使其具備可比性,我們定義幾何間隔:
可見,幾何間隔才是點到超平面的真正距離,上一篇感知機中的損失函數正是幾何間隔的形式,我們支持向量機也使用幾何間隔來表示支持向量到分類超平面的間隔,如上圖中的margin即為兩個支持向量與超平面的幾何間隔之和。
4)線性可分支持向量機模型
綜合上述內容可知,線性可分支持向量機可以表示為:
式中,為與支持向量間隔最大化的分類超平面,可見與感知機是基本一樣的,就多了個間隔最大化的要求。
2 支持向量機模型求解
1)目標函數
通過上述已知,支持向量機是要最大化支持向量與決策超平面之間的幾何間隔,所以目標函數為:
這個式子表示,最大化訓練樣本與超平面的幾何間隔,同時要保證約束條件每個訓練樣本與超平面的幾何距離不小于
,目標函數可以改寫為:
一般我們都取函數間隔為1,為什么呢,因為
的取值不影響最優化問題的解,假設
不為1,就相當于
和
變為了
和
,對目標函數和約束不等式都沒有影響,都是可以約掉的,所以
為1完全沒問題,此時最優化問題變為:
可以轉變為:
(有的地方說要最大化margin同時保證兩類的支持向量到超平面的距離相等,所以有,個人認為這個解釋很牽強,明明優化
的過程中兩類就會互相博弈找到這個最優的超平面)根據下面定義的描述發現,這個凸最優化問題是一個凸二次規劃問題(convex quadratic programming)。
目標函數和約束條件都為變量的線性函數——線性規劃問題;
目標函數為變量的二次函數和約束條件為變量的線性函數——二次規劃問題;
目標函數和約束條件都為非線性函數——非線性規劃問題。
2)對偶問題轉化及求解
在感知機中我們說過,利用對偶問題可以從不同角度看待同一個問題,可能會引入新的參數來幫助我們優化,在約束最優化問題中,常常利用拉格朗日對偶性(Lagrange duality)將原始問題轉換為對偶問題,通過解對偶問題得到原始問題的解。
首先我們的優化目標函數可以使用拉格朗日乘子法(詳細內容見附錄)轉變成拉格朗日函數:
目標函數的優化轉變為:
這一步是什么意思呢,因為約束不等式,所以加號后面整體小于等于0,只有當其取最大值是為0,此時
,即為原目標函數,這個變形稱為廣義拉格朗日函數的極小極大問題,它與原問題是完全等價的,在對偶性中,這個問題被稱為原始問題(Primal problem)。
這個優化函數滿足KKT條件(詳細內容見附錄),可以實現強對偶,即可以通過拉格朗日對偶(Lagrange duality)將其轉化為等價的對偶問題:
所以我們可以先求優化函數極小值對應的和
,再求的極大值對應的拉格朗日乘子系數
:
優化函數取得極小值時,可以用
,而
無所謂,取什么值都不影響優化函數取得極小值,所以可得:
完全是關于參數
的函數,因此:
轉化為:
求出上式取得極小值時對應的向量就可以求出
和
了,這里一般需要用到SMO(Sequential Minimal Optimization,序列最小優化算法) 算法,還是比較復雜的,下面來看看怎么做。
3)序列最小優化算法(SMO)
上述最優化問題是要求解個參數
,其他參數均為已知,有多種算法可以對上述問題求解,比如之前介紹過的次梯度下降應該就可以,但是算法復雜度均很大。序列最小最優化算法(SMO)可以高效的求解上述SVM問題,它把原始求解N個參數二次規劃問題分解成很多個子二次規劃問題分別求解,每個子問題只需要求解兩個參數,方法類似于坐標上升,節省時間成本和降低了內存需求。每次啟發式選擇兩個變量進行優化,不斷循環,直到達到函數最優值。
為什么每次優化兩個參數呢?像坐標下降不是每次只優化一個參數嗎?因為我們這里有個約束, ,如果認為m-1個都是固定值,那么剩下的那個也就確定了,所以選擇每次優化兩個。因為SMO比較復雜,本篇文章就不細說了,這里先這樣提一下SMO,大家知道上面的優化是用SMO計算的就好。
使用SMO算法,我們得到了對應的
,所以:
因為對支持向量有:,所以要根據這個等式解出
需要將支持向量樣本點代入,怎么獲得支持向量呢?KKT條件中的對偶互補條件
,我們已經求出了
,如果
則有
,即樣本點為支持向量,求解
:
顯然,支持向量大多不止一個,對線性可分支持向量機來說,可以證明分類超平面是存在且唯一的,的解也就只有一個,此時用不同的支持向量求出來的
都是相同的,如果數據有噪聲,并不是完全線性可分的,那么為了增加模型的魯棒性,
取所有值的平均值,即假設有n個支持向量,則:
至此,線性可分支持向量機的模型參數就求出來了,模型也就確定了。
4)線性可分支持向量機算法流程
綜合以上全部內容,可以得到線性可分支持向量機的算法流程:
- 輸入:線性可分的樣本
,
為
維特征向量,
;
- 輸出:
,支持向量機模型
。
- 確定目標函數:
- 使用SMO優化目標函數,得到對應的
;
- 根據
找到樣本中的共k=1個支持向量,計算參數
:
- 得到支持向量機模型
。
3 線性可分支持向量機小結
線性可分支持向量機假設數據是線性可分的,這點跟感知機、邏輯回歸是一樣的,就是為了最大化間隔才使得線性可分SVM的理論復雜了這么多,不過對于非線性可分的數據還是沒法處理,怎么辦呢?我們接下來看一下基于軟間隔最大化的線性支持向量機(linear support vector machine)。
附錄
1)拉格朗日乘子法
拉格朗日乘子法是一種尋找多元函數在一組約束下的極值的方法,通過引入拉格朗日乘子,可將有d個變量與k個約束條件的優化問題轉換為具有d+k個變量的無約束優化問題。這種方法引入了一種新的標量未知數,即拉格朗日乘子:它是約束方程的梯度的線性組合中,每個梯度向量的系數。
(1)無約束條件
我們一般對函數變量求導,令導數等于0的點認為是極值點。
(2)等式約束條件
設目標函數為,約束條件為
:
對于這種形式的優化問題我們一般使用拉格朗日乘子法(Lagrange multiplier),當然也能用消元法,不過太麻煩了,先從幾何上理解拉格朗日乘子法(以二維為例),假設要求f(x,y)極值,約束條件,函數
相當于其在三維坐標系下
的等高線,
是一條曲線,試想如果是等高線與曲線的相交點,說明曲線還可以沿著等高線變大或變小的方向走下去,必然不是極值點,所以約束曲線
與某一條等高線
相切時,函數取得極值:
在切點處與
的法向量共線,也就是函數
與
在切點處的梯度平行,有:
因此滿足:
即為約束下目標函數的極值點,也可以寫成我們常見的:
因為對其求導并令導數為0可得:
跟上面的方程組是一樣的,這也是從代數上理解拉格朗日乘子法的方式,因此拉格朗日乘子法可以用來求多元函數在一組等式約束下的極值。
(3)不等式約束條件
設目標函數,不等式約束為
,等式約束條件
:
在不等式約束下,極值點的位置可能有兩種情況,一種是極值點被不等式約束包含,如下左圖所示;另一種是極值點沒有被不等式約束包含,如下右圖所示:
對于第一種情況來說,顯然滿足即可,對于第二種情況,依然是等高線與不等式的邊界相切的點為極值點,可知:
看起來似乎跟等式約束的一樣,其實是有一些區別的,我們知道,等高線在切點處的梯度(也就是切線的法向量)的方向是向著等高線值增大的方向的,對于圖示的凸函數來說,就是如圖所示向外的,而對于不等式,其梯度方向必然是相反朝向的,因為梯度要指向增長的方向,肯定會指向
的方向了:
因此,等式約束的拉格朗日乘子沒有符號限制,而不等式約束的拉格朗日乘子
,所以將初始求極值問題轉化為:
可以寫成我們常見的:
2)KKT條件
仍然是設目標函數,不等式約束為
,等式約束條件
:
通過拉格朗日乘子法我們可以將求有約束的函數極值的問題統一轉化為求解:
這個方程組也就是所謂的KKT條件,前面四項應該都比較好理解,最后一個是什么意思呢?在上一節不等式約束中,第一種情況不等式約束相當于不影響極值點,所以
,在第二種情況中使用不等式的邊界,有
。
主要參考
《統計學習方法》李航
如何理解拉格朗日乘子法和KKT條件?
如何理解拉格朗日乘子法?