支持向量機(support vector machine, 如下簡稱svm)是機器學習裏的重要方法,特別適用於中小型樣本、非線性、高維的分類和迴歸問題。本篇但願在正篇提供一個svm的簡明闡述,附錄則提供一些其餘內容。算法
機器學習的一大任務就是分類(Classification)。以下圖所示,假設一個二分類問題,給定一個數據集,裏面全部的數據都事先被標記爲兩類,能很容易找到一個超平面(hyperplane)將其完美分類。機器學習
然而實際上能夠找到無數個超平面將這兩類分開,那麼哪個超平面是效果最好的呢?ide
要回答這個問題,首先就要定義什麼叫作「效果好」?在面臨機器學習問題的時候廣泛不是很關心訓練數據的分類正確與否,而是關心一個新數據出現的時候其可否被模型正確分類。舉個上學的例子(這裏主要指理科),訓練數據就像是平時的做業和小測驗+答案,新數據則像是期末大考或中高考。做業和小測驗有答案的幫助下作得很好,咱們天然很高興,但捫心自問,作做業和小測驗的目的是爲了在這之中取得好成績嗎?其實本質上不是的,做業和小測驗的目的是爲了訓練咱們的「大腦模型」,以備在期末大考和中高考中取得好成績,繼而走上人生巔峯。因此在作做業和小測驗的時候,重要的是訓練一種解題的思路,使之充分熟練進而能觸類旁通,在真正的大考中靈活地運用這些思路得到好成績。此類狀況用機器學習的說法就是這種「大腦模型」有較好的泛化能力,而相應的「過擬合」則指的是平時作題都會,一到關鍵大考就掉鏈子的行爲。形成此類「過擬合」的緣由當然有不少種,但其中之一恐怕就是平時不訓練清楚思路、總是死記硬背、以致把答案中的「噪音」也學進去了。函數
因此在上述二分類問題中,若是新數據被分類的準確率高,能夠認爲是「效果好」,或者說有較好的泛化能力。所以這裏的問題就轉化爲:上圖中哪個超平面對新數據的分類準確率最高?學習
然而使人沮喪的是,沒人能確切地回答哪一個超平面最好,由於沒人能把真實世界中的全部數據都拿過來測試。從廣義上來講,大部分的理論研究都是對真實狀況的模擬,譬如咱們用人均收入來衡量一個國家的人民生活水平,這裏的人均收入甚至只是一個不太接近的近似,由於不可能把每一個國家中全部人的收入都拿出來一一比較。咱們的大腦善於把繁瑣的細節組合起來並高度抽象化,造成模型和假設,來逼近真實狀況。測試
因此,在這個問題上咱們能作的,也只有提出假設,創建模型,驗證假設。而在svm中,這個假設就是:擁有最大間隔的超平面效果最好。優化
間隔(margin)指的是全部數據點中到這個超平面的最小距離。以下圖所示,實線爲超平面,虛線爲間隔邊界,黑色箭頭爲間隔,即虛線上的點到超平面的距離。能夠看出,虛線上的三個點(2藍1紅)到超平面的距離都是同樣的,實際上只有這三個點共同決定了超平面的位置,於是它們被稱爲「支持向量(support vectors)」,而「支持向量機」也由此而得名。ui
因而咱們來到了svm的核心思想 —— 尋找一個超平面,使其到數據點的間隔最大。緣由主要是這樣的超平面分類結果較爲穩健(robust),對於最難分的數據點(即離超平面最近的點)也能有足夠大的確信度將它們分開,於是泛化到新數據點效果較好。spa
好比上左圖的紅線和紫線雖然能將兩類數據完美分類,但注意到這兩個超平面自己很是靠近數據點。以紫線爲例,圓點爲測試數據,其正確分類爲藍色,但由於超平面到數據點的間隔太近,以致於被錯分紅了黃色。 而上右圖中由於間隔較大,圓點即便比全部藍點更靠近超平面,最終也能被正確分類。blog
定義超平面:
假設二分類問題中正類的標籤爲+1,負類的標籤爲 -1,若要找到一個超平面能正確分類全部樣本點點,且全部樣本點都位於間隔邊界上或間隔邊界外側(如上圖所示),
則知足 ,
該式也可寫爲:
上圖中距離超平面最近的三個點(即支持向量)知足 |wTx+b| = 1,又由樣本空間任意點x到超平面的距離:, 所以全部數據點的最小間隔爲
由於咱們的目標是間隔最大化,所以問題轉化爲:
上述優化問題的解爲間隔最大時的w和b,隨便可求出超平面
爲後面解優化問題方便,上式可重寫爲:
這是一個凸二次規劃(convex quadratic programming)問題,能夠用現成的軟件包計算。然而現實中通常採用對偶算法(dual algorithm),經過求解原始問題(primal problem)的對偶問題(dual problem),來得到原始問題(primal problem)的最優解。這樣作的優勢,一是對偶問題每每更容易求解,二是能天然地引入核函數,進而高效的解決高維非線性分類問題。
拉格朗日乘子法的主要思想是將含有n個變量和k個約束條件的約束優化問題轉化爲含有(n+k)個變量的無約束優化問題。下面闡述其原理 :
考慮一個「原始問題」:
其中w爲優化變量,爲了解這個問題,引入廣義拉格朗日函數:
ɑi和βi爲拉格朗日乘子,ɑi ≥0,考慮下式:
這裏的下標P意爲原始問題(primal problem),若w違反了一些原始問題的約束條件(即存在某個i,使得gi(w) > 0 或 hi(w) ≠ 0),那麼就有
因而,
於是極小化問題 與「原始問題」就是等價的,由於只有當w知足原始優化條件時,
。爲了方便,定義原始問題的最優值爲
接下來考慮「對偶問題」,定義:
這裏的下標D意爲對偶(dual),接着考慮其極大化問題:
該式稱爲原始問題的對偶問題,定義其最優值爲
原始問題和對偶問題的關係能夠用下式表示:
若要知足強對偶性(strong duality),即 ,則需知足Slater條件: f(w)和g(w)都是凸函數,h(w)是仿射函數,而且存在w使得全部的不等式約束g(w)<0成立。
另外由於有不等式約束, 需知足下列Karush-Kuhn-Tucker (KKT)條件 :
這時原始問題和對偶問題的最優解相同,可用解對偶問題替代解原始問題。
在svm中咱們的原始問題:
由拉格朗日乘子法,爲每條約束引進拉格朗日乘子αi ≥ 0,該問題的拉格朗日函數變爲:
原始問題的對偶問題爲:。依據KKT條件,先固定ɑ,令L(w, b, α)對w和b的偏導爲0可得,
,
將上兩式代入拉格朗日函數,便可得對偶問題的新形式:
求出上式中的α後,便可求得原始問題中的w和b。
因而分離超平面就是:
在w和b的求解公式中,注意到w和b由對應於α> 0的樣本點(xi,yi)決定,又由KKT條件中:αi (yi(w•xi+b)-1)=0 , yi(w•xi+b)= ±1,所以這些樣本點(xi,yi)必定在間隔邊界上,它們就是「支持向量」,這些點共同決定了分離超平面。
上一節求解出來的間隔被稱爲「硬間隔(hard margin)「,其能夠將全部樣本點劃分正確且都在間隔邊界以外,即全部樣本點都知足
但硬間隔有兩個缺點:1. 不適用於線性不可分數據集。 2. 對離羣點(outlier)敏感。
好比下圖就沒法找到一個超平面將藍點和紫點徹底分開:
下圖顯示加入了一個離羣點後,超平面發生了很大的變更,最後造成的間隔變得很小,這樣最終的泛化效果可能不會太好。
爲了緩解這些問題,引入了「軟間隔(soft margin)」,即容許一些樣本點跨越間隔邊界甚至是超平面。以下圖中一些離羣點就跨過了間隔邊界。
因而爲每一個樣本點引入鬆弛變量 ,優化問題變爲:
由上式能夠看出:
1. 離羣點的鬆弛變量值越大,點就離得越遠。
2. 全部沒離羣的點鬆弛變量都等於0,即這些點都知足
3. C > 0 被稱爲懲罰參數,即爲scikit-learn中的svm超參數C。當C設的越大,意味着對離羣點的懲罰就越大,最終就會有較少的點跨過間隔邊界,模型也會變得複雜。而C設的越小,則較多的點會跨過間隔邊界,最終造成的模型較爲平滑。
上述優化問題一樣可以使用拉格朗日乘子法:
運用和上一節一樣的方法,分別對w,b, 求偏導,獲得對偶問題:
求出上式中的α後,便可求得原始問題中的w和b,進而得到分離超平面。
前幾節展現的硬間隔和軟間隔svm主要是用於處理線性分類問題,然而現實中不少分類問題是非線性的,以下圖所示,不管怎樣一個線性超平面都沒法很好地將樣本點分類:
因此在此引入核函數(kernel function),構造非線性svm,以下圖所示,左圖使用的是多項式核函數,右圖使用的是高斯核函數,兩者均能將樣本點很好地分類:
核函數的主要做用是將樣本從原始空間映射到一個更高維的特徵空間,使得樣本在這個特徵空間內線性可分。下圖顯示原來在二維空間不可分的兩類樣本點,在映射到三維空間後變爲線性可分 :
但回到原來的二維空間中,決策邊界就變成非線性的了:
核函數是如何將原始空間映射到高維的特徵空間的? 下面先舉個例子:
假設作一個2維到3維的映射,
, 求
和
的內積:
能夠看出轉換後向量的內積等於原向量內積的平方,即
函數被稱爲二次多項核函數,因而若是想計算高維特徵空間的內積
,咱們只需計算核函數,即原向量內積的平方
就能夠了。這樣作的好處有:
下圖也能看出在原始空間和高維空間下計算量的巨大差別:
在上一節中,最後的對偶問題爲:
將原始空間映射到高維特徵空間後變爲:
直接計算 比較複雜,所以若能找到一個核函數
,則最後變爲:
求解後的分離超平面爲:
這樣咱們就能以較小的計算量解決非線性分類問題,甚至都不須要知道低維空間的數據是怎樣映射到高維空間的,只須要在原來的低維空間計算核函數就好了。
因爲高斯核函數是目前最主流的核函數,因此在這裏以其舉例介紹:
高斯核(Gaussian Kernel) 屬於徑向基函數(Radial Basis Function , RBF)的一種。其表達式
也可寫爲 ,範圍爲(0,1],其中
高斯核函數可理解爲兩個樣本點的類似程度,兩點(x, x’)的距離 越大,
越小,則兩個點的類似程度很小,這意味着高斯核具備「局部(local)」特徵,只有相對鄰近的樣本點會對測試點的分類產生較大做用。
,即爲scikit-learn中的svm超參數 γ,γ 越大,意味着兩個點只有至關接近時纔會被判爲類似,這樣決策邊界會變得較爲扭曲,容易過擬合,由於只取決於較少的幾個樣本點。相反,γ 越小,大量的點被判爲近似,於是致使模型變得簡單,容易欠擬合。
線性svm還有另外一種解釋方法,能揭示出其與其餘分類方法(如Logistic Regression)的淵源。線性svm的原始最優化問題:
可重寫爲:
[1-y(w•x+b)]+ 也可寫爲 max(0, 1-y((w•x+b)),該損失函數被稱爲Hinge Loss。
若將式中 [1-y(w•x+b)]+ 替換爲對率損失(logistic loss): log[1+exp(-y(w•x+b))],則成爲了Logistic Regression的損失函數。下圖顯示出兩者的關係:
也便是說,對於svm的hinge loss而言,若是樣本點被正確分類且在間隔邊界以外,即w•x + b >1,則[1-y(w•x+b)] +=0,損失爲0。若樣本點即便被正確分類,但位於超平面和間隔邊界之間,意味着分類正確的確信度不夠高,於是損失不爲0。而對於logistic regression來講,全部的樣本點都會有損失,由於其損失函數
log[1+exp(-y(w•x+b))] 始終不爲0,但當樣本點遠離其決策邊界時,損失就會變得很是接近0。
第二節中提到樣本空間任意點x到超平面的距離爲:,下面給出證實:
上圖中超平面爲: ,假設x1和x2都在超平面上,則有 wTx1+b = wTx2+b, wT(x1-x2)=0,即法向量w與超平面上任意向量正交。
B點爲A點到超平面的投影, 爲垂直於超平面的單位向量,γ爲A到超平面的算術距離,A點爲 x(i),則B點爲
,代入
得:
不管是線性仍是非線性svm,最後都要歸結爲求拉格朗日乘子α的問題。
能夠用通用的二次規劃算法求解,但現實中當訓練樣本容量很大時,每每求解很是低效。因此本節介紹的SMO(sequential minimal optimization)算法就是高效求解上述問題的算法之一。
SMO算法的基本思路是:選擇兩個變量α1和α2,固定其餘全部α,針對這兩個變量構建二次規劃問題,這樣就比原來複雜的優化問題簡化不少。因爲有約束條件 ,固定了其餘α後,可得
。因此α1肯定後,α2便可自動得到,該問題中的兩個變量會同時更新,再不斷選取新的變量進行優化。
SMO採用啓發式的變量選擇方法:第1個變量α1,通常選擇訓練樣本中違反KKT條件最嚴重的樣本點所對應的α。而第2個變量α2則選取與α1的樣本點之間間隔最大的樣本點對應的α,這樣兩者的更新每每會給目標函數帶來更大的變化。
下面來看如何解α1和α2:
因爲其餘變量αi (i=3,4…N)都是固定的,因此有 ,其中
爲常數。又有約束
,且y1,y2只能取值+1或-1,因此α1,α2的直線平行於[0,C]×[0,C]造成的對角線。
這裏採用迭代法,假設上一輪迭代獲得的解是α1old和α2old,沿着約束方向未經剪輯時α2的最優解爲α2new, unclipped。本輪迭代完成後的解爲α1new 和 α2new。
以上左圖爲例,假設要求α2的最小值,令α1等於0,由α1-α2 =k,
則α2new = -k = α2old -α1old。但由於α2new必須在[0,C],若α2old -α1old <0,則α2new 必須等於0,所以α2new的下界 L=max(0, α2old -α1old)。
同理,上界H = min(C, C+α2old -α1old)。
則:
再由 便可求得α1new,這樣α1和α2就同時獲得了更新。
如正片中所述,scikit-learn中svm庫的兩個主要超參數爲C和γ,C和γ越大,則模型趨於複雜,容易過擬合;反之,C和γ越大,模型變得簡單,以下圖所示:
LibSVM的做者,國立臺灣大學的林智仁教授在其一篇小文(A Practical Guide to Support Vector Classification)中提出了svm庫的通常使用流程 :
其中第二步scaling對於svm的總體效果有重大影響。主要緣由爲在沒有進行scaling的狀況下,數值範圍大的特徵會產生較大的影響,進而影響模型效果。
第三步中認爲應優先試驗RBF核,一般效果比較好。但他同時也提到,RBF核並非萬能的,在一些狀況下線性核更加適用。當特徵數很是多,或者樣本數遠小於特徵數時,使用線性核已然足夠,映射到高維空間做用不大,並且只要對C進行調參便可。雖然理論上高斯核的效果不會差於線性核,但高斯核須要更多輪的調參。
並且當樣本量很是大時,線性核的效率要遠高於其餘核函數,在實際問題中這一點可能變得很是重要。scikit-learn的LinearSVC庫計算量和樣本數線性相關,時間複雜度約爲O(m× n),而SVC庫的時間複雜度約爲O(m2×n)到O(m3×n),當樣本量很大時訓練速度會變得很慢,所以使用非線性核的svm不大適合樣本量很是大的情景。下表總結了scikit-learn中的svm分類庫:
[1] 周志華.《機器學習》
[2] 李航.《統計學習方法》
[3] Andrew Ng. cs229 Lecture notes 3
[4] Hastie, etc. An Introduction to Statistical Learning
[5] Aurélien Géron. Hands-On Machine Learning with Scikit-Learn&TensorFlow
[6] Andrew W. Moore. Support Vector Machines
[7] Pang-Ning Tan, etc. Introduction to Data Mining
[8] Chih-Jen Lin, etc. A Practical Guide to Support Vector Classification
[9] Wikipedia, Lagrange multiplier
[10] Wikipedia, Radial basis function kernel
/