SVM

1、what

SVM是一種二類分類模型,其基本模型定義爲特徵空間上的間隔最大的線性分類器,即支持向量機的學習策略便是間隔最大化。或者簡單的可以理解爲就是在高維空間中尋找一個合理的超平面將數據點分隔開來,其中涉及到非線性數據到高維的映射以達到數據線性可分的目的。

2、SVM 基本概念

將實例的特徵向量(以二維爲例)映射爲空間中的一些點,就是如下圖的實心點和空心點,它們屬於不同的兩類。那麼 SVM 的目的就是想要畫出一條線,以“最好地”區分這兩類點,以至如果以後有了新的點,這條線也能做出很好的分類。

在這裏插入圖片描述

  • 能夠畫出多少條線對樣本點進行區分?:線是有無數條可以畫的,區別就在於效果好不好。比如綠線就不好,藍線還湊合,紅線看起來就比較好。我們所希望找到的這條效果最好的線叫作劃分超平面
  • 爲什麼要叫作“超平面”呢?:因爲樣本的特徵很可能是高維的,此時樣本空間的劃分就需要“超平面”
  • 畫線的標準是什麼?/ 什麼才叫這條線的效果好?:SVM 將會尋找可以區分兩個類別並且能使邊際(margin)最大的超平面(hyper plane),即劃分超平面。
  • 邊際(margin)是什麼?:邊際就是某一條線距離它兩側最近的點的距離之和。比如下圖中兩條虛線構成的帶狀區域就是 margin,虛線是由距離中央實線最近的兩個點所確定出來的。但此時 margin 比較小,如果用第二種方式畫,margin 明顯變大也更接近我們的目標。

  • 爲什麼要讓 margin 儘量大?:因爲大 margin 犯錯的機率比較小
  • 如何選取使邊際最大的超平面 (Max Margin Hyperplane,簡稱 MMH)?:超平面到一側最近點的距離等於到另一側最近點的距離,兩側的兩個超平面平行
  • SVM 算法特性:訓練好的模型的算法複雜度是由支持向量的個數決定的,而不是由數據的維度決定的。所以 SVM 不太容易產生 overfitting。SVM 訓練出來的模型完全依賴於支持向量,即使訓練集裏面所有非支持向量的點都被去除,重複訓練過程,結果仍然會得到完全一樣的模型。一個 SVM 如果訓練得出的支持向量個數比較少,那麼SVM 訓練出的模型比較容易被泛化。

3、最優化目標

SVM

從上圖中我們可以看到,SVM會最大化間距,也就是那個m。但是,你可能會疑惑,上面的直線都怎麼得出來的,m等於什麼?我現在給你一個關於原點到直線距離的公式:

                                                            

現在,我們已經得到了間距,我們的SVM是想要最大化這個間距,也就是最小化。你可能會想這so easy啊,使w=0w=0不就ok了嗎!但是,大家別忘了,我們求這個最小值是有約束的,也就是要分開我們的訓練樣本。約束如下:

                                                              

上面公式中的ii表示第ii個訓練樣本。我們可以把上面的分段函數寫的更加緊湊一些,如下:

                                                                          

現在,我們可以總結一下SVM最優化目標了:

                                                                   

4、SVM優化的對偶問題

       對於SVM,前面提到,其primal problem是以下形式:

                                                                  

       同樣的方法引入拉格朗日乘子,我們就可以得到以下拉格朗日函數:

                                                     

        然後對L(w, b, α)分別求w和b的極值。也就是L(w, b,α)對w和b的梯度爲0:∂L/∂w=0和∂L/∂b=0,還需要滿足α>=0。求解這裏導數爲0的式子可以得到:

                                                                               

       然後再代入拉格朗日函數後,就變成:

                                       

        這個就是dual problem(如果我們知道α,我們就知道了w。反過來,如果我們知道w,也可以知道α)。這時候我們就變成了求對α的極大,即是關於對偶變量α的優化問題(沒有了變量w,b,只有α)。當求解得到最優的α*後,就可以同樣代入到上面的公式,導出w*和b*了,最終得出分離超平面和分類決策函數。也就是訓練好了SVM。那來一個新的樣本x後,就可以這樣分類了:

                                                                

       在這裏,其實很多的αi都是0,也就是說w只是一些少量樣本的線性加權值。這種“稀疏”的表示實際上看成是KNN的數據壓縮的版本。也就是說,以後新來的要分類的樣本首先根據w和b做一次線性運算,然後看求的結果是大於0還是小於0來判斷正例還是負例。現在有了αi,我們不需要求出w,只需將新來的樣本和訓練數據中的所有樣本做內積和即可。那有人會說,與前面所有的樣本都做運算是不是太耗時了?其實不然,我們從KKT條件中得到,只有支持向量的αi不爲0,其他情況αi都是0。因此,我們只需求新來的樣本和支持向量的內積,然後運算即可。這種寫法爲下面要提到的核函數(kernel)做了很好的鋪墊。如下圖所示:

                                                             

 

5、鬆弛向量與軟間隔最大化

       我們之前討論的情況都是建立在樣本的分佈比較優雅和線性可分的假設上,在這種情況下可以找到近乎完美的超平面對兩類樣本進行分離。但如果遇到下面這兩種情況呢?左圖,負類的一個樣本點A不太合羣,跑到正類這邊了,這時候如果按上面的確定分類面的方法,那麼就會得到左圖中紅色這條分類邊界,嗯,看起來不太爽,好像全世界都在將就A一樣。還有就是遇到右圖的這種情況。正類的一個點和負類的一個點都跑到了別人家門口,這時候就找不到一條直線來將他們分開了,那這時候怎麼辦呢?我們真的要對這些零丁的不太聽話的離羣點屈服和將就嗎?就因爲他們的不完美改變我們原來完美的分界面會不會得不償失呢?但又不得不考慮他們,那怎樣才能折中呢?

                                      

       對於上面說的這種偏離正常位置很遠的數據點,我們稱之爲 outlier,它有可能是採集訓練樣本的時候的噪聲,也有可能是某個標數據的大叔打瞌睡標錯了,把正樣本標成負樣本了。那一般來說,如果我們直接忽略它,原來的分隔超平面還是挺好的,但是由於這個 outlier 的出現,導致分隔超平面不得不被擠歪了,同時 margin 也相應變小了。當然,更嚴重的情況是,如果出現右圖的這種outlier,我們將無法構造出能將數據線性分開的超平面來。

      爲了處理這種情況,我們允許數據點在一定程度上偏離超平面。也就是允許一些點跑到H1和H2之間,也就是他們到分類面的間隔會小於1。如下圖:

                                                       

       具體來說,原來的約束條件就變爲:

                                                              

        這時候,我們在目標函數裏面增加一個懲罰項,新的模型就變成(也稱軟間隔):

                                                      

       引入非負參數ξi後(稱爲鬆弛變量),就允許某些樣本點的函數間隔小於1,即在最大間隔區間裏面,或者函數間隔是負數,即樣本點在對方的區域中。而放鬆限制條件後,我們需要重新調整目標函數,以對離羣點進行處罰,目標函數後面加上的第二項就表示離羣點越多,目標函數值越大,而我們要求的是儘可能小的目標函數值。這裏的C是離羣點的權重,C越大表明離羣點對目標函數影響越大,也就是越不希望看到離羣點。這時候,間隔也會很小。我們看到,目標函數控制了離羣點的數目和程度,使大部分樣本點仍然遵守限制條件。

        這時候,經過同樣的推導過程,我們的對偶優化問題變成:

                                                             

       此時,我們發現沒有了參數ξi,與之前模型唯一不同在於αi又多了αi<=C的限制條件。需要提醒的是,b的求值公式也發生了改變,改變結果在SMO算法裏面介紹。

如果C值很大,我們的鬆弛變量ξiξi就會很小,我們允許的誤差也就很小,因此分類器會盡量正確分類樣本,結果我們就會得到一個小間距的超平面,這樣的結果可能會導致在新樣本的分類性能很差,而在訓練集上的分類性能很好,也就是出現過擬合(overfitting)現象;如果C值很小,我們所允許的誤差也就很大,分類器即使要錯誤地分類樣本,它也會找尋大間距的超平面,在這種情況下,如果你的訓練集是線性可分的,也有可能出現錯誤分類的樣本。

6、核函數

       如果我們的正常的樣本分佈如下圖左邊所示,之所以說是正常的指的是,不是上面說的那樣由於某些頑固的離羣點導致的線性不可分。它是真的線性不可分。樣本本身的分佈就是這樣的,如果也像樣本那樣,通過鬆弛變量硬拉一條線性分類邊界出來,很明顯這條分類面會非常糟糕。那怎麼辦呢?SVM對線性可分數據有效,對不可分的有何應對良策呢?是核方法(kernel trick)大展身手的時候了。 

                                                   

       如上圖右,如果我們可以把我們的原始樣本點通過一個變換,變換到另一個特徵空間,在這個特徵空間上是線性可分的,那麼上面的SVM就可以輕易工作了。也就是說,對於不可分的數據,現在我們要做兩個工作:

1)首先使用一個非線性映射Φ(x)將全部原始數據x變換到另一個特徵空間,在這個空間中,樣本變得線性可分了;

2)然後在特徵空間中使用SVM進行學習分類。

       好了,第二個工作沒什麼好說的,和前面的一樣。那第一個粗重活由誰來做呢?它就是核函數,不僅具備這種超能力,同時又不會增加太多計算量的兩全其美的方法。

 

現在,你回去看看我們那個dual problem的最大化目標函數,訓練集中的數據樣本僅僅是計算兩點之間的內積。因此,只要我們能計算特徵空間上的內積,我們就不需要顯示地映射數據。下面,用我上面那幅圖中的映射舉個例子。

我們最初樣本的輸入空間爲:

                                                                                    


用映射函數ϕϕ映射以後的結果爲:

                                                                   


現在,我們隨機挑選出2個映射以後的樣本做內積:

                               

最後,如果我們定義一個核函數K(如下),我們就不需要顯示地映射樣本數據:

                                                                     

當然了,核函數有很多種,相信用過SVM的人都知道有什麼樣的核函數,這裏我就不去介紹不同的核函數了。假定你現在選擇了一個合適的核函數KK,現在我們要修改一下dual problem中的優化目標,如下:

                                                         
現在,我挑選出一個測試集中的樣本zz來做一下分類:

                                                            

在實際應用中,我建議大家先試試低階多項式核或者RBF核,這兩個核都 是很好的選擇。

7、多類分類之SVM

       SVM是一種典型的兩類分類器,即它只回答屬於正類還是負類的問題。而現實中要解決的問題,往往是多類的問題。那如何由兩類分類器得到多類分類器呢?

“一對多”的方法

       One-Against-All這個方法還是比較容易想到的。就是每次仍然解一個兩類分類的問題。比如我們5個類別,第一次就把類別1的樣本定爲正樣本,其餘2,3,4,5的樣本合起來定爲負樣本,這樣得到一個兩類分類器,它能夠指出一個樣本是還是不是第1類的;第二次我們把類別2 的樣本定爲正樣本,把1,3,4,5的樣本合起來定爲負樣本,得到一個分類器,如此下去,我們可以得到5個這樣的兩類分類器(總是和類別的數目一致)。到了有樣本需要分類的時候,我們就拿着這個樣本挨個分類器的問:是屬於你的麼?是屬於你的麼?哪個分類器點頭說是了,文章的類別就確定了。這種方法的好處是每個優化問題的規模比較小,而且分類的時候速度很快(只需要調用5個分類器就知道了結果)。但有時也會出現兩種很尷尬的情況,例如拿這個樣本問了一圈,每一個分類器都說它是屬於它那一類的,或者每一個分類器都說它不是它那一類的,前者叫分類重疊現象,後者叫不可分類現象。分類重疊倒還好辦,隨便選一個結果都不至於太離譜,或者看看這篇文章到各個超平面的距離,哪個遠就判給哪個。不可分類現象就着實難辦了,只能把它分給第6個類別了……更要命的是,本來各個類別的樣本數目是差不多的,但“其餘”的那一類樣本數總是要數倍於正類(因爲它是除正類以外其他類別的樣本之和嘛),這就人爲的造成了上一節所說的“數據集偏斜”問題。

       如下圖左。紅色分類面將紅色與其他兩種顏色分開,綠色分類面將綠色與其他兩種顏色分開,藍色分類面將藍色與其他兩種顏色分開。                                                                                                                                                                                                                          

       在這裏的對某個點的分類實際上是通過衡量這個點到三個決策邊界的距離,因爲到分類面的距離越大,分類越可信嘛。當然了,這個距離是有符號的,如下所示:

                                                      

       例如下圖左,將星星這個點劃分給綠色這一類。右圖將星星這個點劃分給褐色這一類。                                                                                                       

“一對一”的方法

       One-Against-One方法是每次選一個類的樣本作正類樣本,而負類樣本則變成只選一個類(稱爲“一對一單挑”的方法,哦,不對,沒有單挑,就是“一對一”的方法,呵呵),這就避免了偏斜。因此過程就是算出這樣一些分類器,第一個只回答“是第1類還是第2類”,第二個只回答“是第1類還是第3類”,第三個只回答“是第1類還是第4類”,如此下去,你也可以馬上得出,這樣的分類器應該有5 X 4/2=10個(通式是,如果有k個類別,則總的兩類分類器數目爲k(k-1)/2)。雖然分類器的數目多了,但是在訓練階段(也就是算出這些分類器的分類平面時)所用的總時間卻比“一類對其餘”方法少很多,在真正用來分類的時候,把一個樣本扔給所有分類器,第一個分類器會投票說它是“1”或者“2”,第二個會說它是“1”或者“3”,讓每一個都投上自己的一票,最後統計票數,如果類別“1”得票最多,就判這篇文章屬於第1類。這種方法顯然也會有分類重疊的現象,但不會有不可分類現象,因爲總不可能所有類別的票數都是0。如下圖右,中間紫色的塊,每類的得票數都是1,那就不知道歸類給那個類好了,只能隨便扔給某個類了(或者衡量這個點到三個決策邊界的距離,因爲到分類面的距離越大,分類越可信嘛),扔掉了就是你命好,扔錯了就不lucky了。

                                       

 

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