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

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


鏈接:http://blog.csdn.net/v_july_v/article/details/7624837

作者:July 。致謝:pluskid、白石、JerryLead。

說明:本文最初寫於2012年6月,而後不斷反反覆覆修改&優化,修改次數達上百次,最後修改於2016年11月。
聲明:本文於2012年便早已附上所有參考鏈接,並註明是篇“學習筆記”,且寫明具體參考了pluskid等人的文章。文末2013年的PDF是爲證。


前言

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

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

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

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


第一層、瞭解SVM

    支持向量機,因其英文名爲support vector machine,故一般簡稱SVM,通俗來講,它是一種二類分類模型,其基本模型定義爲特徵空間上的間隔最大的線性分類器,其學習策略便是間隔最大化,最終可轉化爲一個凸二次規劃問題的求解。

1.1、分類標準的起源:Logistic迴歸

    理解SVM,咱們必須先弄清楚一個概念:線性分類器。

    給定一些數據點,它們分別屬於兩個不同的類,現在要找到一個線性分類器把這些數據分成兩類。如果用x表示數據點,用y表示類別(y可以取1或者-1,分別代表兩個不同的類),一個線性分類器的學習目標便是要在n維的數據空間中找到一個超平面(hyper plane),這個超平面的方程可以表示爲( wT中的T代表轉置):

                                                           

    可能有讀者對類別取1-1有疑問,事實上,這個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而且要在全部訓練實例上達到這個目標。

    接下來,嘗試把logistic迴歸做個變形。首先,將使用的結果標籤y = 0y = 1替換爲y = -1,y = 1,然後將)中的替換爲b,最後將後面的替換爲(即)。如此,則有了。也就是說除了yy=0變爲y=-1外,線性分類函數跟logistic迴歸的形式化表示沒區別。

    進一步,可以將假設函數中的g(z)做一個簡化,將其簡單映射到y=-1y=1上。映射關係如下:

1.2、線性分類的一個例子

    下面舉個簡單的例子。如下圖所示,現在有一個二維平面,平面上有兩種不同的數據,分別用圈和叉表示。由於這些數據是線性可分的,所以可以用一條直線將這兩類數據分開,這條直線就相當於一個超平面,超平面一邊的數據點所對應的y全是-1 ,另一邊所對應的y全是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將x代入f(x) 中,如果f(x)小於0x類別賦爲-1,如果f(x)大於0x的類別賦爲1。

    接下來的問題是,如何確定這個超平面呢?從直觀上而言,這個超平面應該是最適合分開兩類數據的直線。而判定“最適合”的標準就是這條直線離直線兩邊的數據的間隔最大。所以,得尋找有着最大間隔的超平面。

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

    在超平面w*x+b=0確定的情況下,|w*x+b|能夠表示點x到距離超平面的遠近,而通過觀察w*x+b的符號與類標記y的符號是否一致可判斷分類是否正確,所以,可以用(y*(w*x+b))的正負性來判定或表示分類的正確性。於此,我們便引出了函數間隔(functional margin)的概念。

    定義函數間隔(用表示)爲:

 

    而超平面(wb)關於T中所有樣本點(xiyi)的函數間隔最小值(其中,x是特徵,y是結果標籤,i表示第i個樣本),便爲超平面(w, b)關於訓練數據集T的函數間隔

    mini  (i=1,...n)

    但這樣定義的函數間隔有問題,即如果成比例的改變wb(如將它們改成2w2b),則函數間隔的值f(x)卻變成了原來的2(雖然此時超平面沒有改變),所以只有函數間隔還遠遠不夠。

    事實上,我們可以對法向量w加些約束條件,從而引出真正定義點到超平面的距離--幾何間隔(geometrical margin)的概念。

    假定對於一個點 ,令其垂直投影到超平面上的對應點爲 x0 是垂直於超平面的一個向量,爲樣本x到超平面的距離,如下圖所示:

    根據平面幾何知識,有

    其中||w||爲w的二階範數(範數是一個類似於模的表示長度的概念),是單位向量(一個向量除以它的模稱之爲單位向量)。

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

    隨即讓此式的兩邊同時乘以,再根據,即可算出 


γ

 爲了得到的絕對值,令乘上對應的類別 y即可得出幾何間隔(用表示)的定義

    從上述函數間隔和幾何間隔的定義可以看出:幾何間隔就是函數間隔除以||w||,而且函數間隔y*(wx+b) = y*f(x)實際上就是|f(x)|,只是人爲定義的一個間隔度量,而幾何間隔|f(x)|/||w||纔是直觀上的點到超平面的距離。

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

    對一個數據點進行分類,當超平面離數據點的“間隔”越大,分類的確信度(confidence)也越大。所以,爲了使得分類的確信度儘量高,需要讓所選擇的超平面能夠最大化這個“間隔”值。這個間隔就是下圖中的Gap的一半

    通過由前面的分析可知:函數間隔不適合用來最大化間隔值,因爲在超平面固定以後,可以等比例地縮放w的長度和b的值,這樣可以使得的值任意大,亦即函數間隔可以在超平面保持不變的情況下被取得任意大。但幾何間隔因爲除上了,使得在縮放wb的時候幾何間隔的值是不會改變的,它只隨着超平面的變動而變動,因此,這是更加合適的一個間隔。換言之,這裏要找的最大間隔分類超平面中的“間隔”指的是幾何間隔。

   於是最大間隔分類器(maximum margin classifier)的目標函數可以定義爲:

    同時需滿足一些條件,根據間隔的定義,有

    其中,s.t.,即subject to的意思,它導出的是約束條件

    回顧下幾何間隔的定義可知:如果令函數間隔等於1(之所以令等於1,是爲了方便推導和優化,且這樣做對目標函數的優化沒有影響,至於爲什麼,請見本文評論下第42樓回覆,則有 = 1 / ||w||且,從而上述目標函數轉化成了

    相當於在相應的約束條件下,最大化這個1/||w||,而1/||w||便是幾何間隔。   

    如下圖所示,中間的實線便是尋找到的最優超平面(Optimal Hyper Plane),其到兩條虛線邊界的距離相等,這個距離便是幾何間隔,兩條虛線間隔邊界之間的距離等於2,而虛線間隔邊界上的點則是支持向量。由於這些支持向量剛好在虛線間隔邊界上,所以它們滿足還記得我們把 functional margin 定爲 1 了嗎?上節中:處於方便推導和優化的目的,我們可以令=1),而對於所有不是支持向量的點,則顯然有

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


第二層、深入SVM

2.1、從線性可分到線性不可分

2.1.1、從原始問題到對偶問題的求解

    接着考慮之前得到的目標函數:

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

    因爲現在的目標函數是二次的,約束條件是線性的,所以它是一個凸二次規劃問題。這個問題可以用現成的QP (Quadratic Programming) 優化包進行求解。一言以蔽之:在一定的約束條件下,目標最優,損失最小。

    此外,由於這個問題的特殊結構,還可以通過拉格朗日對偶性(Lagrange Duality)變換到對偶變量 (dual variable) 的優化問題,即通過求解與原問題等價的對偶問題(dual problem得到原始問題的最優解,這就是線性可分條件下支持向量機的對偶算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函數,進而推廣到非線性分類問題。

     那什麼是拉格朗日對偶性呢?簡單來講,通過給每一個約束條件加上一個拉格朗日乘子(Lagrange multiplier),定義拉格朗日函數(通過拉格朗日函數將約束條件融合到目標函數裏去,從而只用一個函數表達式便能清楚的表達出我們的問題

    然後令

    容易驗證,當某個約束條件不滿足時,例如,那麼顯然有只要令即可)。而當所有約束條件都滿足時,則最優值爲亦即最初要最小化的量。

    因此,在要求約束條件得到滿足的情況下最小化實際上等價於直接最小化(當然,這裏也有約束條件,就是0,i=1,,n)   ,因爲如果約束條件沒有得到滿足,會等於無窮大,自然不會是我們所要求的最小值。

    具體寫出來,目標函數變成了:

    這裏用表示這個問題的最優值,且和最初的問題是等價的。如果直接求解,那麼一上來便得面對w和b兩個參數,而又是不等式約束,這個求解過程不好做。不妨把最小和最大的位置交換一下,變成:

    交換以後的新問題是原始問題的對偶問題,這個新問題的最優值用來表示。而且有,在滿足某些條件的情況下,這兩者相等,這個時候就可以通過求解對偶問題來間接地求解原始問題。

    換言之,之所以從minmax的原始問題,轉化爲maxmin的對偶問題,一者因爲的近似解,二者,轉化爲對偶問題後,更容易求解。

    下面可以先求wb的極小,再求的極大。

2.1.2、KKT條件

    上文中提到“在滿足某些條件的情況下,兩者等價”,這所謂的“滿足某些條件”就是要滿足KKT條件

  勘誤:經讀者qq_28543029指出,這裏的條件不應該是KKT條件,要讓兩者等價需滿足strong duality (強對偶),而後有學者在強對偶下提出了KKT條件,且KKT條件的成立要滿足constraint qualifications,而constraint qualifications之一就是Slater條件。所謂Slater 條件,即指:凸優化問題,如果存在一個點x,使得所有等式約束都成立,並且所有不等式約束都嚴格成立(即取嚴格不等號,而非等號),則滿足Slater 條件。對於此處,Slater 條件成立,所以d*≤p*可以取等號。

    一般地,一個最優化數學模型能夠表示成下列標準形式:

    其中,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)問題能有最優化解法的必要和充分條件。

    而KKT條件就是指上面最優化數學模型的標準形式中的最小點 x* 必須滿足下面的條件:

    經過論證,我們這裏的問題是滿足 KKT 條件的首先已經滿足Slater條件,再者fgi也都是可微的,即Lwb都可導),因此現在我們便轉化爲求解第二個問題。

    也就是說,原始問題通過滿足KKT條件,已經轉化成了對偶問題。而求解這個對偶學習問題,分爲3個步驟:首先要讓L(wba) 關於 和 最小化,然後求對的極大,最後利用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(

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

    (2)、求對的極大即是關於對偶問題的最優化問題。經過上面第一個步驟的求w和b,得到的拉格朗日函數式子已經沒有了變量w,b,只有。從上面的式子得到:

    這樣,求出了,根據即可求出w,然後通過即可求出b,最終得出分離超平面和分類決策函數。

    (3)在求得L(w, b, a) 關於 和 最小化,以及對的極大之後,最後一步則可以利用SMO算法求解對偶問題中的拉格朗日乘子

       上述式子要解決的是在參數上求最大值W的問題,至於都是已知數要了解這個SMO算法是如何推導的,請跳到下文第3.5節、SMO算法。
    到目前爲止,我們的 SVM 還比較弱,只能處理線性的情況,下面我們將引入核函數,進而推廣到非線性分類問題。

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 的處理方法是選擇一個核函數 κ(⋅,⋅) ,通過將數據映射到高維空間,來解決在原始空間中線性不可分的問題。

    具體來說,在線性不可分的情況下,支持向量機首先在低維空間中完成計算,然後通過核函數將輸入空間映射到高維特徵空間,最終在高維特徵空間中構造出最優分離超平面,從而把平面上本身不好分的非線性數據分開。如圖7-7所示,一堆數據在二維空間無法劃分,從而映射到三維空間裏劃分


    而在我們遇到核函數之前,如果用原始的方法,那麼在用線性學習器學習一個非線性關係,需要選擇一個非線性特徵集,並且將數據寫成新的表達形式,這等價於應用一個固定的非線性映射,將數據映射到特徵空間,在特徵空間中使用線性學習器,因此,考慮的假設集是這種類型的函數:
    這裏ϕ:X->F是從輸入空間到某個特徵空間的映射,這意味着建立非線性學習器分爲兩步:
  1. 首先使用一個非線性映射將數據變換到一個特徵空間F,
  2. 然後在特徵空間使用線性學習器分類。
    而由於對偶形式就是線性學習器的一個重要性質,這意味着假設可以表達爲訓練點的線性組合,因此決策規則可以用測試點和訓練點的內積來表示:
    如果有一種方式可以在特徵空間中直接計算內積φ(xi · φ(x),就像在原始輸入點的函數中一樣,就有可能將兩個步驟融合到一起建立一個非線性的學習器,這樣直接計算法的方法稱爲核函數方法:
    核是一個函數K,對所有x,z(-X,滿足,這裏φ是從X到內積特徵空間F的映射。

2.2.2、核函數:如何處理非線性數據

    來看個核函數的例子。如下圖所示的兩類數據,分別分佈爲兩個圓圈的形狀,這樣的數據本身就是線性不可分的,此時咱們該如何把這兩類數據分開呢(下文將會有一個相應的三維空間圖)?

  

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

    注意上面的形式,如果我們構造另外一個五維的空間,其中五個座標的值分別爲 Z1=X1Z2=X21Z3=X2Z4=X22Z5=X1X2,那麼顯然,上面的方程在新的座標系下可以寫作:

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

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

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

    核函數相當於把原來的分類函數:

    映射成:

    而其中的可以通過求解如下 dual 問題而得到的:

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

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

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

    另外,我們又注意到:

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

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

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

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

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

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

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

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

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

2.2.3、幾個核函數

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

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

2.2.4、核函數的本質

        上面說了這麼一大堆,讀者可能還是沒明白核函數到底是個什麼東西?我再簡要概括下,即以下三點:
  1. 實際中,我們會經常遇到線性不可分的樣例,此時,我們的常用做法是把樣例特徵映射到高維空間中去(如上文2.2節最開始的那幅圖所示,映射到高維空間後,相關特徵便被分開了,也就達到了分類的目的);
  2. 但進一步,如果凡是遇到線性不可分的樣例,一律映射到高維空間,那麼這個維度大小是會高到可怕的(如上文中19維乃至無窮維的例子)。那咋辦呢?
  3. 此時,核函數就隆重登場了,核函數的價值在於它雖然也是將特徵進行從低維到高維的轉換,但核函數絕就絕在它事先在低維上進行計算,而將實質上的分類效果表現在了高維上,也就如上文所說的避免了直接在高維空間中的複雜計算。

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

    假設現在你是一個農場主,圈養了一批羊羣,但爲預防狼羣襲擊羊羣,你需要搭建一個籬笆來把羊羣圍起來。但是籬笆應該建在哪裏呢?你很可能需要依據牛羣和狼羣的位置建立一個“分類器”,比較下圖這幾種不同的分類器,我們可以看到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個點,可以使用無數條曲線來擬合。要求樣本回歸函數儘可能好地擬合這組值。綜合起來看,這條直線處於樣本數據的中心位置最合理。 
    選擇最佳擬合曲線的標準可以確定爲:使總的擬合誤差(即總殘差)達到最小。有以下三個標準可以選擇:        
  1. 用“殘差和最小”確定直線位置是一個途徑。但很快發現計算“殘差和”存在相互抵消的問題。
  2. 用“殘差絕對值和最小”確定直線位置也是一個途徑。但絕對值的計算比較麻煩。
  3. 最小二乘法的原則是以“殘差平方和最小”確定直線位置。用最小二乘法除了計算比較方便外,得到的估計量還具有優良特性。這種方法對異常值非常敏感。  
     最常用的是普通最小二乘法( Ordinary  Least Square,OLS):所選擇的迴歸模型應該使所有觀察值的殘差平方和達到最小,即採用平方損失函數。  
     我們定義樣本回歸模型爲:

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

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

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

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

   OK,更多請參看陳希孺院士的《數理統計學簡史》的第4章、最小二乘法。

3.5、SMO算法

    在上文中,我們提到了求解對偶問題的序列最小最優化SMO算法,但並未提到其具體解法。首先看下最後懸而未決的問題:

    等價於求解:

    1998年,Microsoft Research的John C. Platt在論文《Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines》中提出針對上述問題的解法:SMO算法,它很快便成爲最快的二次規劃優化算法,特別是在針對線性SVM和數據稀疏時性能更優。

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

3.5.1、SMO算法的推導

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

    注:這個u與我們之前定義的實質是一樣的。

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

    求導得到:

    代入中,可得

    通過引入拉格朗日乘子轉換爲對偶問題後,得:

   s.t:

    注:這裏得到的min函數與我們之前的max函數實質也是一樣,因爲把符號變下,即由min轉化爲max的問題,且yi也與之前的等價,yj亦如此。

    經過加入鬆弛變量後,模型修改爲:

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

    下面要解決的問題是:在上求上述目標函數的最小值。爲了求解這些乘子,每次從中任意抽取兩個乘子,然後固定以外的其它乘子,使得目標函數只是關於的函數。這樣,不斷的從一堆乘子中任意抽取兩個求解,不斷的迭代求解子問題,最終達到求解原問題的目的。

    而原對偶問題的子問題的目標函數可以表達爲:

    其中

    爲了解決這個子問題,首要問題便是每次如何選取。實際上,其中一個乘子是違法KKT條件最嚴重的,另外一個乘子則由另一個約束條件選取。

    根據KKT條件可以得出目標函數中取值的意義:

    這裏的還是拉格朗日乘子:
  1. 對於第1種情況,表明是正常分類,在間隔邊界內部(我們知道正確分類的點);
  2. 對於第2種情況,表明了是支持向量,在間隔邊界上;
  3. 對於第3種情況,表明了是在兩條間隔邊界之間;
    而最優解需要滿足KKT條件,即上述3個條件都得滿足,以下幾種情況出現將會出現不滿足:
  • <=1但是<C則是不滿足的,而原本=C
  • >=1但是>0則是不滿足的,而原本=0
  • =1但是=0或者=C則表明不滿足的,而原本應該是0<<C
    也就是說,如果存在不滿足KKT條件的,那麼需要更新這些,這是第一個約束條件。此外,更新的同時還要受到第二個約束條件的限制,即

    因此,如果假設選擇的兩個乘子,它們在更新之前分別是,更新之後分別是,那麼更新前後的值需要滿足以下等式才能保證和爲0的約束:

    其中,是常數。
    兩個因子不好同時求解,所以可先求第二個乘子的解(),得到的解()之後,再用的解()表示的解()。

    爲了求解,得先確定的取值範圍。假設它的上下邊界分別爲HL,那麼有:

    接下來,綜合這兩個約束條件,求取的取值範圍。

    當y1 != y2時,根據可得,所以有,如下圖所示:

    當y1 = y2時,同樣根據可得:,所以有,如下圖所示:

    如此,根據y1和y2異號或同號,可得出的上下界分別爲:
    回顧下第二個約束條件,令上式兩邊乘以y1,可得
    其中,
    因此可以用表示,,從而把子問題的目標函數轉換爲只含的問題:

    對求導,可得

    化簡下:

    然後將、和代入上式可得:


    令(表示預測值與真實值之差),,然後上式兩邊同時除以,得到一個關於單變量的解:

    這個解沒有考慮其約束條件,即是未經剪輯時的解。
    然後考慮約束可得到經過剪輯後的的解析解爲:
    求出了後,便可以求出,得
    那麼如何選擇乘子呢?
  • 對於,即第一個乘子,可以通過剛剛說的那3種不滿足KKT的條件來找;
  • 而對於第二個乘子可以尋找滿足條件 :的乘子。
    而b在滿足下述條件:
    下更新b:
    且每次更新完兩個乘子的優化後,都需要再重新計算b,及對應的Ei值。
    最後更新所有,y和b,這樣模型就出來了,從而即可求出咱們開頭提出的分類函數:
    此外,這裏也有一篇類似的文章,大家可以參考下。

3.5.2、SMO算法的步驟

    綜上,總結下SMO的主要步驟,如下:
    意思是,
  1. 第一步選取一對,選取方法使用啓發式方法;
  2. 第二步,固定除之外的其他參數,確定W極值條件下的表示。
    假定在某一次迭代中,需要更新對應的拉格朗日乘子,那麼這個小規模的二次規劃問題寫爲:
    那麼在每次迭代中,如何更新乘子呢?引用這裏的兩張PPT說明下:

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

  1. 步驟1:先“掃描”所有乘子,把第一個違反KKT條件的作爲更新對象,令爲a1;
  2. 步驟2:在所有不違反KKT條件的乘子中,選擇使|E1 −E2|最大的a2進行更新,使得能最大限度增大目標函數的值(類似於梯度下降. 此外,而,求出來的E代表函數ui對輸入xi的預測值與真實輸出類標記yi之差)。
    最後,每次更新完兩個乘子的優化後,都需要再重新計算b,及對應的Ei值。

    綜上,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的實現代碼,大家可以看下。

3.6、SVM的應用

    或許我們已經聽到過,SVM在很多諸如文本分類,圖像分類,生物序列分析和生物數據挖掘,手寫字符識別等領域有很多的應用,但或許你並沒強烈的意識到,SVM可以成功應用的領域遠遠超出現在已經在開發應用了的領域。

3.6.1、文本分類

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

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


讀者評論

   本文發表後,微博上的很多朋友給了不少意見,以下是節選的一些精彩評論:
  1. “壓力”陡增的評論→//@藏了個鋒:我是看着July大神的博文長大的啊//@zlkysl:就是看了最後那一篇才決定自己的研究方向爲SVM的。--http://weibo.com/1580904460/zraWk0u6u?mod=weibotime
  2. @張金輝:SVM的三重境界,不得不轉的一篇。其實Coursera的課堂上Andrew Ng講過支持向量機,但顯然他沒有把這作爲重點,加上Ng講支持向量機的方法我一時半會難以完全消化,所以聽的也是一知半解。真正開始瞭解支持向量機就是看的這篇“三重境界”,之後纔對這個算法有了大概的概念,以至如何去使用,再到其中的原理爲何,再到支持向量機的證明等。總之,這篇文章開啓了我長達數月的研究支持向量機階段,直到今日--http://zhan.renren.com/profile/249335584?from=template#!//tag/三重境界
  3. @孤獨之守望者:"最後,推出svm的cost function 是hinge loss,然後對比其他的方法的cost function,說明其實他們的目標函數很像,那麼問題是svm爲什麼這麼popular呢?您可以再加些VC dimension跟一些error bound的數學,點一下,提供一個思路和方向"。--http://weibo.com/1580904460/AiohoyDwq?mod=weibotime
  4. @夏粉_百度:在面試時,考察SVM可考察機器學習各方面能力:目標函數,優化過程,並行方法,算法收斂性,樣本複雜度,適用場景,調參經驗,不過個人認爲考察boosting和LR也還不錯啊。此外,隨着統計機器學習不斷進步,SVM只被當成使用了一個替代01損失hinge研究,更通用的方法被提出,損失函數研究替代損失與貝葉斯損失關係,算法穩定性研究替代損失與推廣性能關係,凸優化研究如何求解凸目標函數,SVM,boosting等算法只是這些通用方法的一個具體組建而已。
  5. @居里猴姐:關於SVM損失函數的問題,可以看看張潼老師的這篇《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使用的損失函數分析的很透徹。
  6. @夏粉_百度:SVM用了hinge損失,hinge損失不可導,不如其它替代損失方便優化並且轉換概率麻煩。核函數也不太用,現在是大數據時代,樣本非常大,無法想象一個n^2的核矩陣如何存儲和計算。 而且,現在現在非線性一般靠深度學習了。//@Copper_PKU:請教svm在工業界的應用典型的有哪些?工業界如何選取核函數,經驗的方法?svm的訓練過程如何優化?
  7. @Copper_PKU:July的svm tutorial 我個人覺得還可以加入和修改如下部分:(1) 對於支持向量解釋,可以結合圖和拉格朗日參數來表達,鬆弛中sv沒有寫出來. (2) SMO算法部分,加入Joachims論文中提到的算法,以及SMO算法選取workset的方法,包括SMO算法的收斂判斷,還有之前共軛梯度求解方法,雖然是較早的算法,但是對於理解SMO算法有很好的效果。模型的優化和求解都是迭代的過程,加入歷史算法增強立體感。--  http://weibo.com/1580904460/Akw6dl3Yk#_rnd1385474436177
  8. //@廖臨川: 之所以sgd對大訓練集的效果更好,1.因爲SGD優化每次迭代使用樣本子集,比使用訓練全集(尤其是百萬數量級)要快得多;2.如果目標函數是凸的或者僞凸的,SGD幾乎必然可以收斂到全局最優;否則,則收斂到局部最優;3.SGD一般不需要收斂到全局最優,只要得到足夠好的解,就可以立即停止。//@Copper_PKU:sgd的核心思想:是迭代訓練,每拿到一個樣本就算出基於當前w(t) 的loss function,t代表訓練第t次,然後進行下一w(t+1)的更新,w(t+1)=w(t)-(learning rate) * loss function的梯度,這個類比神經網絡中bp中的參數訓練方法。 sample by sample就是每次僅處理一個樣本 而不是一個batch。
  9. //@Copper_PKU:從損失函數角度說:primal問題可以理解爲正則化項+lossfunction,求解目標是在兩個中間取平衡 如果強調loss function最小則會overfitting,所以有C參數。 //@研究者July:SVM還真就是在一定限定條件下,即約束條件下求目標函數的最優值問題,同時,爲減少誤判率,儘量讓損失最小。
  10. ...
    非常享受這種全民大討論的年代,沒有誰一定就對或一定就錯,而是各自發表各自的理解見解,真棒!



參考文獻及推薦閱讀

  1. 支持向量機導論》,[英] Nello Cristianini / John Shawe-Taylor 著
  2. 支持向量機導論一書的支持網站:http://www.support-vector.net/
  3. 《數據挖掘導論》,[美] Pang-Ning Tan / Michael Steinbach / Vipin Kumar 著
  4. 《數據挖掘:概念與技術》,(加)Jiawei Han;Micheline Kamber 著;
  5. 《數據挖掘中的新方法:支持向量機》,鄧乃揚 田英傑 著;
  6. 支持向量機--理論、算法和擴展》,鄧乃揚 田英傑 著;
  7. 支持向量機系列pluskidhttp://blog.pluskid.org/?page_id=683
  8. http://www.360doc.com/content/07/0716/23/11966_615252.shtml
  9. 數據挖掘十大經典算法初探
  10. 《模式識別支持向量機指南》,C.J.C Burges 著;
  11. 統計學習方法》,李航著;
  12. 《統計自然語言處理》,宗成慶編著,第十二章、文本分類;
  13. SVM入門系列,Jasper:http://www.blogjava.net/zhenandaci/category/31868.html
  14. 最近鄰決策和SVM數字識別的實現和比較,作者不詳;
  15. 斯坦福大學機器學習課程原始講義:http://www.cnblogs.com/jerrylead/archive/2012/05/08/2489725.html
  16. 斯坦福機器學習課程筆記http://www.cnblogs.com/jerrylead/tag/Machine%20Learning/
  17. http://www.cnblogs.com/jerrylead/archive/2011/03/13/1982639.html
  18. SMO算法的數學推導:http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html
  19. 數據挖掘掘中所需的概率論與數理統計知識、上
  20. 關於機器學習方面的文章,可以讀讀:http://www.cnblogs.com/vivounicorn/category/289453.html
  21. 數學系教材推薦:http://blog.sina.com.cn/s/blog_5e638d950100dswh.html
  22. 《神經網絡與機器學習(原書第三版)》,[加] Simon Haykin 著;
  23. 正態分佈的前世今生:http://t.cn/zlH3Ygc
  24. 數理統計學簡史》,陳希孺院士著;
  25. 《最優化理論與算法(第2版)》,陳寶林編著;
  26. A Gentle Introduction to Support Vector Machines in Biomedicinehttp://www.nyuinformatics.org/downloads/supplements/SVM_Tutorial_2010/Final_WB.pdf,此PPT很贊,除了對引入拉格朗日對偶變量後的凸二次規劃問題的深入度不夠之外,其它都挺好,配圖很精彩,本文有幾張圖便引自此PPT中;
  27. 來自卡內基梅隆大學carnegie mellon university(CMU)的講解SVM的PPT:http://www.autonlab.org/tutorials/svm15.pdf
  28. 發明libsvm的臺灣林智仁教授06年的機器學習講義SVM:http://wenku.baidu.com/link?url=PWTGMYNb4HGUrUQUZwTH2B4r8pIMgLMiWIK1ymVORrds_11VOkHwp-JWab7IALDiors64JW_6mD93dtuWHwFWxsAk6p0rzchR8Qh5_4jWHC
  29. http://staff.ustc.edu.cn/~ketang/PPT/PRLec5.pdf
  30. Introduction to Support Vector Machines (SVM),By Debprakash Patnai M.E (SSA),https://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCwQFjAA&url=http%3a%2f%2fwww%2epws%2estu%2eedu%2etw%2fccfang%2findex%2efiles%2fAI%2fAI%26ML-Support%2520Vector%2520Machine-1%2eppt&ei=JRR6UqT5C-iyiQfWyIDgCg&usg=AFQjCNGw1fTbpH4ltQjjmx1d25ZqbCN9nA
  31. 多人推薦過的libsvmhttp://www.csie.ntu.edu.tw/~cjlin/libsvm/
  32. 《machine learning in action》,中文版爲《機器學習實戰》;
  33. SMO算法的提出:Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machineshttp://research.microsoft.com/en-us/um/people/jplatt/smoTR.pdf
  34. 《統計學習理論的本質》,[美] Vladimir N. Vapnik著,非常晦澀,不做過多推薦;
  35. 張兆翔,機器學習第五講之支持向量機http://irip.buaa.edu.cn/~zxzhang/courses/MachineLearning/5.pdf
  36. VC維的理論解釋:http://www.svms.org/vc-dimension/,中文VC維解釋http://xiaoxia001.iteye.com/blog/1163338
  37. 來自NEC Labs America的Jason Weston關於SVM的講義http://www.cs.columbia.edu/~kathy/cs4701/documents/jason_svm_tutorial.pdf
  38. 來自MIT的SVM講義:http://www.mit.edu/~9.520/spring11/slides/class06-svm.pdf
  39. PAC問題:http://www.cs.huji.ac.il/~shashua/papers/class11-PAC2.pdf
  40. 百度張潼老師的兩篇論文:《Statistical behavior and consistency of classification methods based on convex risk minimization》http://home.olemiss.edu/~xdang/676/Consistency_of_Classification_Convex_Risk_Minimization.pdf,《Statistical analysis of some multi-category large margin classification methods》;
  41. http://jacoxu.com/?p=39
  42. 《矩陣分析與應用》,清華張賢達著;
  43. SMO算法的實現:http://blog.csdn.net/techq/article/details/6171688
  44. 常見面試之機器學習算法思想簡單梳理:http://www.cnblogs.com/tornadomeet/p/3395593.html
  45. 矩陣的wikipedia頁面:http://zh.wikipedia.org/wiki/%E7%9F%A9%E9%98%B5
  46. 最小二乘法及其實現:http://blog.csdn.net/qll125596718/article/details/8248249
  47. 統計學習方法概論:http://blog.csdn.net/qll125596718/article/details/8351337
  48. http://www.csdn.net/article/2012-12-28/2813275-Support-Vector-Machine
  49. A Tutorial on Support Vector Regression:http://alex.smola.org/papers/2003/SmoSch03b.pdf;SVR簡明版:http://www.cmlab.csie.ntu.edu.tw/~cyy/learning/tutorials/SVR.pdf
  50. SVM Orghttp://www.support-vector-machines.org/
  51. R. Collobert. Large Scale Machine Learning. Université Paris VI phd thesis. 2004http://ronan.collobert.com/pub/matos/2004_phdthesis_lip6.pdf
  52. Making Large-Scale SVM Learning Practicalhttp://www.cs.cornell.edu/people/tj/publications/joachims_99a.pdf
  53. 文本分類與SVM:http://blog.csdn.net/zhzhl202/article/details/8197109
  54. Working Set Selection Using Second Order Information
    for Training Support Vector Machineshttp://www.csie.ntu.edu.tw/~cjlin/papers/quadworkset.pdf
  55. SVM Optimization: Inverse Dependence on Training Set Sizehttp://icml2008.cs.helsinki.fi/papers/266.pdf
  56. Large-Scale Support Vector Machines: Algorithms and Theory:http://cseweb.ucsd.edu/~akmenon/ResearchExam.pdf
  57. 凸優化的概念:http://cs229.stanford.edu/section/cs229-cvxopt.pdf
  58. 《凸優化》,作者: Stephen Boyd / Lieven Vandenberghe,原作名: Convex Optimization;
  59. Large-scale Non-linear Classification: Algorithms and Evaluations,Zhuang Wang,講了很多SVM算法的新進展:http://ijcai13.org/files/tutorial_slides/te2.pdf
  60. 基於SMO算法實現SVM:http://www.cs.iastate.edu/~honavar/smo-svm.pdf
  61. copper推薦的一些SVM相關的論文(當然,其中不少論文在上面的條目中都已經提到):http://c.blog.sina.com.cn/profile.php?blogid=68d0b92d89000h35
  62. 在線編輯Latex 公式:http://private.codecogs.com/latex/eqneditor.php?lang=zh-cn


後記

    OK,此文從最初2012年5月開始動筆,到後續不斷的修改,創造了三個之最,即所寫時間最長,所花心血最大,所改次數最多,因爲我的目標是讓沒有任何機器學習基礎的都能看懂此文,所以總是不停的改,不停的改,不想放過任何一個小的細節。再者,引用侯捷的一句話是:天下大作,必作於細。
    最後,非常感謝pluskid及諸多朋友們的文章及著作,讓我有機會在其基礎上總結、深入。有任何問題,敬請廣大讀者隨時不吝批評指正,感謝


updated、本文PDF版

    本文會一直不斷翻新,再者,上述 4 個PDF的閱讀體驗也還不是最好的,如果有朋友製作了更好的PDF,歡迎分享給我:http://weibo.com/julyweibo,謝謝。

    July、二零一六年一月十七日第N次修改(N > 100)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章