SVM-支援向量機詳解(三)

來源:互聯網
上載者:User

之前一直在討論的線性分類器,器如其名,只能對線性可分的樣本做處理。如果提供的樣本線性不可分,結果很簡單,線性分類器的求解程式會無限迴圈,永遠也解不出來。這必然使得它的適用範圍大大縮小,而它的很多優點我們實在不原意放棄,怎麼辦呢?是否有某種方法,讓線性不可分的資料變得線性可分呢?

有!其思想說來也簡單,來用一個二維平面中的分類問題作例子,你一看就會明白。事先聲明,下面這個例子是網路早就有的,我一時找不到原作者的正確資訊,在此借用,並加進了我自己的解說而已。

例子是下面這張圖:

我們把橫軸上端點a和b之間紅色部分裡的所有點定為正類,兩邊的黑色部分裡的點定為負類。試問能找到一個線性函數把兩類正確分開嗎?不能,因為二維空間裡的線性函數就是指直線,顯然找不到合格直線。

但我們可以找到一條曲線,例如下面這一條:

顯然通過點在這條曲線的上方還是下方就可以判斷點所屬的類別(你在橫軸上隨便找一點,算算這一點的函數值,會發現負類的點函數值一定比0大,而正類的一定比0小)。這條曲線就是我們熟知的二次曲線,它的函數運算式可以寫為:

問題只是它不是一個線性函數,但是,下面要注意看了,建立一個向量y和a:

這樣g(x)就可以轉化為f(y)=<a,y>,你可以把y和a分別回帶一下,看看等不等於原來的g(x)。用內積的形式寫你可能看不太清楚,實際上f(y)的形式就是:

g(x)=f(y)=ay

在任意維度空間中,這種形式的函數都是一個線性函數(只不過其中的a和y都是多維向量罷了),因為自變數y的次數不大於1。

看出妙在哪了嗎?原來在二維空間中一個線性不可分的問題,映射到四維空間後,變成了線性可分的!因此這也形成了我們最初想解決線性不可分問題的基本思路——向高維空間轉化,使其變得線性可分。

而轉化最關鍵的部分就在於找到x到y的映射方法。遺憾的是,如何找到這個映射,沒有系統性的方法(也就是說,純靠猜和湊)。具體到我們的文本分類問題,文本被表示為上千維的向量,即使維數已經如此之高,也常常是線性不可分的,還要向更高的空間轉化。其中的難度可想而知。

小Tips:為什麼說f(y)=ay是四維空間裡的函數?

大家可能一時沒看明白。回想一下我們二維空間裡的函數定義
  g(x)=ax+b
變數x是一維的,為什麼說它是二維空間裡的函數呢?因為還有一個變數我們沒寫出來,它的完整形式其實是
  y=g(x)=ax+b

  y=ax+b
看看,有幾個變數?兩個。那是幾維空間的函數?(作者五歲的弟弟答:五維的。作者:……)
再看看
f(y)=ay
裡面的y是三維的變數,那f(y)是幾維空間裡的函數?(作者五歲的弟弟答:還是五維的。作者:……)

用一個具體文本分類的例子來看看這種向高維空間映射從而分類的方法如何運作,想象一下,我們文本分類問題的原始空間是1000維的(即每個要被分類的文檔被表示為一個1000維的向量),在這個維度上問題是線性不可分的。現在我們有一個2000維空間裡的線性函數

f(x’)=<w’,x’>+b

注意向量的右上方有個 ’哦。它能夠將原問題變得可分。式中的 w’和x’都是2000維的向量,只不過w’是定值,而x’是變數(好吧,嚴格說來這個函數是2001維的,哈哈),現在我們的輸入呢,是一個1000維的向量x,分類的過程是先把x變換為2000維的向量x’,然後求這個變換後的向量x’與向量w’的內積,再把這個內積的值和b相加,就得到了結果,看結果大於閾值還是小於閾值就得到了分類結果。

你發現了什嗎?我們其實只關心那個高維空間裡內積的值,那個值算出來了,分類結果就算出來了。而從理論上說, x’是經由x變換來的,因此廣義上可以把它叫做x的函數(有一個x,就確定了一個x’,對吧,確定不出第二個),而w’是常量,它是一個低維空間裡的常量w經過變換得到的,所以給了一個w 和x的值,就有一個確定的f(x’)值與其對應。這讓我們幻想,是否能有這樣一種函數K(w,x),他接受低維空間的輸入值,卻能算出高維空間的內積值<w’,x’>?

如果有這樣的函數,那麼當給了一個低維空間的輸入x以後,

g(x)=K(w,x)+b

f(x’)=<w’,x’>+b

這兩個函數的計算結果就完全一樣,我們也就用不著費力找那個映射關係,直接拿低維的輸入往g(x)裡面代就可以了(再次提醒,這回的g(x)就不是線性函數啦,因為你不能保證K(w,x)這個運算式裡的x次數不高於1哦)。

萬幸的是,這樣的K(w,x)確實存在(發現凡是我們人類能解決的問題,大都是巧得不能再巧,特殊得不能再特殊的問題,總是恰好有些能投機取巧的地方才能解決,由此感到人類的渺小),它被稱作核函數(核,kernel),而且還不止一個,事實上,只要是滿足了Mercer條件的函數,都可以作為核函數。核函數的基本作用就是接受兩個低維空間裡的向量,能夠計算出經過某個變換後在高維空間裡的向量內積值。幾個比較常用的核函數,俄,教課書裡都列過,我就不敲了(懶!)。

回想我們上節說的求一個線性分類器,它的形式應該是:

現在這個就是高維空間裡的線性函數(為了區別低維和高維空間裡的函數和向量,我改了函數的名字,並且給w和x都加上了 ’),我們就可以用一個低維空間裡的函數(再一次的,這個低維空間裡的函數就不再是線性啦)來代替,

又發現什麼了?f(x’) 和g(x)裡的α,y,b全都是一樣一樣的!這就是說,儘管給的問題是線性不可分的,但是我們就硬當它是線性問題來求解,只不過求解過程中,凡是要求內積的時候就用你選定的核函數來算。這樣求出來的α再和你選定的核函數一組合,就得到分類器啦!

明白了以上這些,會自然的問接下來兩個問題:

1. 既然有很多的核函數,針對具體問題該怎麼選擇?

2. 如果使用核函數向高維空間映射後,問題仍然是線性不可分的,那怎麼辦?

第一個問題現在就可以回答你:對核函數的選擇,現在還缺乏指導原則!各種實驗的觀察結果(不光是文本分類)的確表明,某些問題用某些核函數效果很好,用另一些就很差,但是一般來講,徑向基核函數是不會出太大偏差的一種,首選。(我做文本分類系統的時候,使用徑向基核函數,沒有參數調優的情況下,絕大部分類別的準確和召回都在85%以上,可見。雖然libSVM的作者林智仁認為文本分類用線性核函數效果更佳,待考證)

現在我們已經把一個本來線性不可分的文本分類問題,通過映射到高維空間而變成了線性可分的。就像這樣:

 

圓形和方形的點各有成千上萬個(畢竟,這就是我們訓練集中文檔的數量嘛,當然很大了)。現在想象我們有另一個訓練集,只比原先這個訓練集多了一篇文章,映射到高維空間以後(當然,也使用了相同的核函數),也就多了一個樣本點,但是這個樣本的位置是這樣的:

 

就是圖中黃色那個點,它是方形的,因而它是負類的一個樣本,這單獨的一個樣本,使得原本線性可分的問題變成了線性不可分的。這樣類似的問題(僅有少數點線性不可分)叫做“近似線性可分”的問題。

以我們人類的常識來判斷,說有一萬個點都符合某種規律(因而線性可分),有一個點不符合,那這一個點是否就代表了分類規則中我們沒有考慮到的方面呢(因而規則應該為它而做出修改)?

其實我們會覺得,更有可能的是,這個樣本點壓根就是錯誤,是雜訊,是提供訓練集的同學人工分類時一打瞌睡錯放進去的。所以我們會簡單的忽略這個樣本點,仍然使用原來的分類器,其效果絲毫不受影響。

但這種對雜訊的容錯性是人的思維帶來的,我們的程式可沒有。由於我們原本的最佳化問題的運算式中,確實要考慮所有的樣本點(不能忽略某一個,因為程式它怎麼知道該忽略哪一個呢?),在此基礎上尋找正負類之間的最大幾何間隔,而幾何間隔本身代表的是距離,是非負的,像上面這種有雜訊的情況會使得整個問題無解。這種解法其實也叫做“硬間隔”分類法,因為他硬性的要求所有樣本點都滿足和分類平面間的距離必須大於某個值。

因此由上面的例子中也可以看出,硬間隔的分類法其結果容易受少數點的控制,這是很危險的(儘管有句話說真理總是掌握在少數人手中,但那不過是那一小撮人聊以自慰的詞句罷了,咱還是得民主)。

但解決方案也很明顯,就是仿照人的思路,允許一些點到分類平面的距離不滿足原先的要求。由於不同的訓練集各點的間距尺度不太一樣,因此用間隔(而不是幾何間隔)來衡量有利於我們表達形式的簡潔。我們原先對樣本點的要求是:

 

意思是說離分類面最近的樣本點函數間隔也要比1大。如果要引入容錯性,就給1這個硬性的閾值加一個鬆弛變數,即允許

因為鬆弛變數是非負的,因此最終的結果是要求間隔可以比1小。但是當某些點出現這種間隔比1小的情況時(這些點也叫離群點),意味著我們放棄了對這些點的精確分類,而這對我們的分類器來說是種損失。但是放棄這些點也帶來了好處,那就是使分類面不必向這些點的方向移動,因而可以得到更大的幾何間隔(在低維空間看來,分類邊界也更平滑)。顯然我們必須權衡這種損失和好處。好處很明顯,我們得到的分類間隔越大,好處就越多。回顧我們原始的硬間隔分類對應的最佳化問題:

||w||2就是我們的目標函數(當然係數可有可無),希望它越小越好,因而損失就必然是一個能使之變大的量(能使它變小就不叫損失了,我們本來就希望目標函數值越小越好)。那如何來衡量損失,有兩種常用的方式,有人喜歡用

而有人喜歡用

其中l都是樣本的數目。兩種方法沒有大的區別。如果選擇了第一種,得到的方法的就叫做二階軟間隔分類器,第二種就叫做一階軟間隔分類器。把損失加入到目標函數裡的時候,就需要一個懲罰因子(cost,也就是libSVM的諸多參數中的C),原來的最佳化問題就變成了下面這樣:

這個式子有這麼幾點要注意:

一是並非所有的樣本點都有一個鬆弛變數與其對應。實際上只有“離群點”才有,或者也可以這麼看,所有沒離群的點鬆弛變數都等於0(對負類來說,離群點就是在前面圖中,跑到H2右側的那些負樣本點,對正類來說,就是跑到H1左側的那些正樣本點)。

二是鬆弛變數的值實際上標示出了對應的點到底離群有多遠,值越大,點就越遠。

三是懲罰因子C決定了你有多重視離群點帶來的損失,顯然當所有離群點的鬆弛變數的和一定時,你定的C越大,對目標函數的損失也越大,此時就暗示著你非常不願意放棄這些離群點,最極端的情況是你把C定為無限大,這樣只要稍有一個點離群,目標函數的值馬上變成無限大,馬上讓問題變成無解,這就退化成了硬間隔問題。

四是懲罰因子C不是一個變數,整個最佳化問題在解的時候,C是一個你必須事先指定的值,指定這個值以後,解一下,得到一個分類器,然後用測試資料看看結果怎麼樣,如果不夠好,換一個C的值,再解一次最佳化問題,得到另一個分類器,再看看效果,如此就是一個參數尋優的過程,但這和最佳化問題本身決不是一回事,最佳化問題在解的過程中,C一直是定值,要記住。

五是儘管加了鬆弛變數這麼一說,但這個最佳化問題仍然是一個最佳化問題(汗,這不廢話麼),解它的過程比起原始的硬間隔問題來說,沒有任何更加特殊的地方。

從大的方面說最佳化問題解的過程,就是先試著確定一下w,也就是確定了前面圖中的三條直線,這時看看間隔有多大,又有多少點離群,把目標函數的值算一算,再換一組三條直線(你可以看到,分類的直線位置如果移動了,有些原來離群的點會變得不再離群,而有的本來不離群的點會變成離群點),再把目標函數的值算一算,如此往複(迭代),直到最終找到目標函數最小時的w。

囉嗦了這麼多,讀者一定可以馬上自己總結出來,鬆弛變數也就是個解決線性不可分問題的方法罷了,但是回想一下,核函數的引入不也是為瞭解決線性不可分的問題嗎?為什麼要為了一個問題使用兩種方法呢?

其實兩者還有微妙的不同。一般的過程應該是這樣,還以文本分類為例。在原始的低維空間中,樣本相當的不可分,無論你怎麼找分類平面,總會有大量的離群點,此時用核函數向高維空間映射一下,雖然結果仍然是不可分的,但比原始空間裡的要更加接近線性可分的狀態(就是達到了近似線性可分的狀態),此時再用鬆弛變數處理那些少數“冥頑不化”的離群點,就簡單有效得多啦。

本節中的(式1)也確實是支援向量機最最常用的形式。至此一個比較完整的支援向量機架構就有了,簡單說來,支援向量機就是使用了核函數的軟間隔線性分類法。

接下來要說的東西其實不是鬆弛變數本身,但由於是為了使用鬆弛變數才引入的,因此放在這裡也算合適,那就是懲罰因子C。回頭看一眼引入了鬆弛變數以後的最佳化問題:

注意其中C的位置,也可以回想一下C所起的作用(表徵你有多麼重視離群點,C越大越重視,越不想丟掉它們)。這個式子是以前做SVM的人寫的,大家也就這麼用,但沒有任何規定說必須對所有的鬆弛變數都使用同一個懲罰因子,我們完全可以給每一個離群點都使用不同的C,這時就意味著你對每個樣本的重視程度都不一樣,有些樣本丟了也就丟了,錯了也就錯了,這些就給一個比較小的C;而有些樣本很重要,決不能分類錯誤(比如中央下達的檔案啥的,笑),就給一個很大的C。

當然實際使用的時候並沒有這麼極端,但一種很常用的變形可以用來解決分類問題中樣本的“偏斜”問題。

先來說說樣本的偏斜問題,也叫資料集偏斜(unbalanced),它指的是參與分類的兩個類別(也可以指多個類別)樣本數量差異很大。比如說正類有10,000個樣本,而負類只給了100個,這會引起的問題顯而易見,可以看看下面的圖:

方形的點是負類。H,H1,H2是根據給的樣本算出來的分類面,由於負類的樣本很少很少,所以有一些本來是負類的樣本點沒有提供,比中兩個灰色的方形點,如果這兩個點有提供的話,那算出來的分類面應該是H’,H2’和H1,他們顯然和之前的結果有出入,實際上負類給的樣本點越多,就越容易出現在灰色點附近的點,我們算出的結果也就越接近於真實的分類面。但現在由於偏斜的現象存在,使得數量多的正類可以把分類面向負類的方向“推”,因而影響了結果的準確性。

對付資料集偏斜問題的方法之一就是在懲罰因子上作文章,想必大家也猜到了,那就是給樣本數量少的負類更大的懲罰因子,表示我們重視這部分樣本(本來數量就少,再拋棄一些,那人家負類還活不活了),因此我們的目標函數中因鬆弛變數而損失的部分就變成了:

 

其中i=1…p都是正樣本,j=p+1…p+q都是負樣本。libSVM這個演算法包在解決偏斜問題的時候用的就是這種方法。

那C+和C-怎麼確定呢?它們的大小是試出來的(參數調優),但是他們的比例可以有些方法來確定。咱們先假定說C+是5這麼大,那確定C-的一個很直觀的方法就是使用兩類樣本數的比來算,對應到剛才舉的例子,C-就可以定為500這麼大(因為10,000:100=100:1嘛)。

但是這樣並不夠好,回看剛才的圖,你會發現正類之所以可以“欺負”負類,其實並不是因為負類樣本少,真實的原因是負類的樣本分布的不夠廣(沒擴充到負類本應該有的地區)。說一個具體點的例子,現在想給政治類和體育類的文章做分類,政治類文章很多,而體育類只提供了幾篇關於籃球的文章,這時分類會明顯偏向於政治類,如果要給體育類文章增加樣本,但增加的樣本仍然全都是關於籃球的(也就是說,沒有足球,排球,賽車,遊泳等等),那結果會怎樣呢?雖然體育類文章在數量上可以達到與政治類一樣多,但過於集中了,結果仍會偏向於政治類!所以給C+和C-確定比例更好的方法應該是衡量他們分布的程度。比如可以算算他們在空間中佔據了多大的體積,例如給負類找一個超球——就是高維空間裡的球啦——它可以包含所有負類的樣本,再給正類找一個,比比兩個球的半徑,就可以大致確定分布的情況。顯然半徑大的分布就比較廣,就給小一點的懲罰因子。

但是這樣還不夠好,因為有的類別樣本確實很集中,這不是提供的樣本數量多少的問題,這是類別本身的特徵(就是某些話題涉及的面很窄,例如電腦類的文章就明顯不如文化類的文章那麼“天馬行空”),這個時候即便超球的半徑差異很大,也不應該賦予兩個類別不同的懲罰因子。

看到這裡讀者一定瘋了,因為說來說去,這豈不成了一個解決不了的問題?然而事實如此,完全的方法是沒有的,根據需要,選擇實現簡單又合用的就好(例如libSVM就直接使用樣本數量的比)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.