1. 程式人生 > >支援向量機(理解SVM的三層境界)

支援向量機(理解SVM的三層境界)

           支援向量機通俗導論(理解SVM的三層境界)

作者:July、pluskid ;致謝:白石、JerryLead
出處:結構之法演算法之道blog。

前言

動筆寫這個支援向量機(support vector machine)是費了不少勁和困難的,原因很簡單,一者這個東西本身就並不好懂,要深入學習和研究下去需花費不少時間和精力,二者這個東西也不好講清楚,儘管網上已經有朋友寫得不錯了(見文末參考連結),但在描述數學公式的時候還是顯得不夠。得益於同學白石的數學證明,我還是想嘗試寫一下,希望本文在兼顧通俗易懂的基礎上,真真正正能足以成為一篇完整概括和介紹支援向量機的導論性的文章。

本文在寫的過程中,參考了不少資料,包括《支援向量機導論》、《統計學習方法》及網友pluskid的支援向量機系列等等,於此,還是一篇學習筆記,只是加入了自己的理解和總結,有任何不妥之處,還望海涵。全文巨集觀上整體認識支援向量機的概念和用處,微觀上深究部分定理的來龍去脈,證明及原理細節,力保邏輯清晰 & 通俗易懂。

同時,閱讀本文時建議大家儘量使用chrome等瀏覽器,如此公式才能更好的顯示,再者,閱讀時可拿張紙和筆出來,把本文所有定理.公式都親自推導一遍或者直接列印下來(可直接列印網頁版或本文文末附的PDF,享受隨時隨地思考、演算的極致快感),在文稿上演算。

Ok,還是那句原話,有任何問題,歡迎任何人隨時不吝指正 & 賜教,感謝。

第一層、瞭解SVM
1.0、什麼是支援向量機SVM

要明白什麼是SVM,便得從分類說起。

分類作為資料探勘領域中一項非常重要的任務,它的目的是學會一個分類函式或分類模型(或者叫做分類器),而支援向量機本身便是一種監督式學習的方法(至於具體什麼是監督學習與非監督學習,請參見此係列Machine L&Data Mining第一篇),它廣泛的應用於統計分類以及迴歸分析中。

支援向量機(SVM)是90年代中期發展起來的基於統計學習理論的一種機器學習方法,通過尋求結構化風險最小來提高學習機泛化能力,實現經驗風險和置信範圍的最小化,從而達到在統計樣本量較少的情況下,亦能獲得良好統計規律的目的。

通俗來講,它是一種二類分類模型,其基本模型定義為特徵空間上的間隔最大的線性分類器,即支援向量機的學習策略便是間隔最大化,最終可轉化為一個凸二次規劃問題的求解。

對於不想深究SVM原理的同學或比如就只想看看SVM是幹嘛的,那麼,瞭解到這裡便足夠了,不需上層。而對於那些喜歡深入研究一個東西的同學,甚至究其本質的,咱們則還有很長的一段路要走,萬里長征,咱們開始邁第一步吧,相信你能走完。

1.1、線性分類

OK,在講SVM之前,咱們必須先弄清楚一個概念:線性分類器(也可以叫做感知機,這裡的機表示的是一種演算法,本文第三部分、證明SVM中會詳細闡述)。

1.1.1、分類標準

這裡我們考慮的是一個兩類的分類問題,資料點用 x 來表示,這是一個 n 維向量,w^T中的T代表轉置,而類別用 y 來表示,可以取 1 或者 -1 ,分別代表兩個不同的類。一個線性分類器的學習目標就是要在 n 維的資料空間中找到一個分類超平面,其方程可以表示為:



上面給出了線性分類的定義描述,但或許讀者沒有想過:為何用y取1 或者 -1來表示兩個不同的類別呢?其實,這個1或-1的分類標準起源於logistic迴歸,為了完整和過渡的自然性,咱們就再來看看這個logistic迴歸。

1.1.2、1或-1分類標準的起源:logistic迴歸
Logistic迴歸目的是從特徵學習出一個0/1分類模型,而這個模型是將特性的線性組合作為自變數,由於自變數的取值範圍是負無窮到正無窮。因此,使用logistic函式(或稱作sigmoid函式)將自變數對映到(0,1)上,對映後的值被認為是屬於y=1的概率。
形式化表示就是
假設函式

其中x是n維特徵向量,函式g就是logistic函式。
而的影象是

可以看到,將無窮對映到了(0,1)。
而假設函式就是特徵屬於y=1的概率。

當我們要判別一個新來的特徵屬於哪個類時,只需求,若大於0.5就是y=1的類,反之屬於y=0類。
再審視一下,發現只和有關,>0,那麼,g(z)只不過是用來對映,真實的類別決定權還在。還有當時,=1,反之=0。如果我們只從出發,希望模型達到的目標無非就是讓訓練資料中y=1的特徵,而是y=0的特徵。Logistic迴歸就是要學習得到,使得正例的特徵遠大於0,負例的特徵遠小於0,強調在全部訓練例項上達到這個目標。

1.1.3、形式化標示
我們這次使用的結果標籤是y=-1,y=1,替換在logistic迴歸中使用的y=0和y=1。同時將替換成w和b。以前的,其中認為。現在我們替換為b,後面替換為(即)。這樣,我們讓,進一步。也就是說除了y由y=0變為y=-1,只是標記不同外,與logistic迴歸的形式化表示沒區別。
再明確下假設函式

上面提到過我們只需考慮的正負問題,而不用關心g(z),因此我們這裡將g(z)做一個簡化,將其簡單對映到y=-1和y=1上。對映關係如下:

於此,想必已經解釋明白了為何線性分類的標準一般用1 或者-1 來標示。
注:上小節來自jerrylead所作的斯坦福機器學習課程的筆記。

1.2、線性分類的一個例子

下面舉個簡單的例子,一個二維平面(一個超平面,在二維空間中的例子就是一條直線),如下圖所示,平面上有兩種不同的點,分別用兩種不同的顏色表示,一種為紅顏色的點,另一種則為藍顏色的點,紅顏色的線表示一個可行的超平面。

從上圖中我們可以看出,這條紅顏色的線把紅顏色的點和藍顏色的點分開來了。而這條紅顏色的線就是我們上面所說的超平面,也就是說,這個所謂的超平面的的確確便把這兩種不同顏色的資料點分隔開來,在超平面一邊的資料點所對應的 y 全是 -1 ,而在另一邊全是 1 。

接著,我們可以令分類函式(提醒:下文很大篇幅都在討論著這個分類函式):



顯然,如果 f(x)=0 ,那麼 x 是位於超平面上的點。我們不妨要求對於所有滿足 f(x)<0 的點,其對應的 y 等於 -1 ,而 f(x)>0 則對應 y=1 的資料點。


注:上圖中,定義特徵到結果的輸出函式,與我們之前定義的實質是一樣的。為什麼?因為無論是,還是,不影響最終優化結果。下文你將看到,當我們轉化到優化的時候,為了求解方便,會把yf(x)令為1,即yf(x)是y(w^x + b),還是y(w^x - b),對我們要優化的式子max1/||w||已無影響。

(有一朋友飛狗來自Mare_Desiderii,看了上面的定義之後,問道:請教一下SVM functional margin 為=y(wTx+b)=yf(x)中的Y是隻取1和-1 嗎?y的唯一作用就是確保functional margin的非負性?真是這樣的麼?當然不是,詳情請見本文評論下第43樓)
當然,有些時候,或者說大部分時候資料並不是線性可分的,這個時候滿足這樣條件的超平面就根本不存在(不過關於如何處理這樣的問題我們後面會講),這裡先從最簡單的情形開始推導,就假設資料都是線性可分的,亦即這樣的超平面是存在的。
更進一步,我們在進行分類的時候,將資料點 x代入 f(x) 中,如果得到的結果小於 0 ,則賦予其類別 -1 ,如果大於 0 則賦予類別 1 。如果 f(x)=0,則很難辦了,分到哪一類都不是。

請讀者注意,下面的篇幅將按下述3點走:

咱們就要確定上述分類函式f(x) = w.x + b(w.x表示w與x的內積)中的兩個引數w和b,通俗理解的話w是法向量,b是截距(再次說明:定義特徵到結果的輸出函式,與我們最開始定義的實質是一樣的);
那如何確定w和b呢?答案是尋找兩條邊界端或極端劃分直線中間的最大間隔(之所以要尋最大間隔是為了能更好的劃分不同類的點,下文你將看到:為尋最大間隔,匯出1/2||w||^2,繼而引入拉格朗日函式和對偶變數a,化為對單一因數對偶變數a的求解,當然,這是後話),從而確定最終的最大間隔分類超平面hyper plane和分類函式;
進而把尋求分類函式f(x) = w.x + b的問題轉化為對w,b的最優化問題,最終化為對偶因子的求解。

總結成一句話即是:從最大間隔出發(目的本就是為了確定法向量w),轉化為求對變數w和b的凸二次規劃問題。亦或如下圖所示(有點需要注意,如讀者@醬爆小八爪所說:從最大分類間隔開始,就一直是凸優化問題):

1.3、函式間隔Functional margin與幾何間隔Geometrical margin

一般而言,一個點距離超平面的遠近可以表示為分類預測的確信或準確程度。

在超平面w*x+b=0確定的情況下,|w*x+b|能夠相對的表示點x到距離超平面的遠近,而w*x+b的符號與類標記y的符號是否一致表示分類是否正確,所以,可以用量y*(w*x+b)的正負性來判定或表示分類的正確性和確信度。

於此,我們便引出了定義樣本到分類間隔距離的函式間隔functional margin的概念。

1.3.1、函式間隔Functional margin

我們定義函式間隔functional margin 為: 

  接著,我們定義超平面(w,b)關於訓練資料集T的函式間隔為超平面(w,b)關於T中所有樣本點(xi,yi)的函式間隔最小值,其中,x是特徵,y是結果標籤,i表示第i個樣本,有:

  = mini  (i=1,...n)

然與此同時,問題就出來了。上述定義的函式間隔雖然可以表示分類預測的正確性和確信度,但在選擇分類超平面時,只有函式間隔還遠遠不夠,因為如果成比例的改變w和b,如將他們改變為2w和2b,雖然此時超平面沒有改變,但函式間隔的值f(x)卻變成了原來的2倍。

其實,我們可以對法向量w加些約束條件,使其表面上看起來規範化,如此,我們很快又將引出真正定義點到超平面的距離--幾何間隔geometrical margin的概念(很快你將看到,幾何間隔就是函式間隔除以個||w||,即yf(x) / ||w||)。

1.3.2、點到超平面的距離定義:幾何間隔Geometrical margin

在給出幾何間隔的定義之前,咱們首先來看下,如上圖所示,對於一個點 x ,令其垂直投影到超平面上的對應的為 x0 ,由於 w 是垂直於超平面的一個向量,為樣本x到分類間隔的距離,我們有

           (||w||表示的是範數,關於範數的概念參見這裡)

又由於 x0 是超平面上的點,滿足 f(x0)=0 ,代入超平面的方程即可算出: 

γ

(有的書上會寫成把||w|| 分開相除的形式,如本文參考文獻及推薦閱讀條目11,其中,||w||為w的二階泛數)

不過這裡的是帶符號的,我們需要的只是它的絕對值,因此類似地,也乘上對應的類別 y即可,因此實際上我們定義 幾何間隔geometrical margin 為(注:別忘了,上面的定義,=y(wTx+b)=yf(x) ):

(代人相關式子可以得出:yi*(w/||w|| + b/||w||))

正如本文評論下讀者popol1991留言:函式間隔y*(wx+b)=y*f(x)實際上就是|f(x)|,只是人為定義的一個間隔度量;而幾何間隔|f(x)|/||w||才是直觀上的點到超平面距離。

想想二維空間裡的點到直線公式:假設一條直線的方程為ax+by+c=0,點P的座標是(x0,y0),則點到直線距離為|ax0+by0+c|/sqrt(a^2+b^2)。如下圖所示:

那麼如果用向量表示,設w=(a,b),f(x)=wx+c,那麼這個距離正是|f(p)|/||w||。

1.4、最大間隔分類器Maximum Margin Classifier的定義

於此,我們已經很明顯的看出,函式間隔functional margin 和 幾何間隔geometrical margin 相差一個的縮放因子。按照我們前面的分析,對一個數據點進行分類,當它的 margin 越大的時候,分類的 confidence 越大。對於一個包含 n 個點的資料集,我們可以很自然地定義它的 margin 為所有這 n 個點的 margin 值中最小的那個。於是,為了使得分類的 confidence 高,我們希望所選擇的超平面hyper plane 能夠最大化這個 margin 值。

通過上節,我們已經知道:

1、functional margin 明顯是不太適合用來最大化的一個量,因為在 hyper plane 固定以後,我們可以等比例地縮放 w 的長度和 b 的值,這樣可以使得的值任意大,亦即 functional margin可以在 hyper plane 保持不變的情況下被取得任意大,

2、而 geometrical margin 則沒有這個問題,因為除上了這個分母,所以縮放 w 和 b 的時候的值是不會改變的,它只隨著 hyper plane 的變動而變動,因此,這是更加合適的一個 margin 。

這樣一來,我們的 maximum margin classifier 的目標函式可以定義為:

當然,還需要滿足一些條件,根據 margin 的定義,我們有

其中 (等價於=  /||w||,故有稍後的  =1 時,  = 1 / ||w||),處於方便推導和優化的目的,我們可以令=1(對目標函式的優化沒有影響,至於為什麼,請見本文評論下第42樓回覆) ,此時,上述的目標函式轉化為(其中,s.t.,即subject to的意思,它匯出的是約束條件):

通過求解這個問題,我們就可以找到一個 margin 最大的 classifier ,如下圖所示,中間的紅色線條是 Optimal Hyper Plane ,另外兩條線到紅線的距離都是等於的(便是上文所定義的geometrical margin,當令=1時,便為1/||w||,而我們上面得到的目標函式便是在相應的約束條件下,要最大化這個1/||w||值):

通過最大化 margin ,我們使得該分類器對資料進行分類時具有了最大的 confidence,從而設計決策最優分類超平面。

1.5、到底什麼是Support Vector

上節,我們介紹了Maximum Margin Classifier,但並沒有具體闡述到底什麼是Support Vector,本節,咱們來重點闡述這個概念。咱們不妨先來回憶一下上節1.4節最後一張圖:

可以看到兩個支撐著中間的 gap 的超平面,它們到中間的純紅線separating hyper plane 的距離相等,即我們所能得到的最大的 geometrical margin,而“支撐”這兩個超平面的必定會有一些點,而這些“支撐”的點便叫做支援向量Support Vector。

或亦可看下來自此PPT中的一張圖,Support Vector便是那藍色虛線和粉紅色虛線上的點:

很顯然,由於這些 supporting vector 剛好在邊界上,所以它們滿足(還記得我們把 functional margin 定為 1 了嗎?上節中:“處於方便推導和優化的目的,我們可以令=1”),而對於所有不是支援向量的點,也就是在“陣地後方”的點,則顯然有。當然,除了從幾何直觀上之外,支援向量的概念也可以從下文優化過程的推導中得到。

OK,到此為止,算是瞭解到了SVM的第一層,對於那些只關心怎麼用SVM的朋友便已足夠,不必再更進一層深究其更深的原理。

第二層、深入SVM
2.1、從線性可分到線性不可分
2.1.1、從原始問題到對偶問題的求解

雖然上文1.4節給出了目標函式,卻沒有講怎麼來求解。現在就讓我們來處理這個問題。回憶一下之前得到的目標函式(subject to匯出的則是約束條件):

 由於求的最大值相當於求的最小值,所以上述問題等價於(w由分母變成分子,從而也有原來的max問題變為min問題,很明顯,兩者問題等價):

轉化到這個形式後,我們的問題成為了一個凸優化問題,或者更具體的說,因為現在的目標函式是二次的,約束條件是線性的,所以它是一個凸二次規劃問題。這個問題可以用任何現成的 QP (Quadratic Programming) 的優化包進行求解,歸結為一句話即是:在一定的約束條件下,目標最優,損失最小;
但雖然這個問題確實是一個標準的 QP 問題,但是它也有它的特殊結構,通過 Lagrange Duality 變換到對偶變數 (dual variable) 的優化問題之後,可以找到一種更加有效的方法來進行求解,而且通常情況下這種方法比直接使用通用的 QP 優化包進行優化要高效得多。

也就說,除了用解決QP問題的常規方法之外,還可以通過求解對偶問題得到最優解,這就是線性可分條件下支援向量機的對偶演算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函式,進而推廣到非線性分類問題。

至於上述提到,關於什麼是Lagrange duality?簡單地來說,通過給每一個約束條件加上一個 Lagrange multiplier(拉格朗日乘值),即引入拉格朗日乘子,如此我們便可以通過拉格朗日函式將約束條件融和到目標函式裡去(也就是說把條件融合到一個函式裡頭,現在只用一個函式表示式便能清楚的表達出我們的問題):

然後我們令

容易驗證,當某個約束條件不滿足時,例如,那麼我們顯然有(只要令即可)。而當所有約束條件都滿足時,則有,亦即我們最初要最小化的量。因此,在要求約束條件得到滿足的情況下最小化,實際上等價於直接最小化(當然,這裡也有約束條件,就是≥0,i=1,…,n)   ,因為如果約束條件沒有得到滿足,會等於無窮大,自然不會是我們所要求的最小值。具體寫出來,我們現在的目標函式變成了:

這裡用表示這個問題的最優值,這個問題和我們最初的問題是等價的。不過,現在我們來把最小和最大的位置交換一下(稍後,你將看到,當下面式子滿足了一定的條件之後,這個式子d 便是上式P 的對偶形式表示):

當然,交換以後的問題不再等價於原問題,這個新問題的最優值用來表示。並且,我們有≤ ,這在直觀上也不難理解,最大值中最小的一個總也比最小值中最大的一個要大吧!  總之,第二個問題的最優值在這裡提供了一個第一個問題的最優值的一個下界,在滿足某些條件的情況下,這兩者相等,這個時候我們就可以通過求解第二個問題來間接地求解第一個問題。

也就是說,下面我們將先求L 對w、b的極小,再求L 對的極大。而且,之所以從minmax的原始問題,轉化為maxmin的對偶問題,一者因為是的近似解,二者,轉化為對偶問題後,更容易求解。

2.1.2、KKT條件

與此同時,上段說“在滿足某些條件的情況下”,這所謂的“滿足某些條件”就是要滿足KKT條件。那KKT條件的表現形式是什麼呢?據維基百科:KKT 條件的介紹,一般地,一個最優化數學模型能夠表示成下列標準形式:

其中,f(x)是需要最小化的函式,h(x)是等式約束,g(x)是不等式約束,p和q分別為等式約束和不等式約束的數量。同時,我們得明白以下兩個定理:

凸優化的概念:\mathcal{X} \subset \mathbb{R}^n 為一凸集, f:\mathcal{X}\to \mathbb{R} 為一凸函式。凸優化就是要找出一點 x^\ast \in \mathcal{X} ,使得每一 x \in \mathcal{X} 滿足 f(x^\ast)\le f(x) 。
KKT條件的意義:它是一個非線性規劃(Nonlinear Programming)問題能有最優化解法的必要和充分條件。

那到底什麼是所謂Karush-Kuhn-Tucker條件呢?KKT條件就是指上面最優化數學模型的標準形式中的最小點 x* 必須滿足下面的條件:

經過論證,我們這裡的問題是滿足 KKT 條件的(首先已經滿足Slater condition,再者f和gi也都是可微的,即L對w和b都可導),因此現在我們便轉化為求解第二個問題。也就是說,現在,咱們的原問題通過滿足一定的條件,已經轉化成了對偶問題。而求解這個對偶學習問題,分為3個步驟,首先要讓L(w,b,a) 關於 w 和 b 最小化,然後求對α的極大,最後利用SMO演算法求解對偶因子。

2.1.3、對偶問題求解的3個步驟

(1)、首先固定,要讓 L 關於 w 和 b 最小化,我們分別對w,b求偏導數,即令 ∂L/∂w 和 ∂L/∂b 等於零(對w求導結果的解釋請看本文評論下第45樓回覆):

以上結果代回上述的 L: 

得到:

提醒:有讀者可能會問上述推導過程如何而來?說實話,其具體推導過程是比較複雜的,如下圖所示:

  最後,得到:

如 jerrylead所說:“倒數第4步”推導到“倒數第3步”使用了線性代數的轉置運算,由於ai和yi都是實數,因此轉置後與自身一樣。“倒數第3步”推導到“倒數第2步”使用了(a+b+c+…)(a+b+c+…)=aa+ab+ac+ba+bb+bc+…的乘法運演算法則。最後一步是上一步的順序調整。

L(

從上面的最後一個式子,我們可以看出,此時的拉格朗日函式只包含了一個變數,那就是,然後下文的第2步,求出了便能求出w,和b,由此可見,上文第1.2節提出來的核心問題:分類函式也就可以輕而易舉的求出來了。

(2)、求對的極大,即是關於對偶問題的最優化問題,從上面的式子得到:

(不得不提醒下讀者:經過上面第一個步驟的求w和b,得到的拉格朗日函式式子已經沒有了變數w,b,只有,而反過來,求得的將能匯出w,b的解,最終得出分離超平面和分類決策函式。為何呢?因為如果求出了,根據,即可求出w。然後通過,即可求出b )

如前面所說,這個問題有更加高效的優化演算法,即我們常說的SMO演算法。

2.1.4、序列最小最優化SMO演算法

細心的讀者讀至上節末尾處,怎麼拉格朗日乘子的值可能依然心存疑惑。實際上,關於的求解可以用一種快速學習演算法即SMO演算法,這裡先簡要介紹下。

  OK,當:

   要解決的是在引數上求最大值W的問題,至於和都是已知數(其中  是一個引數,用於控制目標函式中兩項(“尋找 margin 最大的超平面”和“保證資料點偏差量最小”)之間的權重。和上文最後的式子對比一下,可以看到唯一的區別就是現在 dual variable  多了一個上限  ,關於的具體由來請檢視下文第2.3節)。
要了解這個SMO演算法是如何推導的,請跳到下文第3.5節、SMO演算法。

2.1.5、線性不可分的情況

OK,為過渡到下節2.2節所介紹的核函式,讓我們再來看看上述推導過程中得到的一些有趣的形式。首先就是關於我們的 hyper plane ,對於一個數據點 x 進行分類,實際上是通過把 x 帶入到算出結果然後根據其正負號來進行類別劃分的。而前面的推導中我們得到 

因此分類函式為:

這裡的形式的有趣之處在於,對於新點 x的預測,只需要計算它與訓練資料點的內積即可(表示向量內積),這一點至關重要,是之後使用 Kernel 進行非線性推廣的基本前提。此外,所謂 Supporting Vector 也在這裡顯示出來——事實上,所有非Supporting Vector 所對應的係數都是等於零的,因此對於新點的內積計算實際上只要針對少量的“支援向量”而不是所有的訓練資料即可。

為什麼非支援向量對應的等於零呢?直觀上來理解的話,就是這些“後方”的點——正如我們之前分析過的一樣,對超平面是沒有影響的,由於分類完全有超平面決定,所以這些無關的點並不會參與分類問題的計算,因而也就不會產生任何影響了。

回憶一下我們2.1.1節中通過 Lagrange multiplier得到的目標函式:

 注意到如果 xi 是支援向量的話,上式中紅顏色的部分是等於 0 的(因為支援向量的 functional margin 等於 1 ),而對於非支援向量來說,functional margin 會大於 1 ,因此紅顏色部分是大於零的,而又是非負的,為了滿足最大化,必須等於 0 。這也就是這些非Supporting Vector 的點的侷限性。 

從1.5節到上述所有這些東西,便得到了一個maximum margin hyper plane classifier,這就是所謂的支援向量機(Support Vector Machine)。當然,到目前為止,我們的 SVM 還比較弱,只能處理線性的情況,不過,在得到了對偶dual 形式之後,通過 Kernel 推廣到非線性的情況就變成了一件非常容易的事情了(相信,你還記得本節開頭所說的:“通過求解對偶問題得到最優解,這就是線性可分條件下支援向量機的對偶演算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函式,進而推廣到非線性分類問題”)。

2.2、核函式Kernel

2.2.1、特徵空間的隱式對映:核函式

咱們首先給出核函式的來頭:

在上文中,我們已經瞭解到了SVM處理線性可分的情況,而對於非線性的情況,SVM 的處理方法是選擇一個核函式 κ(⋅,⋅) ,通過將資料對映到高維空間,來解決在原始空間中線性不可分的問題。由於核函式的優良品質,這樣的非線性擴充套件在計算量上並沒有比原來複雜多少,這一點是非常難得的。當然,這要歸功於核方法——除了 SVM 之外,任何將計算表示為資料點的內積的方法,都可以使用核方法進行非線性擴充套件。

也就是說,Minsky和Papert早就在20世紀60年代就已經明確指出線性學習器計算能力有限。為什麼呢?因為總體上來講,現實世界複雜的應用需要有比線性函式更富有表達能力的假設空間,也就是說,目標概念通常不能由給定屬性的簡單線性函式組合產生,而是應該一般地尋找待研究資料的更為一般化的抽象特徵。

而下文我們將具體介紹的核函式則提供了此種問題的解決途徑,從下文你將看到,核函式通過把資料對映到高維空間來增加第一節所述的線性學習器的能力,使得線性學習器對偶空間的表達方式讓分類操作更具靈活性和可操作性。因為訓練樣例一般是不會獨立出現的,它們總是以成對樣例的內積形式出現,而用對偶形式表示學習器的優勢在為在該表示中可調引數的個數不依賴輸入屬性的個數,通過使用恰當的核函式來替代內積,可以隱式得將非線性的訓練資料對映到高維空間,而不增加可調引數的個數(當然,前提是核函式能夠計算對應著兩個輸入特徵向量的內積)。
1、簡而言之:線上性不可分的情況下,支援向量機通過某種事先選擇的非線性對映(核函式)將輸入變數對映到一個高維特徵空間,在這個空間中構造最優分類超平面。我們使用SVM進行資料集分類工作的過程首先是同預先選定的一些非線性對映將輸入空間對映到高維特徵空間(下圖很清晰的表達了通過對映到高維特徵空間,而把平面上本身不好分的非線性資料分了開來):

使得在高維屬性空間中有可能最訓練資料實現超平面的分割,避免了在原輸入空間中進行非線性曲面分割計算。SVM資料集形成的分類函式具有這樣的性質:它是一組以支援向量為引數的非線性函式的線性組合,因此分類函式的表示式僅和支援向量的數量有關,而獨立於空間的維度,在處理高維輸入空間的分類時,這種方法尤其有效,其工作原理如下圖所示:



2、具體點說:在我們遇到核函式之前,如果用原始的方法,那麼在用線性學習器學習一個非線性關係,需要選擇一個非線性特徵集,並且將資料寫成新的表達形式,這等價於應用一個固定的非線性對映,將資料對映到特徵空間,在特徵空間中使用線性學習器,因此,考慮的假設集是這種型別的函式:

這裡ϕ:X->F是從輸入空間到某個特徵空間的對映,這意味著建立非線性學習器分為兩步:

首先使用一個非線性對映將資料變換到一個特徵空間F,
然後在特徵空間使用線性學習器分類。

在上文我提到過對偶形式,而這個對偶形式就是線性學習器的一個重要性質,這意味著假設可以表達為訓練點的線性組合,因此決策規則可以用測試點和訓練點的內積來表示:

如果有一種方式可以在特徵空間中直接計算內積〈φ(xi · φ(x)〉,就像在原始輸入點的函式中一樣,就有可能將兩個步驟融合到一起建立一個非線性的學習器,這樣直接計演算法的方法稱為核函式方法,於是,核函式便橫空出世了。
這裡我直接給出一個定義:核是一個函式K,對所有x,z(-X,滿足,這裡φ是從X到內積特徵空間F的對映。
3、總而言之,舉個簡單直接點的例子,如@Wind所說:如果不是用核技術,就會先計算線性對映phy(x1)和phy(x2),然後計算這兩個特徵的內積,使用了核技術之後,先把phy(x1)和phy(x2)的通用表示式子:< phy(x1),phy(x2) >=k( <x1,x2> )計算出來,注意到這裡的< , >表示內積,k( , )就是對應的核函式,這個表達往往非常簡單,所以計算非常方便。
OK,接下來,咱們就進一步從外到裡,來探探這個核函式的真面目。

2.2.2、核函式:如何處理非線性資料

在2.1節中我們介紹了線性情況下的支援向量機,它通過尋找一個線性的超平面來達到對資料進行分類的目的。不過,由於是線性方法,所以對非線性的資料就沒有辦法處理。舉個例子來說,則是如下圖所示的兩類資料,分別分佈為兩個圓圈的形狀,這樣的資料本身就是線性不可分的,此時咱們該如何把這兩類資料分開呢(下文將會有一個相應的三維空間圖)?



事實上,上圖所述的這個資料集,是用兩個半徑不同的圓圈加上了少量的噪音生成得到的,所以,一個理想的分界應該是一個“圓圈”而不是一條線(超平面)。如果用 X1 和 X2 來表示這個二維平面的兩個座標的話,我們知道一條二次曲線(圓圈是二次曲線的一種特殊情況)的方程可以寫作這樣的形式:

注意上面的形式,如果我們構造另外一個五維的空間,其中五個座標的值分別為 Z1=X1, Z2=X21, Z3=X2, Z4=X22, Z5=X1X2,那麼顯然,上面的方程在新的座標系下可以寫作:

關於新的座標 Z ,這正是一個 hyper plane 的方程!也就是說,如果我們做一個對映 ϕ:R2→R5 ,將 X 按照上面的規則對映為 Z ,那麼在新的空間中原來的資料將變成線性可分的,從而使用之前我們推導的線性分類演算法就可以進行處理了。這正是 Kernel 方法處理非線性問題的基本思想。

再進一步描述 Kernel 的細節之前,不妨再來看看這個例子對映過後的直觀例子。當然,你我可能無法把 5 維空間畫出來,不過由於我這裡生成資料的時候就是用了特殊的情形,具體來說,我這裡的超平面實際的方程是這個樣子(圓心在 X2 軸上的一個正圓):

因此我只需要把它對映到 Z1=X21, Z2=X22, Z3=X2 這樣一個三維空間中即可,下圖即是對映之後的結果,將座標軸經過適當的旋轉,就可以很明顯地看出,資料是可以通過一個平面來分開的(pluskid:下面的gif 動畫,先用 Matlab 畫出一張張圖片,再用 Imagemagick 拼貼成):

現在讓我們再回到 SVM 的情形,假設原始的資料時非線性的,我們通過一個對映 ϕ(⋅) 將其對映到一個高維空間中,資料變得線性可分了,這個時候,我們就可以使用原來的推導來進行計算,只是所有的推導現在是在新的空間,而不是原始空間中進行。當然,推導過程也並不是可以簡單地直接類比的,例如,原本我們要求超平面的法向量 w ,但是如果對映之後得到的新空間的維度是無窮維的(確實會出現這樣的情況,比如後面會提到的 高斯核Gaussian Kernel ),要表示一個無窮維的向量描述起來就比較麻煩。於是我們不妨先忽略過這些細節,直接從最終的結論來分析,回憶一下,我們上一次2.1節中得到的最終的分類函式是這樣的:

現在則是在對映過後的空間,即:

而其中的 α 也是通過求解如下 dual 問題而得到的:

這樣一來問題就解決了嗎?似乎是的:拿到非線性資料,就找一個對映  ,然後一股腦把原來的資料對映到新空間中,再做線性 SVM 即可。不過事實上沒有這麼簡單!其實剛才的方法稍想一下就會發現有問題:在最初的例子裡,我們對一個二維空間做對映,選擇的新空間是原始空間的所有一階和二階的組合,得到了五個維度;如果原始空間是三維,那麼我們會得到 19 維的新空間,這個數目是呈爆炸性增長的,這給  的計算帶來了非常大的困難,而且如果遇到無窮維的情況,就根本無從計算了。所以就需要 Kernel 出馬了。

不妨還是從最開始的簡單例子出發,設兩個向量和,而即是到前面2.2.1節說的五維空間的對映,因此對映過後的內積為:

    (公式說明:上面的這兩個推導過程中,所說的前面的五維空間的對映,這裡說的前面便是文中2.2.1節的所述的對映方式,仔細看下2.2.1節的對映規則,再看那第一個推導,其實就是計算x1,x2各自的內積,然後相乘相加即可,第二個推導則是直接平方,去掉括號,也很容易推出來)

另外,我們又注意到:

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

 之後的內積的結果是相等的,那麼區別在於什麼地方呢?

一個是對映到高維空間中,然後再根據內積的公式進行計算;
而另一個則直接在原來的低維空間中進行計算,而不需要顯式地寫出對映後的結果。

(公式說明:上面之中,最後的兩個式子,第一個算式,是帶內積的完全平方式,可以拆開,然後,通過湊一個得到,第二個算式,也是根據第一個算式湊出來的)

回憶剛才提到的對映的維度爆炸,在前一種方法已經無法計算的情況下,後一種方法卻依舊能從容處理,甚至是無窮維度的情況也沒有問題。

我們把這裡的計算兩個向量在隱式對映過後的空間中的內積的函式叫做核函式 (Kernel Function) ,例如,在剛才的例子中,我們的核函式為:

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

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

這樣一來計算的問題就算解決了,避開了直接在高維空間中進行計算,而結果卻是等價的!當然,因為我們這裡的例子非常簡單,所以我可以手工構造出對應於的核函數出來,如果對於任意一個對映,想要構造出對應的核函式就很困難了。

2.2.3、幾個核函式

通常人們會從一些常用的核函式中選擇(根據問題和資料的不同,選擇不同的引數,實際上就是得到了不同的核函式),例如:

多項式核,顯然剛才我們舉的例子是這裡多項式核的一個特例(R = 1,d = 2)。雖然比較麻煩,而且沒有必要,不過這個核所對應的對映實際上是可以寫出來的,該空間的維度是,其中  是原始空間的維度。
高斯核,這個核就是最開始提到過的會將原始空間對映為無窮維空間的那個傢伙。不過,如果選得很大的話,高次特徵上的權重實際上衰減得非常快,所以實際上(數值上近似一下)相當於一個低維的子空間;反過來,如果選得很小,則可以將任意的資料對映為線性可分——當然,這並不一定是好事,因為隨之而來的可能是非常嚴重的過擬合問題。不過,總的來說,通過調控引數,高斯核實際上具有相當高的靈活性,也是使用最廣泛的核函式之一。下圖所示的例子便是把低維線性不可分的資料通過高斯核函式對映到了高維空間:
線性核,這實際上就是原始空間中的內積。這個核存在的主要目的是使得“對映後空間中的問題”和“對映前空間中的問題”兩者在形式上統一起來了(意思是說,咱們有的時候,寫程式碼,或寫公式的時候,只要寫個模板或通用表示式,然後再代入不同的核,便可以了,於此,便在形式上統一了起來,不用再分別寫一個線性的,和一個非線性的)。

2.2.4、核函式的本質
上面說了這麼一大堆,讀者可能還是沒明白核函式到底是個什麼東西?我再簡要概括下,即以下三點:

實際中,我們會經常遇到線性不可分的樣例,此時,我們的常用做法是把樣例特徵對映到高維空間中去(如上文2.2節最開始的那幅圖所示,對映到高維空間後,相關特徵便被分開了,也就達到了分類的目的);
但進一步,如果凡是遇到線性不可分的樣例,一律對映到高維空間,那麼這個維度大小是會高到可怕的(如上文中19維乃至無窮維的例子)。那咋辦呢?
此時,核函式就隆重登場了,核函式的價值在於它雖然也是講特徵進行從低維到高維的轉換,但核函式絕就絕在它事先在低維上進行計算,而將實質上的分類效果表現在了高維上,也就如上文所說的避免了直接在高維空間中的複雜計算。

最後引用這裡的一個例子舉例說明下核函式解決非線性問題的直觀效果。

假設現在你是一個農場主,圈養了一批羊群,但為預防狼群襲擊羊群,你需要搭建一個籬笆來把羊群圍起來。但是籬笆應該建在哪裡呢?你很可能需要依據牛群和狼群的位置建立一個“分類器”,比較下圖這幾種不同的分類器,我們可以看到SVM完成了一個很完美的解決方案。


這個例子從側面簡單說明了SVM使用非線性分類器的優勢,而邏輯模式以及決策樹模式都是使用了直線方法。
OK,不再做過多介紹了,對核函式有進一步興趣的,還可以看看此文。

2.3、使用鬆弛變數處理 outliers 方法

在本文第一節最開始討論支援向量機的時候,我們就假定,資料是線性可分的,亦即我們可以找到一個可行的超平面將資料完全分開。後來為了處理非線性資料,在上文2.2節使用 Kernel 方法對原來的線性 SVM 進行了推廣,使得非線性的的情況也能處理。雖然通過對映  將原始資料對映到高維空間之後,能夠線性分隔的概率大大增加,但是對於某些情況還是很難處理。

例如可能並不是因為資料本身是非線性結構的,而只是因為資料有噪音。對於這種偏離正常位置很遠的資料點,我們稱之為 outlier ,在我們原來的 SVM 模型裡,outlier 的存在有可能造成很大的影響,因為超平面本身就是隻有少數幾個 support vector 組成的,如果這些 support vector 裡又存在 outlier 的話,其影響就很大了。例如下圖:

用黑圈圈起來的那個藍點是一個 outlier ,它偏離了自己原本所應該在的那個半空間,如果直接忽略掉它的話,原來的分隔超平面還是挺好的,但是由於這個 outlier 的出現,導致分隔超平面不得不被擠歪了,變成途中黑色虛線所示(這只是一個示意圖,並沒有嚴格計算精確座標),同時 margin 也相應變小了。當然,更嚴重的情況是,如果這個 outlier 再往右上移動一些距離的話,我們將無法構造出能將資料分開的超平面來。

為了處理這種情況,SVM 允許資料點在一定程度上偏離一下超平面。例如上圖中,黑色實線所對應的距離,就是該 outlier 偏離的距離,如果把它移動回來,就剛好落在原來的超平面上,而不會使得超平面發生變形了。

插播下一位讀者@Copper_PKU的理解:“換言之,在有鬆弛的情況下outline點也屬於支援向量SV,同時,對於不同的支援向量,拉格朗日引數的值也不同,如此篇論文《Large Scale Machine Learning》中的下圖所示:

對於遠離分類平面的點值為0;對於邊緣上的點值在[0, 1/L]之間,其中,L為訓練資料集個數,即資料集大小;對於outline資料和內部的資料值為1/L。更多請參看本文文末參考條目第51條。”

OK,繼續回到咱們的問題。我們,原來的約束條件為:

現在考慮到outlier問題,約束條件變成了:

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

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

用之前的方法將限制或約束條件加入到目標函式中,得到新的拉格朗日函式,如下所示:

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

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

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

把前後的結果對比一下(錯誤修正:圖中的Dual formulation中的Minimize應為maxmize):

可以看到唯一的區別就是現在 dual variable  多了一個上限  。而 Kernel 化的非線性形式也是一樣的,只要把換成即可。這樣一來,一個完整的,可以處理線性和非線性並能容忍噪音和 outliers 的支援向量機才終於介紹完畢了。

行文至此,可以做個小結,不準確的說,SVM它本質上即是一個分類方法,用w^T+b定義分類函式,於是求w、b,為尋最大間隔,引出1/2||w||^2,繼而引入拉格朗日因子,化為對拉格朗日乘子a的求解(求解過程中會涉及到一系列最優化或凸二次規劃等問題),如此,求w.b與求a等價,而a的求解可以用一種快速學習演算法SMO,至於核函式,是為處理非線性情況,若直接對映到高維計算恐維度爆炸,故在低維計算,等效高維表現。

OK,理解到這第二層,已經能滿足絕大部分人一窺SVM原理的好奇心,然對於那些想在證明層面理解SVM的則還很不夠,但進入第三層理解境界之前,你必須要有比較好的數理基礎和邏輯證明能力,不然你會跟我一樣,吃不少苦頭的。

第三層、證明SVM

說實話,凡是涉及到要證明的東西.理論,便一般不是怎麼好惹的東西。絕大部分時候,看懂一個東西不難,但證明一個東西則需要點數學功底,進一步,證明一個東西也不是特別難,難的是從零開始發明創造這個東西的時候,則顯艱難(因為任何時代,大部分人的研究所得都不過是基於前人的研究成果,前人所做的是開創性工作,而這往往是最艱難最有價值的,他們被稱為真正的先驅。牛頓也曾說過,他不過是站在巨人的肩上。你,我則更是如此)。

正如陳希孺院士在他的著作《數理統計學簡史》的第4章、最小二乘法中所講:在科研上諸多觀念的革新和突破是有著很多的不易的,或許某個定理在某個時期由某個人點破了,現在的我們看來一切都是理所當然,但在一切沒有發現之前,可能許許多多的頂級學者畢其功於一役,耗盡一生,努力了幾十年最終也是無功而返。

話休絮煩,要證明一個東西先要弄清楚它的根基在哪,即構成它的基礎是哪些理論。OK,以下內容基本是上文中未講到的一些定理的證明,包括其背後的邏輯、來源背景等東西,還是讀書筆記。

本部分導述

3.1節線性學習器中,主要闡述感知機演算法;
3.2節非線性學習器中,主要闡述mercer定理;
3.3節、損失函式;
3.4節、最小二乘法;
3.5節、SMO演算法;
3.6節、簡略談談SVM的應用;

3.1、線性學習器
3.1.1、感知機演算法
這個感知機演算法是1956年提出的,年代久遠,依然影響著當今,當然,可以肯定的是,此演算法亦非最優,後續會有更詳盡闡述。不過,有一點,你必須清楚,這個演算法是為了幹嘛的:不斷的訓練試錯以期尋找一個合適的超平面(是的,就這麼簡單)。
下面,舉個例子。如下圖所示,憑我們的直覺可以看出,圖中的紅線是最優超平面,藍線則是根據感知機演算法在不斷的訓練中,最終,若藍線能通過不斷的訓練移動到紅線位置上,則代表訓練成功。

既然需要通過不斷的訓練以讓藍線最終成為最優分類超平面,那麼,到底需要訓練多少次呢?Novikoff定理告訴我們當間隔是正的時候感知機演算法會在有限次數的迭代中收斂,也就是說Novikoff定理證明了感知機演算法的收斂性,即能得到一個界,不至於無窮迴圈下去。

 Novikoff定理:如果分類超平面存在, 僅需在序列上迭代幾次,在界為的錯誤次數下就可以找到分類超平面,演算法停止。

這裡,為擴充間隔。根據誤分次數公式可知, 迭代次數與對應於擴充(包括偏置)權重的訓練集的間隔有關。
順便再解釋下這個所謂的擴充間隔,即為樣本到分類間隔的距離,即從引出的最大分類間隔。OK,還記得上文第1.3.2節開頭的內容麼?如下:“

在給出幾何間隔的定義之前,咱們首先來看下,如上圖所示,對於一個點 x ,令其垂直投影到超平面上的對應的為 x0 ,由於 w 是垂直於超平面的一個向量,為樣本x到分類間隔的距離,我們有

然後後續怎麼推匯出最大分類間隔請回到本文第一、二部分,此處不重複板書。
同時有一點得注意:感知機演算法雖然可以通過簡單迭代對線性可分資料生成正確分類的超平面,但不是最優效果,那怎樣才能得到最優效果呢,就是上文中第一部分所講的尋找最大分類間隔超平面。此外,Novikoff定理的證明請見這裡。

3.2、非線性學習器
3.2.1、Mercer定理
Mercer定理 :如果函式K是上的對映(也就是從兩個n維向量對映到實數域)。那麼如果K是一個有效核函式(也稱為Mercer核函式),那麼當且僅當對於訓練樣例,其相應的核函式矩陣是對稱半正定的。
要理解這個Mercer定理,先要了解什麼是半正定矩陣,要了解什麼是半正定矩陣,先得知道什麼是正定矩陣(矩陣理論“博大精深”,我自己也未能徹底理清,等我理清了再續寫此節,順便推薦我正在看的一本《矩陣分析與應用》)。然後這裡有一個此定理的證明,可以看下。
正如@Copper_PKU所說:核函式在SVM的分類效果中起了重要的作用,最後這裡有個tutorial可以看看。
3.3、損失函式

在本文1.0節有這麼一句話“支援向量機(SVM)是90年代中期發展起來的基於統計學習理論的一種機器學習方法,通過尋求結構化風險最小來提高學習機泛化能力,實現經驗風險和置信範圍的最小化,從而達到在統計樣本量較少的情況下,亦能獲得良好統計規律的目的。”但初次看到的讀者可能並不瞭解什麼是結構化風險,什麼又是經驗風險。要了解這兩個所謂的“風險”,還得又從監督學習說起。

監督學習實際上就是一個經驗風險或者結構風險函式的最優化問題。風險函式度量平均意義下模型預測的好壞,模型每一次預測的好壞用損失函式來度量。它從假設空間F中選擇模型f作為決策函式,對於給定的輸入X,由f(X)給出相應的輸出Y,這個輸出的預測值f(X)與真實值Y可能一致也可能不一致,用一個損失函式來度量預測錯誤的程度。損失函式記為L(Y, f(X))。

常用的損失函式有以下幾種(基本引用自《統計學習方法》):



如此,SVM有第二種理解,即最優化+損失最小,或如@夏粉_百度所說“可從損失函式和優化演算法角度看SVM,boosting,LR等演算法,可能會有不同收穫”。

OK,關於更多統計學習方法的問題,請參看此文。

關於損失函式,如下文讀者評論中所述:可以看看張潼的這篇《Statistical behavior and consistency of classification methods based on convex risk minimization》。各種演算法中常用的損失函式基本都具有fisher一致性,優化這些損失函式得到的分類器可以看作是後驗概率的“代理”。

此外,他還有另外一篇論文《Statistical analysis of some multi-category large margin classification methods》,在多分類情況下margin loss的分析,這兩篇對Boosting和SVM使用的損失函式分析的很透徹。

3.4、最小二乘法
3.4.1、什麼是最小二乘法?

既然本節開始之前提到了最小二乘法,那麼下面引用《正態分佈的前世今生》裡的內容稍微簡單闡述下。

我們口頭中經常說:一般來說,平均來說。如平均來說,不吸菸的健康優於吸菸者,之所以要加“平均”二字,是因為凡事皆有例外,總存在某個特別的人他吸菸但由於經常鍛鍊所以他的健康狀況可能會優於他身邊不吸菸的朋友。而最小二乘法的一個最簡單的例子便是算術平均。

最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找資料的最佳函式匹配。利用最小二乘法可以簡便地求得未知的資料,並使得這些求得的資料與實際資料之間誤差的平方和為最小。用函式表示為:

使誤差「所謂誤差,當然是觀察值與實際真實值的差量」平方和達到最小以尋求估計值的方法,就叫做最小二乘法,用最小二乘法得到的估計,叫做最小二乘估計。當然,取平方和作為目標函式只是眾多可取的方法之一。

最小二乘法的一般形式可表示為:

有效的最小二乘法是勒讓德在 1805 年發表的,基本思想就是認為測量中有誤差,所以所有方程的累積誤差為

我們求解出導致累積誤差最小的引數即可:

勒讓德在論文中對最小二乘法的優良性做了幾點說明:

 最小二乘使得誤差平方和最小,並在各個方程的誤差之間建立了一種平衡,從而防止某一個極端誤差取得支配地位
 計算中只要求偏導後求解線性方程組,計算過程明確便捷
最小二乘可以匯出算術平均值作為估計值

對於最後一點,從統計學的角度來看是很重要的一個性質。推理如下:假設真值為 θ, x1,⋯,xn為n次測量值, 每次測量的誤差為ei=xi−θ,按最小二乘法,誤差累積為

求解 使達到最小,正好是算術平均。

由於算術平均是一個歷經考驗的方法,而以上的推理說明,算術平均是最小二乘的一個特例,所以從另一個角度說明了最小二乘方法的優良性,使我們對最小二乘法更加有信心。

最小二乘法發表之後很快得到了大家的認可接受,並迅速的在資料分析實踐中被廣泛使用。不過歷史上又有人把最小二乘法的發明歸功於高斯,這又是怎麼一回事呢。高斯在1809年也發表了最小二乘法,並且聲稱自己已經使用這個方法多年。高斯發明了小行星定位的數學方法,並在資料分析中使用最小二乘方法進行計算,準確的預測了穀神星的位置。

說了這麼多,貌似跟本文的主題SVM沒啥關係呀,別急,請讓我繼續闡述。本質上說,最小二乘法即是一種引數估計方法,說到引數估計,咱們得從一元線性模型說起。

3.4.2、最小二乘法的解法

什麼是一元線性模型呢? 請允許我引用這裡的內容,先來梳理下幾個基本概念:

監督學習中,如果預測的變數是離散的,我們稱其為分類(如決策樹,支援向量機等),如果預測的變數是連續的,我們稱其為迴歸。
迴歸分析中,如果只包括一個自變數和一個因變數,且二者的關係可用一條直線近似表示,這種迴歸分析稱為一元線性迴歸分析。
如果迴歸分析中包括兩個或兩個以上的自變數,且因變數和自變數之間是線性關係,則稱為多元線性迴歸分析。
對於二維空間線性是一條直線;對於三維空間線性是一個平面,對於多維空間線性是一個超平面...   

對於一元線性迴歸模型, 假設從總體中獲取了n組觀察值(X1,Y1),(X2,Y2), …,(Xn,Yn)。對於平面中的這n個點,可以使用無數條曲線來擬合。要求樣本回歸函式儘可能好地擬合這組值。綜合起來看,這條直線處於樣本資料的中心位置最合理。 
選擇最佳擬合曲線的標準可以確定為:使總的擬合誤差(即總殘差)達到最小。有以下三個標準可以選擇:        

用“殘差和最小”確定直線位置是一個途徑。但很快發現計算“殘差和”存在相互抵消的問題。
用“殘差絕對值和最小”確定直線位置也是一個途徑。但絕對值的計算比較麻煩。
最小二乘法的原則是以“殘差平方和最小”確定直線位置。用最小二乘法除了計算比較方便外,得到的估計量還具有優良特性。這種方法對異常值非常敏感。  

 最常用的是普通最小二乘法( Ordinary  Least Square,OLS):所選擇的迴歸模型應該使所有觀察值的殘差平方和達到最小,即採用平方損失函式。  
 我們定義樣本回歸模型為:

其中ei為樣本(Xi, Yi)的誤差。
接著,定義平方損失函式Q:

則通過Q最小確定這條直線,即確定,以為變數,把它們看作是Q的函式,就變成了一個求極值的問題,可以通過求導數得到。
求Q對兩個待估引數的偏導數:

根據數學知識我們知道,函式的極值點為偏導為0的點。   
解得:



這就是最小二乘法的解法,就是求得平方損失函式的極值點。自此,你看到求解最小二乘法與求解SVM問題何等相似,尤其是定義損失函式,而後通過偏導求得極值。

OK,更多請參看陳希孺院士的《數理統計學簡史》的第4章、最小二乘法,和本文參考條目第59條《凸函式》。
3.5、SMO演算法

在上文2.1.2節中,我們提到了求解對偶問題的序列最小最優化SMO演算法,但並未提到其具體解法。

事實上,SMO演算法是由Microsoft Research的John C. Platt在1998年發表的一篇論文《Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machines》中提出,它很快成為最快的二次規劃優化演算法,特別針對線性SVM和資料稀疏時效能更優。

接下來,咱們便參考John C. Platt的這篇文章來看看SMO的解法是怎樣的。

3.5.1、SMO演算法的解法

咱們首先來定義特徵到結果的輸出函式為

再三強調,這個u與我們之前定義的實質是一樣的。

接著,咱們重新定義咱們原始的優化問題,權當重新回顧,如下:

求導得到:

代入中,可得。

引入對偶因子後,得:

s.t:

注:這裡得到的min函式與我們之前的max函式實質也是一樣,因為把符號變下,即有min轉化為max的問題,且yi也與之前的等價,yj亦如此。
經過加入鬆弛變數後,模型修改為:

從而最終我們的問題變為:

繼而,根據KKT條件可以得出其中取值的意義為:

這裡的還是拉格朗日乘子(問題通過拉格朗日乘法數來求解)

對於第1種情況,表明是正常分類,在邊界內部(我們知道正確分類的點yi*f(xi)>=0);
對於第2種情況,表明了是支援向量,在邊界上;
對於第3種情況,表明了是在兩條邊界之間;

而最優解需要滿足KKT條件,即上述3個條件都得滿足,以下幾種情況出現將會出現不滿足:

<=1但是<C則是不滿足的,而原本=C
>=1但是>0則是不滿足的而原本=0
=1但是=0或者=C則表明不滿足的,而原本應該是0<<C

所以要找出不滿足KKT條件的這些ai,並更新這些ai,但這些ai又受到另外一個約束,即

注:別忘了2.1.1節中,L對a、b求偏導,得到:

因此,我們通過另一個方法,即同時更新ai和aj,要求滿足以下等式:

就能保證和為0的約束。
利用yiai+yjaj=常數,消去ai,可得到一個關於單變數aj的一個凸二次規劃問題,不考慮其約束0<=aj<=C,可以得其解為:

這裡,,表示舊值。
然後考慮約束0<=aj<=C可得到a的解析解為:


把SMO中對於兩個引數求解過程看成線性規劃來理解來理解的話,那麼下圖所表達的便是約束條件:




根據yi和yj同號或異號,可得出兩個拉格朗日乘子的上下界分別為:

對於。
那麼如何求得ai和aj呢?

對於ai,即第一個乘子,可以通過剛剛說的那3種不滿足KKT的條件來找;
而對於第二個乘子aj可以找滿足條件 :求得。

而b的更新則是:



在滿足下述條件:



下更新b,且每次更新完兩個乘子的優化後,都需要再重新計算b,及對應的Ei值。
最後更新所有ai,y和b,這樣模型就出來了,從而即可求出咱們開頭提出的分類函式

此外,這裡也有一篇類似的文章,大家可以參考下。

3.5.2、SMO演算法的步驟
這樣,SMO的主要步驟如下:

意思是,

第一步選取一對和,選取方法使用啟發式方法;
第二步,固定除和之外的其他引數,確定W極值條件下的,由表示。

假定在某一次迭代中,需要更新,對應的拉格朗日乘子,,那麼這個小規模的二次規劃問題寫為:

那麼在每次迭代中,如何更新乘子呢?引用這裡的兩張PPT說明下:

知道了如何更新乘子,那麼選取哪些乘子進行更新呢?具體選擇方法有以下兩個步驟:

步驟1:先“掃描”所有乘子,把第一個違反KKT條件的作為更新物件,令為a2;
步驟2:在所有不違反KKT條件的乘子中,選擇使|E1 −E2|最大的a1(注:別忘了,其中,而,求出來的E代表函式ui對輸入xi的預測值與真實輸出類標記yi之差)。

值得一提的是,每次更新完兩個乘子的優化後,都需要再重新計算b,及對應的Ei值。
與此同時,乘子的選擇務必遵循兩個原則:

使乘子能滿足KKT條件
對一個滿足KKT條件的乘子進行更新,應能最大限度增大目標函式的值(類似於梯度下降)

綜上,SMO演算法的基本思想是將Vapnik在1982年提出的Chunking方法推到極致,SMO演算法每次迭代只選出兩個分量ai和aj進行調整,其它分量則保持固定不變,在得到解ai和aj之後,再用ai和aj改進其它分量。與通常的分解演算法比較,儘管它可能需要更多的迭代次數,但每次迭代的計算量比較小,所以該演算法表現出整理的快速收斂性,且不需要儲存核矩陣,也沒有矩陣運算。

3.5.3、SMO演算法的實現

行文至此,我相信,SVM理解到了一定程度後,是的確能在腦海裡從頭至尾推匯出相關公式的,最初分類函式,最大化分類間隔,max1/||w||,min1/2||w||^2,凸二次規劃,拉格朗日函式,轉化為對偶問題,SMO演算法,都為尋找一個最優解,一個最優分類平面。一步步梳理下來,為什麼這樣那樣,太多東西可以追究,最後實現。如下圖所示:

至於下文中將闡述的核函式則為是為了更好的處理非線性可分的情況,而鬆弛變數則是為了糾正或約束少量“不安分”或脫離集體不好歸類的因子。

臺灣的林智仁教授寫了一個封裝SVM演算法的libsvm庫,大家可以看看,此外這裡還有一份libsvm的註釋文件。

除了在這篇論文《fast training of support vector machines using sequential minimal optimization》中platt給出了SMO演算法的邏輯程式碼之外,這裡也有一份SMO的實現程式碼,大家可以看下。
其餘更多請參看文末參考文獻和推薦閱讀中的條目6《支援向量機--演算法、理論和擴充套件》和條目11《統計學習方法》的相關章節,或跳至下文3.4節。

3.6、SVM的應用

或許我們已經聽到過,SVM在很多諸如文字分類,影象分類,生物序列分析和生物資料探勘,手寫字元識別等領域有很多的應用,但或許你並沒強烈的意識到,SVM可以成功應用的領域遠遠超出現在已經在開發應用了的領域。

3.6.1、文字分類

一個文字分類系統不僅是一個自然語言處理系統,也是一個典型的模式識別系統,系統的輸入是需要進行分類處理的文字,系統的輸出則是與文字關聯的類別。由於篇幅所限,其它更具體內容本文將不再詳述。

OK,本節雖取標題為證明SVM,但聰明的讀者們想必早已看出,其實本部分並無多少證明部分(特此致歉),怎麼辦呢?可以參閱《支援向量機導論》一書,此書精簡而有趣。本節完。

讀者評論
本文發表後,微博上的很多朋友給了不少意見,以下是節選的一些精彩評論:

“壓力”陡增的評論→//@藏了個鋒:我是看著July大神的博文長大的啊//@zlkysl:就是看了最後那一篇才決定自己的研究方向為SVM的。--http://weibo.com/1580904460/zraWk0u6u?mod=weibotime。
@張金輝:“SVM的三重境界,不得不轉的一篇。其實Coursera的課堂上Andrew Ng講過