支持向量機通俗導論(理解SVM的三層境界)
作者:July ;致謝:pluskid、白石、JerryLead。
出處:結構之法算法之道blog。
前言
動筆寫這個支持向量機(support vector machine)是費了不少勁和困難的,原因很簡單,一者這個東西本身就並不好懂,要深入學習和研究下去需花費不少時間和精力,二者這個東西也不好講清楚,盡管網上已經有朋友寫得不錯了(見文末參考鏈接),但在描述數學公式的時候還是顯得不夠。得益於同學白石的數學證明,我還是想嘗試寫一下,希望本文在兼顧通俗易懂的基礎上,真真正正能足以成為一篇完整概括和介紹支持向量機的導論性的文章。
本文在寫的過程中,參考了不少資料,包括《支持向量機導論》、《統計學習方法》及網友pluskid的支持向量機系列等等,於此,還是一篇學習筆記,只是加入了自己的理解和總結,有任何不妥之處,還望海涵。全文宏觀上整體認識支持向量機的概念和用處,微觀上深究部分定理的來龍去脈,證明及原理細節,力保邏輯清晰 & 通俗易懂。
同時,閱讀本文時建議大家盡量使用chrome等瀏覽器,如此公式才能更好的顯示,再者,閱讀時可拿張紙和筆出來,把本文所有定理.公式都親自推導一遍或者直接打印下來(可直接打印網頁版或本文文末附的PDF,享受隨時隨地思考、演算的極致快感),在文稿上演算。
Ok,還是那句原話,有任何問題,歡迎任何人隨時不吝指正 & 賜教,感謝。
導論、從人工智能到機器學習
根據支持向量機導論一書的介紹,人工資能領域的研究者們很早就開始研究了學習問題。Alan Turing在1950年就指出了學習器的思想,以反駁Lady Lovelace的“機器只會做我們指揮它們做的事情”,意思是電腦只會執行人們輸入給它的指令,不具備任何學習能力。而Turing則評論道:學習器的一個重要特征便是,其施教者對於內部實際的運轉過程中在很大程度上的確是無知的,而受教者的行為在一定程度上卻是預測的。僅僅在數年后,初始的學習器便被開發了出來,比如Arthur Samuel的跳棋程序便是強化學習的一個早期例子,Frank Rosenblatt的感知機包含了下一章講討論的系統的許多特征。特別要指出,把學習問題建模使其成為適當假設空間中的搜索問題便是人工智能方法的特點。
學習算法的發展使得它本身成為了人工智能的一個重要的子領域,並最終形成了機器學習這樣一個獨立的學科。而什么是數據挖掘呢?
數據挖掘是機器學習、數據庫和統計學三者結合的產物,數據挖掘首先要確定挖掘的任務或目的,確定了挖掘任務之后,就要決定使用什么樣的挖掘算法,選擇了算法之后便可以實施數據挖掘操作,獲取有用的信息或模式。其實,很多時候,分類可以被稱之為機器學習領域內的一種學習方法,也可以被稱之為數據挖掘領域內的一種算法,兩者之間,並不是井水不犯河水。
機器學習是一個不斷學習發展加深的過程,正如一個讀書人學習SVM的時候,他看書的境界分為三層,如先讀數據挖掘導論,而后他覺講得太淺,於是去讀支持向量機導論,甚而,他覺還是不夠,於是他去讀數據挖掘中的新方法:支持向量機,最后,他又會覺得紙上終覺淺,於是他會嘗試去證明它,再繼續,他會去寫代碼如何實現他,然后到了某一天,他還是覺得不夠,他總覺得這個算法哪里有缺陷,然后他想着怎么才能去優化他,他甚至會幻想某一天,他也能發明創造出這樣一個算法,就好了。
Ok,扯遠了,如上面所述讀書人讀SVM有幾層境界一樣,下面,本文就分三層理解SVM的境界慢慢展開此文。
第一層、了解SVM
1.0、什么是支持向量機SVM
然在進入第一層之前,你只需了解什么是支持向量機SVM就夠了,而要明白什么是SVM,便得從分類說起。
分類作為數據挖掘領域中一項非常重要的任務,目前在商業上應用最多(比如分析型CRM里面的客戶分類模型,客戶流失模型,客戶盈利等等,其本質上都屬於分類問題)。而分類的目的則是學會一個分類函數或分類模型(或者叫做分類器),該模型能吧數據庫中的數據項映射到給定類別中的某一個,從而可以用於預測未知類別。
說實話,上面這么介紹分類可能你不一定內心十分清楚。我來舉個例子吧,比如心臟病的確診中,如果我要完全確診某人得了心臟病,那么我必須要進行一些高級的手段,或者借助一些昂貴的機器,那么若我們沒有那些高科技醫療機器怎么辦?還怎么判斷某人是否得了心臟病呢?
當然了,古代中醫是通過望、聞、問、切“四診”,但除了這些,我們在現代醫學里還是可以利用一些比較容易獲得的臨床指標進行推斷某人是否得了心臟病。如作為一個醫生,他可以根據他以往診斷的病例對很多個病人(假設是500個)進行徹底的臨床檢測之后,已經完全確定了哪些病人具有心臟病,哪些沒有,同時,在這個診斷的過程中,醫生理所當然的記錄了他們的年齡,膽固醇等10多項病人的相關指標。那么,以后,醫生可以根據這些臨床資料,對后來新來的病人通過檢測那10多項年齡、膽固醇等指標,以此就能推斷或者判定病人是否有心臟病,雖說不能達到100%的標准,但也能達到80、90%的正確率,而這一根據以往臨場病例指標分析來推斷新來的病例的技術,即成為分類classification技術。
其實,若叫分類,可能會有人產生誤解,以為凡是分類就是把一些東西或樣例按照類別給區分開來,實際上,分類方法是一個機器學習的方法,分類也成為模式識別,或者在概率統計中成為判別分析問題,或許會讓人們消除此類誤解。
假定是否患有心臟病與病人的年齡和膽固醇水平密切相關,下表對應10個病人的臨床數據(年齡用[x1]表示,膽固醇水平用[x2]表示):

這樣,問題就變成了一個在二維空間上的分類問題,可以在平面直角坐標系中描述如下:根據病人的兩項指標和有無心臟病,把每個病人用一個樣本點來表示,有心臟病者用“+”形點表示,無心臟病者用圓形點,如下圖所示:
如此我們很明顯的看到,是可以在平面上用一條直線把圓點和“+”分開來的。當然,事實上,還有很多線性不可分的情況,下文將會具體描述。
So,本文將要介紹的支持向量機SVM算法便是一種分類方法。
- 所謂支持向量機,顧名思義,分為兩個部分了解,一什么是支持向量(簡單來說,就是支持 or 支撐平面上把兩類類別划分開來的超平面的向量點,下文將具體解釋),二這里的“機”是什么意思。我先來回答第二點:這里的“機(machine,機器)”便是一個算法。在機器學習領域,常把一些算法看做是一個機器,如分類機(當然,也叫做分類器),而支持向量機本身便是一種監督式學習的方法(什么是監督學習與非監督學習,請參見第一篇),它廣泛的應用於統計分類以及回歸分析中。
對於不想深究SVM原理的同學(比如就只想看看SVM是干嘛的),那么,了解到這里便足夠了,不需上層。而對於那些喜歡深入研究一個東西的同學,甚至究其本質的,咱們則還有很長的一段路要走,萬里長征,咱們開始邁第一步吧(相信你能走完)。
1.1、線性分類
OK,在講SVM之前,咱們必須先弄清楚一個概念:線性分類器。
-
這里我們考慮的是一個兩類的分類問題,數據點用 x 來表示,這是一個 n 維向量,而類別用 y 來表示,可以取 1 或者 -1 ,分別代表兩個不同的類。一個線性分類器就是要在 n 維的數據空間中找到一個超平面,其方程可以表示為:
wTx+b=0
但即使我已經給出了線性分類器的定義及公式,相信,仍然是有相當一部分讀者是不知所謂的超平面(w,b)中w,和b所指是何物的?但本文盡量不留遺漏,以期盡量將有必要了解的技術細節原原本本的和盤托出,如下:
- 上面已經說過,兩類問題的分類通常用一個實值函數f:
(R^n即指n唯平面)按照這樣的方式操作:當f(x)>=0,輸入想x=(x1,...xn)‘賦給正類,否則賦給負類,考慮當f(x),x屬於X是線性函數的情況,函數可以寫為:f(x)=<w,b> + b。這個式子的幾何解釋是,<w,x>+b=0所定義的超平面講輸入空間X(各種點)分為兩半。
- 也就是說,超平面是維數為n-1的仿射子空間,它將空間分為兩部分,這兩部分對應輸入中兩類不同的點,對應着超平面上面的正區域和超平面下面的負區域,當b的值變化時,超平面平行於自身移動,示意圖如下(注意體會途中w,b的幾何意義,我之前曾以為在實際應用SVM的過程中,所謂調參就是調這里的w,b,而后意識到其實不是如此,而是如Wind所說的,核函數的選擇、懲罰因子C的大小,或者比如采用高斯核函數的時候,參數主要是核函數的\gamma變量以及權衡系數C):
1.2、線性分類的一個例子
來理論可能讀者看不懂,咱們來直接舉一個例子吧,且舉最簡單的例子,一個二維平面(一個超平面,在二維空間中的例子就是一條直線),如下圖所示,平面上有兩種不同的點,分別用兩種不同的顏色表示,一種為紅顏色的點,另一種則為藍顏色的點,紅顏色的線表示一個可行的超平面。
從上圖中我們可以看出,這條紅顏色的線把紅顏色的點和藍顏色的點分開來了。而這條紅顏色的線就是我們上面所說的超平面,而現在的情況是,這個所謂的超平面的的確確便把這兩種不同顏色的點分隔開來,換句話說,事實上,是存在這樣一個超平面可以把兩類數據分隔開來的,比如,在超平面一邊的數據點所對應的 y 全是 -1 ,而在另一邊全是 1 。具體來說,我們可以令 f(x)=wTx+b ,顯然,如果 f(x)=0 ,那么 x 是位於超平面上的點。我們不妨要求對於所有滿足 f(x)<0 的點,其對應的 y 等於 -1 ,而 f(x)>0 則對應 y=1 的數據點。
- 當然,有些時候(或者說大部分時候)數據並不是線性可分的,這個時候滿足這樣條件的超平面就根本不存在(不過關於如何處理這樣的問題我們后面會講),這里先從最簡單的情形開始推導,就假設數據都是線性可分的,亦即這樣的超平面是存在的。
更進一步,我們在進行分類的時候,將數據點 x代入 f(x) 中,如果得到的結果小於 0 ,則賦予其類別 -1 ,如果大於 0 則賦予類別 1 。如果 f(x)=0,則很難辦了,分到哪一類都不是(后續會說明此種情況)。
1.3、Functional margin與Geometrical margin
從幾何直觀上來說,由於超平面是用於分隔兩類數據的,越接近超平面的點越“難”分隔,因為如果超平面稍微轉動一下,它們就有可能跑到另一邊去。反之,如果是距離超平面很遠的點,例如圖中的右上角或者左下角的點,則很容易分辯出其類別。
結合上圖,我們直接定義 functional margin 為 γˆ=y(wTx+b)=yf(x),注意前面乘上類別 y 之后可以保證這個 margin 的非負性(因為 f(x)<0 對應於 y=−1 的那些點),而點到超平面的距離定義為 geometrical margin 。
- 對 functional margin 為 γˆ=y(wTx+b)=yf(x)的解釋:上面直接給出它的定義並沒有說明來由,其實這是有來頭的。一般來說,我們定義:樣例(xi,yi)對應於超平面(w,b)的函數的間隔量為:γˆ=y(wTx+b)。注意,γˆ>0意味着(xi,yi)被正確分類,超平面(w,b)對應於訓練集S的函數的間隔分布就是訓練集S中樣例的間隔分布。有時,所謂間隔分布的最小值指超平面(w,b)對應於訓練集S的函數的間隔。最終,訓練集S的間隔是在所有超平面上的最大幾何間隔,實現這個最大間隔的超平面稱之為最大間隔超平面,對於線性可分的訓練集來說,間隔的值都講是正值。下圖是xi,xj分別到超平面的幾個間隔距離γi,γj:
下面不妨來看看functional margin與geometrical margin二者之間的關系。如圖所示,對於一個點 x ,令其垂直投影到超平面上的對應的為 x0 ,由於 w 是垂直於超平面的一個向量,我們有
又由於 x0 是超平面上的點,滿足 f(x0)=0 ,代入超平面的方程即可算出(別忘了,上面γˆ的定義,γˆ=y(wTx+b)=yf(x)): γ
- OK,我來推到下上述式子的代入過程:因為f(x)=w^T+b,把x=x0+r*w/||w||代入f(x)得,f(x)=f(x。+r *w / ||w||) = w^T(x0+ r* w/ ||w||) +b = w^T*x0 + w^T*r*w/ ||w|| + b = w^T*r*w/||w||=r*||w||,所以γ=f(x)/||w||=(w^T*b)/||w||。證畢。
不過,這里的 γ 是帶符號的,我們需要的只是它的絕對值,因此類似地,也乘上對應的類別 y即可,因此實際上我們定義 geometrical margin 為:
- 因為γˆ=y(wTx+b)=yf(x),所以γ˜=yγ=(y*f(x))/||w||=γˆ/||w||。
1.4、最大間隔分類器Maximum Margin Classifier的定義
通過上文,我們已經很明顯的看出,functional margin 和 geometrical margin 相差一個 ∥w∥ 的縮放因子。按照我們前面的分析,對一個數據點進行分類,當它的 margin 越大的時候,分類的 confidence 越大。對於一個包含 n 個點的數據集,我們可以很自然地定義它的 margin 為所有這 n 個點的 margin 值中最小的那個。於是,為了使得分類的 confidence 高,我們希望所選擇的 hyper plane 能夠最大化這個 margin 值。
不過這里我們有兩個 margin 可以選,不過 functional margin 明顯是不太適合用來最大化的一個量,因為在 hyper plane 固定以后,我們可以等比例地縮放 w 的長度和 b 的值,這樣可以使得 f(x)=wTx+b 的值任意大,亦即 functional margin γˆ 可以在 hyper plane 保持不變的情況下被取得任意大,而 geometrical margin 則沒有這個問題,因為除上了 ∥w∥ 這個分母,所以縮放 w 和 b 的時候 γ˜ 的值是不會改變的,它只隨着 hyper plane 的變動而變動,因此,這是更加合適的一個 margin 。這樣一來,我們的 maximum margin classifier 的目標函數即定義為
當然,還需要滿足一些條件,根據 margin 的定義,我們有
其中 γˆ=γ˜∥w∥ ,根據我們剛才的討論,即使在超平面固定的情況下,γˆ 的值也可以隨着 ∥w∥ 的變化而變化。由於我們的目標就是要確定超平面,因此可以把這個無關的變量固定下來,固定的方式有兩種:一是固定 ∥w∥ ,當我們找到最優的 γ˜ 時 γˆ 也就可以隨之而固定;二是反過來固定 γˆ ,此時 ∥w∥ 也可以根據最優的 γ˜ 得到。處於方便推導和優化的目的,我們選擇第二種,令 γˆ=1 ,則我們的目標函數化為:
通過求解這個問題,我們就可以找到一個 margin 最大的 classifier ,如下圖所示,中間的紅色線條是 Optimal Hyper Plane ,另外兩條線到紅線的距離都是等於 γ˜ 的( γ˜ 便是上文所定義的geometrical margin):
到此,算是完成了 Maximum Margin Classifier 的介紹,通過最大化 margin ,我們使得該分類器對數據進行分類時具有了最大的 confidence 。OK,可能你還是不很清楚:這個最大分類間隔期到底是用來干嘛的呢?很簡單,SVM 通過使用最大分類間隙Maximum Margin Classifier 來設計決策最優分類超平面,以獲得良好的推廣能力。
很快,你就會發現,用SVM 實現主動學習, 采取何種采樣算法是關鍵, 如何選擇新的樣本進行評價直接關系到整個算法的性能. 另外, 交互SVM 法需要一些初始樣本進行最初分類器的設計, 一般可以通過先驗知識或隨機采樣得到. 例如, 在文本分類中, 可以通過關鍵詞匹配的方法進行挑選。
通過上文的介紹,我想你已經清楚SVM具體算法流程,如下所示:
- 根據初始條件構造初始訓練樣本集, 保證至少包含有一個正例樣本和一個負例樣本;
- 根據已知訓練樣本集尋找最優分類超平面, 設計SVM 分類器;
- 如果與分界面鄰近的縫隙中仍有樣本點, 則選擇離分類邊界最近的樣本進行評價, 將該樣本加入訓練樣本集, 並回到第2 步;
- 從全部訓練樣本中重復隨機選擇一個樣本進行評價, 並將該樣本加入訓練集(對已評價過的樣本只計數, 不用再次評價) , 利用分類器對樣本進行評價, 若分類器的評價結果與真實評價不一致, 則回到第2 步;
- 重復第4 步, 若連續N 次評價一致, 算法停止.
So,對於什么是Support Vector Machine ,我們可以先這樣理解,如上圖所示,我們可以看到 hyper plane 兩邊的那個 gap 分別對應的兩條平行的線(在高維空間中也應該是兩個 hyper plane)上有一些點,顯然兩個 hyper plane 上都會有點存在,否則我們就可以進一步擴大 gap ,也就是增大 γ˜ 的值了。這些點,就叫做 support vector。
1.5、到底什么是Support Vector
上節,我們介紹了Maximum Margin Classifier,但並沒有具體闡述到底什么是Support Vector,本節,咱們來重點闡述這個概念。咱們不妨先來回憶一下上次最后一張圖:
可以看到兩個支撐着中間的 gap 的超平面,它們到中間的純紅線 separating hyper plane 的距離相等,即我們所能得到的最大的 geometrical margin γ˜ 。而“支撐”這兩個超平面的必定會有一些點,而這些“支撐”的點便叫做支持向量Support Vector。
很顯然,由於這些 supporting vector 剛好在邊界上,所以它們是滿足 y(wTx+b)=1 (還記得我們把 functional margin 定為 1 了嗎?上節中:“處於方便推導和優化的目的,我們選擇第二種,令 γˆ=1”),而對於所有不是支持向量的點,也就是在“陣地后方”的點,則顯然有 y(wTx+b)>1 。事實上,當最優的超平面確定下來之后,這些后方的點就完全成了路人甲了,它們可以在自己的邊界后方隨便飄來飄去都不會對超平面產生任何影響。這樣的特性在實際中有一個最直接的好處就在於存儲和計算上的優越性,例如,如果使用 100 萬個點求出一個最優的超平面,其中是 supporting vector 的有 100 個,那么我只需要記住這 100 個點的信息即可,對於后續分類也只需要利用這 100 個點而不是全部 100 萬個點來做計算。(當然,通常除了 K-Nearest Neighbor 之類的 Memory-based Learning 算法,通常算法也都不會直接把所有的點記憶下來,並全部用來做后續 inference 中的計算。不過,如果算法使用了 Kernel 方法進行非線性化推廣的話,就會遇到這個問題了。Kernel 方法在第三節介紹)。
1.6、SVM的簡化版SMO算法
上面講得有點散亂,接下來,我引用一位網友的比較簡潔連貫的語言總結下SVM的簡化版SMO算法,如下(如果你暫時不是看得很懂,沒關系,本文剩下部分會進一步闡釋):
一個SVM簡化版SMO算法的目的無非是找出一個函數f(x),這個函數能讓我們把輸入的數據x進行分類。既然是分類肯定需要一個評判的標准,比如分出來有兩種情況A和B,那么怎么樣才能說x是屬於A類的,或不是B類的呢?就是需要有個邊界,就好像兩個國家一樣有邊界,如果邊界越明顯,則就越容易區分,因此,我們的目標是最大化邊界的寬度(或者如上問1.4節所說的最大間隔分類器),使得非常容易的區分是A類還是B類。
在SVM中,要最大化邊界則需要最小化這個數值:
(注,這個式子等價於下文2.4節中的
)
- w:是參量,值越大邊界越明顯
- C代表懲罰系數,即如果某個x是屬於某一類,但是它偏離了該類,跑到邊界上后者其他類的地方去了,C越大表明越不想放棄這個點,邊界就會縮小
代表:松散變量
但問題似乎還不好解,又因為SVM是一個凸二次規划問題,凸二次規划問題有最優解,於是問題轉換成下列形式(KKT條件):
上面的ai是拉格朗日乘子(問題通過拉格朗日乘法數來求解):
- 對於(a)的情況,表明ai是正常分類,在邊界內部(我們知道正確分類的點yi*f(xi)>=0)
- 對於(b)的情況,表明了ai是支持向量,在邊界上
- 對於(c)的情況,表明了ai是在兩條邊界之間
而最優解需要滿足KKT條件,即需要(a)(b)(c)條件都滿足。但若有以下幾種情況出現將會出現不滿足:
- yiui>=1但是ai>0則是不滿足的而原本ai=0
- yiui=1但是ai=0或者ai=C則表明不滿足的,而原本應該是0<ai<C
- yiui<=1但是ai<C則是不滿足的,而原本ai=C
所以要找出不滿足KKT的這些ai,並更新這些ai,但這些ai又受到另外一個約束,即
因此,我們通過另一個方法,即同時更新ai和aj,滿足以下等式
就能保證和為0的約束。
同時,利用yiai+yjaj=常數,消去ai,可得到一個關於單變量aj的一個凸二次規划問題,不考慮其約束0<=aj<=C,可以得其解為:
這里表示舊值,然后考慮約束0<=aj<=C可得到a的解析解為:
對於
那么如何求得ai和aj呢?
對於ai,即第一個乘子,可以通過剛剛說的那幾種不滿足KKT的條件來找,第二個乘子aj可以找滿足條件
b的更新:
在滿足條件:下更新b。
最后更新所有ai,y和b,這樣模型就出來了,然后通過函數:
輸入是x,是一個數組,組中每一個值表示一個特征。
輸出是A類還是B類(正類還是負類)。SVM的簡單實現的話,可以看看這里(本節的總結也來自它)。
OK,到此為止,算是了解到了SVM的第一層,對於那些只關心怎么用SVM的同學便已足夠,不必再更進一層深究其更深的原理。
第二層、深入SVM
2.1、從線性可分到線性不可分
當然,除了在上文中所介紹的從幾何直觀上之外,支持向量的概念也可以從其優化過程的推導中得到。雖然上文1.4節給出了目標函數,卻沒有講怎么來求解。現在就讓我們來處理這個問題。回憶一下之前得到的目標函數:
這個問題等價於(在這里加上平方,一個系數,顯然這兩個問題是等價的):
- 到這個形式以后,就可以很明顯地看出來,它是一個凸優化問題,或者更具體地說,它是一個二次優化問題——目標函數是二次的,約束條件是線性的。這個問題可以用任何現成的 QP (Quadratic Programming) 的優化包進行求解。所以,我們的問題到此為止就算全部解決了。
- 雖然這個問題確實是一個標准的 QP 問題,但是它也有它的特殊結構,通過 Lagrange Duality 變換到對偶變量 (dual variable) 的優化問題之后,可以找到一種更加有效的方法來進行求解——這也是 SVM 盛行的一大原因,通常情況下這種方法比直接使用通用的 QP 優化包進行優化要高效得多。此外,在推導過程中,許多有趣的特征也會被揭露出來,包括剛才提到的 supporting vector 的問題。
至於上述提到,關於什么是Lagrange duality,簡單地來說,通過給每一個約束條件加上一個 Lagrange multiplier,我們可以將它們融和到目標函數里去
然后我們令
、
容易驗證,當某個約束條件不滿足時,例如 yi(wTxi+b)<1,那么我們顯然有 θ(w)=∞(只要令 αi=∞ 即可)。而當所有約束條件都滿足時,則有 θ(w)=12∥w∥2 , 亦即我們最初要最小化的量。因此,在要求約束條件得到滿足的情況下最小化 12∥w∥2 實際上等價於直接最小化 θ(w) (當然,這里也有約束條件,就是 αi≥0,i=1,…,n) ,因為如果約束條件沒有得到滿足,θ(w) 會等於無窮大,自然不會是我們所要求的最小值。具體寫出來,我們現在的目標函數變成了:
這里用 p∗ 表示這個問題的最優值,這個問題和我們最初的問題是等價的。不過,現在我們來把最小和最大的位置交換一下:
當然,交換以后的問題不再等價於原問題,這個新問題的最優值用 d∗ 來表示。並,我們有 d∗≤p∗ ,這在直觀上也不難理解,最大值中最小的一個總也比最小值中最大的一個要大吧! 總之,第二個問題的最優值 d∗ 在這里提供了一個第一個問題的最優值 p∗ 的一個下界,在滿足某些條件的情況下,這兩者相等,這個時候我們就可以通過求解第二個問題來間接地求解第一個問題。具體來說,就是要滿足 KKT 條件,這里暫且先略過不說,直接給結論:我們這里的問題是滿足 KKT 條件的,因此現在我們便轉化為求解第二個問題。
首先要讓 L 關於 w 和 b 最小化,我們分別令 ∂L/∂w 和 ∂L/∂b 等於零:
帶回 L 得到:
此時我們得到關於 dual variable α 的優化問題:
如前面所說,這個問題有更加高效的優化算法,不過具體方法在這里先不介紹,讓我們先來看看推導過程中得到的一些有趣的形式。首先就是關於我們的 hyper plane ,對於一個數據點 x 進行分類,實際上是通過把 x 帶入到 f(x)=wTx+b 算出結果然后根據其正負號來進行類別划分的。而前面的推導中我們得到
w=∑ni=1αiyixi ,
因此分類函數[1]為:
這里的形式的有趣之處在於,對於新點 x的預測,只需要計算它與訓練數據點的內積即可(⋅,⋅表示向量內積),這一點至關重要,是之后使用 Kernel 進行非線性推廣的基本前提。此外,所謂 Supporting Vector 也在這里顯示出來——事實上,所有非 Supporting Vector 所對應的系數 α 都是等於零的,因此對於新點的內積計算實際上只要針對少量的“支持向量”而不是所有的訓練數據即可。
為什么非支持向量對應的 α 等於零呢?直觀上來理解的話,就是這些“后方”的點——正如我們之前分析過的一樣,對超平面是沒有影響的,由於分類完全有超平面決定,所以這些無關的點並不會參與分類問題的計算,因而也就不會產生任何影響了。這個結論也可由剛才的推導中得出,回憶一下我們剛才通過 Lagrange multiplier 得到的目標函數:
注意到如果 xi 是支持向量的話,上式中紅顏色的部分是等於 0 的(因為支持向量的 functional margin 等於 1 ),而對於非支持向量來說,functional margin 會大於 1 ,因此紅顏色部分是大於零的,而 αi 又是非負的,為了滿足最大化,αi 必須等於 0 。這也就是這些非 Supporting Vector 的點的局限性。
把上述所有這些東西整合起來,便得到了一個maximum margin hyper plane classifier,這就是所謂的支持向量機(Support Vector Machine)。當然,到目前為止,我們的 SVM 還比較弱,只能處理線性的情況,不過,在得到了 dual 形式之后,通過 Kernel 推廣到非線性的情況就變成了一件非常容易的事情了。
2.2、核函數Kernel
咱們首先給出核函數的來頭:
- 在上文中,我們已經了解到了SVM處理線性可分的情況,而對於非線性的情況,SVM 的處理方法是選擇一個核函數 κ(⋅,⋅) ,通過將數據映射到高維空間,來解決在原始空間中線性不可分的問題。由於核函數的優良品質,這樣的非線性擴展在計算量上並沒有比原來復雜多少,這一點是非常難得的。當然,這要歸功於核方法——除了 SVM 之外,任何將計算表示為數據點的內積的方法,都可以使用核方法進行非線性擴展。
也就是說,Minsky和Papert早就在20世紀60年代就已經明確指出線性學習器計算能力有限。為什么呢?因為總體上來講,現實世界復雜的應用需要有比線性函數更富有表達能力的假設空間,也就是說,目標概念通常不能由給定屬性的簡單線性函數組合產生,而是應該一般地尋找待研究數據的更為一般化的抽象特征。
而下文我們將具體介紹的核函數則提供了此種問題的解決途徑,從下文你將看到,核函數通過把數據映射到高維空間來增加第一節所述的線性學習器的能力,使得線性學習器對偶空間的表達方式讓分類操作更具靈活性和可操作性。我們知道,訓練樣例一般是不會獨立出現的,它們總是以成對樣例的內積形式出現,而用對偶形式表示學習器的優勢在為在該表示中可調參數的個數不依賴輸入屬性的個數,通過使用恰當的核函數來替代內積,可以隱式得將非線性的訓練數據映射到高維空間,而不增加可調參數的個數(當然,前提是核函數能夠計算對應着兩個輸入特征向量的內積)。
- 首先使用一個非線性映射將數據變換到一個特征空間F,
- 然后在特征空間使用線性學習器分類。

2.2.1、如何處理非線性數據
在2.1節中我們介紹了線性情況下的支持向量機,它通過尋找一個線性的超平面來達到對數據進行分類的目的。不過,由於是線性方法,所以對非線性的數據就沒有辦法處理了。舉個例子來說,則是如下圖所示的兩類數據,分別分布為兩個圓圈的形狀,這樣的數據本身就是線性不可分的,你准備如何把這兩類數據分開呢(下文將會有一個相應的三維空間圖)?
上圖所述的這個數據集,就是用兩個半徑不同的圓圈加上了少量的噪音生成得到的,所以,一個理想的分界應該是一個“圓圈”而不是一條線(超平面)。如果用 X1 和 X2 來表示這個二維平面的兩個坐標的話,我們知道一條二次曲線(圓圈是二次曲線的一種特殊情況)的方程可以寫作這樣的形式:
注意上面的形式,如果我們構造另外一個五維的空間,其中五個坐標的值分別為 Z1=X1, Z2=X21, Z3=X2, Z4=X22, Z5=X1X2,那么顯然,上面的方程在新的坐標系下可以寫作:
關於新的坐標 Z ,這正是一個 hyper plane 的方程!也就是說,如果我們做一個映射 ϕ:R2→R5 ,將 X 按照上面的規則映射為 Z ,那么在新的空間中原來的數據將變成線性可分的,從而使用之前我們推導的線性分類算法就可以進行處理了。這正是 Kernel 方法處理非線性問題的基本思想。
2.2.2、特征空間的隱式映射:核函數
再進一步描述 Kernel 的細節之前,不妨再來看看這個例子映射過后的直觀例子。當然,你我可能無法把 5 維空間畫出來,不過由於我這里生成數據的時候就是用了特殊的情形,具體來說,我這里的超平面實際的方程是這個樣子(圓心在 X2 軸上的一個正圓):
因此我只需要把它映射到 Z1=X21, Z2=X22, Z3=X2 這樣一個三維空間中即可,下圖即是映射之后的結果,將坐標軸經過適當的旋轉,就可以很明顯地看出,數據是可以通過一個平面來分開的:
現在讓我們再回到 SVM 的情形,假設原始的數據時非線性的,我們通過一個映射 ϕ(⋅) 將其映射到一個高維空間中,數據變得線性可分了,這個時候,我們就可以使用原來的推導來進行計算,只是所有的推導現在是在新的空間,而不是原始空間中進行。當然,推導過程也並不是可以簡單地直接類比的,例如,原本我們要求超平面的法向量 w ,但是如果映射之后得到的新空間的維度是無窮維的(確實會出現這樣的情況,比如后面會提到的 高斯核Gaussian Kernel ),要表示一個無窮維的向量描述起來就比較麻煩。於是我們不妨先忽略過這些細節,直接從最終的結論來分析,回憶一下,我們上一次2.1節中得到的最終的分類函數[1]是這樣的:
現在則是在映射過后的空間,即:
而其中的 α 也是通過求解如下 dual 問題而得到的:
這樣一來問題就解決了嗎?似乎是的:拿到非線性數據,就找一個映射 ,然后一股腦把原來的數據映射到新空間中,再做線性 SVM 即可。不過事實上沒有這么簡單!其實剛才的方法稍想一下就會發現有問題:在最初的例子里,我們對一個二維空間做映射,選擇的新空間是原始空間的所有一階和二階的組合,得到了五個維度;如果原始空間是三維,那么我們會得到 19 維的新空間,這個數目是呈爆炸性增長的,這給
的計算帶來了非常大的困難,而且如果遇到無窮維的情況,就根本無從計算了。所以就需要 Kernel 出馬了。
不妨還是從最開始的簡單例子出發,設兩個向量 和
,而
即是到前面說的五維空間的映射,因此映射過后的內積為:














































另外,我們又注意到:


















































二者有很多相似的地方,實際上,我們只要把某幾個維度線性縮放一下,然后再加上一個常數維度,具體來說,上面這個式子的計算結果實際上和映射






































之后的內積 的結果是相等的(自己驗算一下)。區別在於什么地方呢?
- 一個是映射到高維空間中,然后再根據內積的公式進行計算;
- 而另一個則直接在原來的低維空間中進行計算,而不需要顯式地寫出映射后的結果。
回憶剛才提到的映射的維度爆炸,在前一種方法已經無法計算的情況下,后一種方法卻依舊能從容處理,甚至是無窮維度的情況也沒有問題。
我們把這里的計算兩個向量在隱式映射過后的空間中的內積的函數叫做核函數 (Kernel Function) ,例如,在剛才的例子中,我們的核函數為:





















核函數能簡化映射空間中的內積運算——剛好“碰巧”的是,在我們的 SVM 里需要計算的地方數據向量總是以內積的形式出現的。對比剛才我們上面寫出來的式子,現在我們的分類函數[2]為:


















其中 由如下 dual 問題計算而得:

































































這樣一來計算的問題就算解決了,避開了直接在高維空間中進行計算,而結果卻是等價的!當然,因為我們這里的例子非常簡單,所以我可以手工構造出對應於 的核函數出來,如果對於任意一個映射,想要構造出對應的核函數就很困難了。
最理想的情況下,我們希望知道數據的具體形狀和分布,從而得到一個剛好可以將數據映射成線性可分的 ,然后通過這個
得出對應的
進行內積計算。然而,第二步通常是非常困難甚至完全沒法做的。不過,由於第一步也是幾乎無法做到,因為對於任意的數據分析其形狀找到合適的映射本身就不是什么容易的事情,所以,人們通常都是“胡亂”選擇映射的,所以,根本沒有必要精確地找出對應於映射的那個核函數,而只需要“胡亂”選擇一個核函數即可——我們知道它對應了某個映射,雖然我們不知道這個映射具體是什么。由於我們的計算只需要核函數即可,所以我們也並不關心也沒有必要求出所對應的映射的具體形式。
當然,說是“胡亂”選擇,其實是誇張的說法,因為並不是任意的二元函數都可以作為核函數,所以除非某些特殊的應用中可能會構造一些特殊的核(例如用於文本分析的文本核,注意其實使用了 Kernel 進行計算之后,其實完全可以去掉原始空間是一個向量空間的假設了,只要核函數支持,原始數據可以是任意的“對象”——比如文本字符串),通常人們會從一些常用的核函數中選擇(根據問題和數據的不同,選擇不同的參數,實際上就是得到了不同的核函數),例如:
- 多項式核
,顯然剛才我們舉的例子是這里多項式核的一個特例(
)。雖然比較麻煩,而且沒有必要,不過這個核所對應的映射實際上是可以寫出來的,該空間的維度是
,其中
是原始空間的維度。
- 高斯核
,這個核就是最開始提到過的會將原始空間映射為無窮維空間的那個家伙。不過,如果
選得很大的話,高次特征上的權重實際上衰減得非常快,所以實際上(數值上近似一下)相當於一個低維的子空間;反過來,如果
選得很小,則可以將任意的數據映射為線性可分——當然,這並不一定是好事,因為隨之而來的可能是非常嚴重的過擬合問題。不過,總的來說,通過調控參數
,高斯核實際上具有相當高的靈活性,也是使用最廣泛的核函數之一。
- 線性核
,這實際上就是原始空間中的內積。這個核存在的主要目的是使得“映射后空間中的問題”和“映射前空間中的問題”兩者在形式上統一起來了。
2.2.3、核函數的直白總結
- 線性的模型是說,希望找到一個分類器f,使得f(x)=y ,注意,這里是在原始的特征空間里面直接做分類
- 非線性的模型是說,我能不能找到一個非線性的映射函數phy() ,先把特征線性x映射到一個新的空間去,然后在那分類 ,那么就是找個新的函數g,使得g( phy(x) )=y,這里phy(x)就是把x從原始空間經過非線性的映射到了新的空間 ,那么一般在求解分類器g的時候,需要計算新的空間里面的內積 《phy(x1),phy(x2),而之所以要計算內積,是因為分類器g的求解,最后一般轉化為內積《phy(x1),phy(x2)》的表達式,所以知道了內積,才能求得分類器的解。
2.3、使用松弛變量處理 outliers 方法
在本文第一節最開始討論支持向量機的時候,我們就假定,數據是線性可分的,亦即我們可以找到一個可行的超平面將數據完全分開。后來為了處理非線性數據,在上文2.2節使用 Kernel 方法對原來的線性 SVM 進行了推廣,使得非線性的的情況也能處理。雖然通過映射 將原始數據映射到高維空間之后,能夠線性分隔的概率大大增加,但是對於某些情況還是很難處理。例如可能並不是因為數據本身是非線性結構的,而只是因為數據有噪音。對於這種偏離正常位置很遠的數據點,我們稱之為 outlier ,在我們原來的 SVM 模型里,outlier 的存在有可能造成很大的影響,因為超平面本身就是只有少數幾個 support vector 組成的,如果這些 support vector 里又存在 outlier 的話,其影響就很大了。例如下圖:
用黑圈圈起來的那個藍點是一個 outlier ,它偏離了自己原本所應該在的那個半空間,如果直接忽略掉它的話,原來的分隔超平面還是挺好的,但是由於這個 outlier 的出現,導致分隔超平面不得不被擠歪了,變成途中黑色虛線所示(這只是一個示意圖,並沒有嚴格計算精確坐標),同時 margin 也相應變小了。當然,更嚴重的情況是,如果這個 outlier 再往右上移動一些距離的話,我們將無法構造出能將數據分開的超平面來。
為了處理這種情況,SVM 允許數據點在一定程度上偏離一下超平面。例如上圖中,黑色實線所對應的距離,就是該 outlier 偏離的距離,如果把它移動回來,就剛好落在原來的超平面上,而不會使得超平面發生變形了。具體來說,原來的約束條件




















現在變成























其中 稱為松弛變量 (slack variable) ,對應數據點
允許偏離的 functional margin 的量。當然,如果我們運行
任意大的話,那任意的超平面都是符合條件的了。所以,我們在原來的目標函數后面加上一項,使得這些
的總和也要最小:


















其中 是一個參數,用於控制目標函數中兩項(“尋找 margin 最大的超平面”和“保證數據點偏差量最小”)之間的權重。注意,其中
是需要優化的變量(之一),而
是一個事先確定好的常量。完整地寫出來是這個樣子:


























































用之前的方法將限制加入到目標函數中,得到如下問題:































































分析方法和前面一樣,轉換為另一個問題之后,我們先讓 針對
、
和
最小化:































































將 帶回
並化簡,得到和原來一樣的目標函數:




































不過,由於我們得到 ,而又有
(作為 Lagrange multiplier 的條件),因此有
,所以整個 dual 問題現在寫作:


































































和之前的結果對比一下,可以看到唯一的區別就是現在 dual variable 多了一個上限
。而 Kernel 化的非線性形式也是一樣的,只要把
換成
即可。這樣一來,一個完整的,可以處理線性和非線性並能容忍噪音和 outliers 的支持向量機才終於介紹完畢了。
理解到這第二層,已經能滿足絕大部分人一窺SVM原理的好奇心,然對於那些想在證明層面理解SVM的則還很不夠,但進入第三層理解境界之前,你必須要有比較好的數理基礎和邏輯證明能力,不然你會跟我一樣,吃不少苦頭的。
第三層、證明SVM
說實話,凡是涉及到要證明的東西.理論,便一般不是怎么好惹的東西。絕大部分時候,看懂一個東西不難,但證明一個東西則需要點數學功底,進一步,證明一個東西也不是特別難,難的是從零開始發明創造這個東西的時候,則顯艱難(因為任何時代,大部分人的研究所得都不過是基於前人的研究成果,前人所做的是開創性工作,而這往往是最艱難最有價值的,他們被稱為真正的先驅。牛頓也曾說過,他不過是站在巨人的肩上。你,我則更是如此)。
OK,以下內容基本屬於自己在看支持向量機導論一書的理解,包括自己對一些證明的理解,可看做是讀書筆記。
3.1、感知機算法
.......
預告:
本文正在不斷迭代,增補中,預計6月中旬初步完成。請待后續更新、修補,謝謝。二零一二年六月四日凌晨一點。