上回說到對於文本分類這樣的不適定問題(有一個以上解的問題稱爲不適定問題),須要有一個指標來衡量解決方案(即咱們經過訓練創建的分類模型)的好壞,而分類間隔是一個比較好的指標。
在進行文本分類的時候,咱們可讓計算機這樣來看待咱們提供給它的訓練樣本,每個樣本由一個向量(就是那些文本特徵所組成的向量)和一個標記(標示出這個樣本屬於哪一個類別)組成。如:Di=(xi,yi)。xi就是文本向量(維數很高),yi就是分類標記。
在二元的線性分類中,這個表示分類的標記只有兩個值,1和-1(用來表示屬於仍是不屬於這個類)。有了這種表示法,咱們就能夠定義一個樣本點到某個超平面的間隔:δi=yi(wxi+b)
這個公式乍一看沒什麼神祕的,也說不出什麼道理,只是個定義而已,但咱們作作變換,就能看出一些有意思的東西。
html
首先注意到若是某個樣本屬於該類別的話,那麼wxi+b>0(記得麼?這是由於咱們所選的g(x)=wx+b就經過大於0仍是小於0來判斷分類),而yi也大於0;若不屬於該類別的話,那麼wxi+b<0,而yi也小於0,這意味着yi(wxi+b)老是大於0的,並且它的值就等於|wxi+b|!(也就是|g(xi)|)
java
如今把w和b進行一下歸一化,即用w/||w||和b/||w||分別代替原來的w和b,那麼間隔就能夠寫成算法
這個公式是否是看上去有點眼熟?沒錯,這不就是解析幾何中點xi到直線g(x)=0的距離公式嘛!(推廣一下,是到超平面g(x)=0的距離, g(x)=0就是上節中提到的分類超平面)
網絡
小Tips:||w||是什麼符號?||w||叫作向量w的範數,範數是對向量長度的一種度量。咱們常說的向量長度其實指的是它的2-範數,範數最通常的表示形式爲p-範數,能夠寫成以下表達式
向量w=(w1, w2, w3,…… wn)
它的p-範數爲
框架
看看把p換成2的時候,不就是傳統的向量長度麼?當咱們不指明p的時候,就像||w||這樣使用時,就意味着咱們不關心p的值,用幾範數均可以;或者上文已經提到了p的值,爲了敘述方便再也不重複指明。
ide
當用歸一化的w和b代替原值以後的間隔有一個專門的名稱,叫作幾何間隔,幾何間隔所表示的正是點到超平面的歐氏距離,咱們下面就簡稱幾何間隔爲「距離」。以上是單個點到某個超平面的距離(就是間隔,後面再也不區別這兩個詞)定義,一樣能夠定義一個點的集合(就是一組樣本)到某個超平面的距離爲此集合中離超平面最近的點的距離。下面這張圖更加直觀的展現出了幾何間隔的現實含義:
函數
H是分類面,而H1和H2是平行於H,且過離H最近的兩類樣本的直線,H1與H,H2與H之間的距離就是幾何間隔。
之因此如此關心幾何間隔這個東西,是由於幾何間隔與樣本的誤分次數間存在關係:測試
其中的δ是樣本集合到分類面的間隔,R=max ||xi|| i=1,...,n,即R是全部樣本中(xi是以向量表示的第i個樣本)向量長度最長的值(也就是說表明樣本的分佈有多麼廣)。先沒必要追究誤分次數的具體定義和推導過程,只要記得這個誤分次數必定程度上表明分類器的偏差。而從上式能夠看出,誤分次數的上界由幾何間隔決定!(固然,是樣本已知的時候)
至此咱們就明白爲什麼要選擇幾何間隔來做爲評價一個解優劣的指標了,原來幾何間隔越大的解,它的偏差上界越小。所以最大化幾何間隔成了咱們訓練階段的目標,並且,與二把刀做者所寫的不一樣,最大化分類間隔並非SVM的專利,而是早在線性分類時期就已有的思想。
上節說到咱們有了一個線性分類函數,也有了判斷解優劣的標準——即有了優化的目標,這個目標就是最大化幾何間隔,可是看過一些關於SVM的論文的人必定記得什麼優化的目標是要最小化||w||這樣的說法,這是怎麼回事呢?回頭再看看咱們對間隔和幾何間隔的定義:
間隔:δ=y(wx+b)=|g(x)|優化
幾何間隔:
spa
能夠看出δ=||w||δ幾何。注意到幾何間隔與||w||是成反比的,所以最大化幾何間隔與最小化||w||徹底是一回事。而咱們經常使用的方法並非固定||w||的大小而尋求最大幾何間隔,而是固定間隔(例如固定爲1),尋找最小的||w||。
而凡是求一個函數的最小值(或最大值)的問題均可以稱爲尋優問題(也叫做一個規劃問題),又因爲找最大值的問題總能夠經過加一個負號變爲找最小值的問題,所以咱們下面討論的時候都針對找最小值的過程來進行。一個尋優問題最重要的部分是目標函數,顧名思義,就是指尋優的目標。例如咱們想尋找最小的||w||這件事,就能夠用下面的式子表示:
但實際上對於這個目標,咱們經常使用另外一個徹底等價的目標函數來代替,那就是:
(式1)
不難看出當||w||2達到最小時,||w||也達到最小,反之亦然(前提固然是||w||描述的是向量的長度,於是是非負的)。之因此採用這種形式,是由於後面的求解過程會對目標函數做一系列變換,而式(1)的形式會使變換後的形式更爲簡潔(正如聰明的讀者所料,添加的係數二分之一和平方,皆是爲求導數所需)。
接下來咱們天然會問的就是,這個式子是否就描述了咱們的問題呢?(回想一下,咱們的問題是有一堆點,能夠被分紅兩類,咱們要找出最好的分類面)
若是直接來解這個求最小值問題,很容易看出當||w||=0的時候就獲得了目標函數的最小值。可是你也會發現,不管你給什麼樣的數據,都是這個解! 反映在圖中,就是H1與H2兩條直線間的距離無限大,這個時候,全部的樣本點(不管正樣本仍是負樣本)都跑到了H1和H2中間,而咱們本來的意圖是,H1 右側的被分爲正類,H2 左側的被分爲負類,位於兩類中間的樣本則拒絕分類(拒絕分類的另外一種理解是分給哪一類都有道理,於是分給哪一類也都沒有道理)。這下可好,全部樣本點都進 入了沒法分類的灰色地帶。
形成這種結果的緣由是在描述問題的時候只考慮了目標,而沒有加入約束條件, 約束條件就是在求解過程當中必須知足的條件,體如今咱們的問題中就是樣本點必須在H1或H2的某一側(或者至少在H1和H2上),而不能跑到二者中間。咱們前文提到過把間隔固定爲1,這是指把全部樣本點中間隔最小的那一點的間隔定爲1(這也是集合的間隔的定義,有點繞嘴),也就意味着集合中的其餘點間隔都不會小於1,按照間隔的定義,知足這些條件就至關於讓下面的式子老是成立:yi[(w·xi)+b]≥1 (i=1,2,…,l) (l是總的樣本數)
但咱們經常習慣讓式子的值和0比較,於是常常用變換過的形式:yi[(w·xi)+b]-1≥0 (i=1,2,…,l) (l是總的樣本數)
所以咱們的兩類分類問題也被咱們轉化成了它的數學形式,一個帶約束的最小值的問題:
下一節咱們從最通常的意義上看看一個求最小值的問題有何特徵,以及如何來解。
從最通常的定義上說,一個求最小值的問題就是一個優化問題(也叫尋優問題,更文縐縐的叫法是規劃——Programming),它一樣由兩部分組成,目標函數和約束條件,能夠用下面的式子表示:
約束條件用函數c來表示,就是constrain的意思啦。你能夠看出一共有p+q個約束條件,其中p個是不等式約束,q個等式約束。
關於這個式子能夠這樣來理解:式中的x是自變量,但不限定它的維數必須爲1(視乎你解決的問題空間維數,對咱們的文本分類來講,那但是成千上萬啊)。要求f(x)在哪一點上取得最小值(反倒不太關心這個最小值究竟是多少,關鍵是哪一點),但不是在整個空間裏找,而是在約束條件所劃定的一個有限的空間裏找,這個有限的空間就是優化理論裏所說的可行域。注意可行域中的每個點都要求知足全部p+q個條件,而不是知足其中一條或幾條就能夠(切記,要知足每一個約束),同時可行域邊界上的點有一個額外好的特性,它們能夠使不等式約束取得等號!而邊界內的點不行。
關於可行域還有個概念不得不提,那就是凸集,凸集是指有這麼一個點的集合,其中任取兩個點連一條直線,這條線上的點仍然在這個集合內部,所以說「凸」是很形象的(一個反例是,二維平面上,一個月牙形的區域就不是凸集,你隨便就能夠找到兩個點違反了剛纔的規定)。
回頭再來看咱們線性分類器問題的描述,能夠看出更多的東西。
(式2)
在這個問題中,自變量就是w,而目標函數是w的二次函數,全部的約束條件都是w的線性函數(哎,千萬不要把xi當成變量,它表明樣本,是已知的),這種規劃問題有個頗有名氣的稱呼——二次規劃(Quadratic Programming,QP),並且能夠更進一步的說,因爲它的可行域是一個凸集,所以它是一個凸二次規劃。
讀者問:若是隻帶等式約束的問題能夠轉化爲無約束的問題而得以求解,那麼可不能夠把帶不等式約束的問題向只帶等式約束的問題轉化一下而得以求解呢?
聰明,能夠,實際上咱們也正是這麼作的。下一節就來講說如何作這個轉化,一旦轉化完成,求解對任何學太高等數學的人來講,都是小菜一碟啦。
讓我再一次比較完整的重複一下咱們要解決的問題:咱們有屬於兩個類別的樣本點(並不限定這些點在二維空間中)若干,如圖,
圓形的樣本點定爲正樣本(連帶着,咱們能夠把正樣本所屬的類叫作正類),方形的點定爲負例。咱們想求得這樣一個線性函數(在n維空間中的線性函數):g(x)=wx+b。使得全部屬於正類的點x+代入之後有g(x+)≥1,而全部屬於負類的點x-代入後有g(x-)≤-1(之因此總跟1比較,不管正一仍是負一,都是由於咱們固定了間隔爲1,注意間隔和幾何間隔的區別)。代入g(x)後的值若是在1和-1之間,咱們就拒絕判斷。
求這樣的g(x)的過程就是求w(一個n維向量)和b(一個實數)兩個參數的過程(但實際上只須要求w,求得之後找某些樣本點代入就能夠求得b)。所以在求g(x)的時候,w纔是變量。
你確定能看出來,一旦求出了w(也就求出了b),那麼中間的直線H就知道了(由於它就是wx+b=0嘛,哈哈),那麼H1和H2也就知道了(由於三者是平行的,並且相隔的距離仍是||w||決定的)。那麼w是誰決定的?顯然是你給的樣本決定的,一旦你在空間中給出了那些個樣本點,三條直線的位置實際上就惟一肯定了(由於咱們求的是最優的那三條,固然是惟一的),咱們解優化問題的過程也只不過是把這個肯定了的東西算出來而已。
樣本肯定了w,用數學的語言描述,就是w能夠表示爲樣本的某種組合:w=α1x1+α2x2+…+αnxn
式子中的αi是一個一個的數(在嚴格的證實過程當中,這些α被稱爲拉格朗日乘子),而xi是樣本點,於是是向量,n就是總樣本點的個數。爲了方便描述,如下開始嚴格區別數字與向量的乘積和向量間的乘積,我會用α1x1表示數字和向量的乘積,而用<x1,x2>表示向量x1,x2的內積(也叫點積,注意與向量叉積的區別)。所以g(x)的表達式嚴格的形式應該是:g(x)=<w,x>+b
可是上面的式子還不夠好,你回頭看看圖中正樣本和負樣本的位置,想像一下,我不動全部點的位置,而只是把其中一個正樣本點定爲負樣本點(也就是把一 個點的形狀從圓形變爲方形),結果怎麼樣?三條直線都必須移動(由於對這三條直線的要求是必須把方形和圓形的點正確分開)!這說明w不只跟樣本點的位置有關,還跟樣本的類別有關(也就是和樣本的「標籤」有關)。所以用下面這個式子表示纔算完整:
w=α1y1x1+α2y2x2+…+αnynxn (式1)
其中的yi就是第i個樣本的標籤,它等於1或者-1。其實以上式子的那一堆拉格朗日乘子中,只有不多的一部分不等於0(不等於0纔對w起決定做用),這部分不等於0的拉格朗日乘子後面所乘的樣本點,其實都落在H1和H2上,也正是這部分樣本(而不須要所有樣本)惟一的肯定了分類函數,固然,更嚴格的說,這些樣本的一部分就能夠肯定,由於例如肯定一條直線,只須要兩個點就能夠,即使有三五個都落在上面,咱們也不是全都須要。這部分咱們真正須要的樣本點,就叫作支持(撐)向量!(名字還挺形象吧,他們「撐」起了分界線)。式子也能夠用求和符號簡寫一下:
所以原來的g(x)表達式能夠寫爲:
注意式子中x纔是變量,也就是你要分類哪篇文檔,就把該文檔的向量表示代入到 x的位置,而全部的xi通通都是已知的樣本。還注意到式子中只有xi和x是向量,所以一部分能夠從內積符號中拿出來,獲得g(x)的式子爲:
發現了什麼?w不見啦!從求w變成了求α。
但確定有人會說,這並無把原問題簡化呀。嘿嘿,其實簡化了,只不過在你看不見的地方,以這樣的形式描述問題之後,咱們的優化問題少了很大一部分不等式約束(記得這是咱們解不了極值問題的萬惡之源)。可是接下來先跳過線性分類器求解的部分,來看看 SVM在線性分類器上所作的重大改進——核函數。
生存?仍是毀滅?——哈姆雷特
可分?仍是不可分?——支持向量機
以前一直在討論的線性分類器,器如其名(汗,這是什麼說法啊),只能對線性可分的樣本作處理。若是提供的樣本線性不可分,結果很簡單,線性分類器的求解程序會無限循環,永遠也解不出來。這必然使得它的適用範圍大大縮小,而它的不少優勢咱們實在不原意放棄,怎麼辦呢?是否有某種方法,讓線性不可分的數據變得線性可分呢?
有!其思想說來也簡單,來用一個二維平面中的分類問題做例子,你一看就會明白。事先聲明,下面這個例子是網絡早就有的,我一時找不到原做者的正確信息,在此借用,並加進了我本身的解說而已。例子是下面這張圖:
咱們把橫軸上端點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)也確實是支持向量機最最經常使用的形式。至此一個比較完整的支持向量機框架就有了,簡單說來,支持向量機就是使用了核函數的軟間隔線性分類法。
下一節會說說鬆弛變量剩下的一點點東西,順便搞個讀者調查,看看你們還想侃侃SVM的哪些方面。
接下來要說的東西其實不是鬆弛變量自己,但因爲是爲了使用鬆弛變量才引入的,所以放在這裏也算合適,那就是懲罰因子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就直接使用樣本數量的比)。
從SVM的那幾張圖能夠看出來,SVM是一種典型的兩類分類器,即它只回答屬於正類仍是負類的問題。而現實中要解決的問題,每每是多類的問題(少部分例外, 例如垃圾郵件過濾,就只須要肯定「是」仍是「不是」垃圾郵件),好比文本分類,好比數字識別。如何由兩類分類器獲得多類分類器,就是一個值得研究的問題。
還以文本分類爲例,現成的方法有不少,其中一種一勞永逸的方法,就是真的一次性考慮全部樣本,並求解一個多目標函數的優化問題,一次性獲得多個分類面,就像下圖這樣:
多個超平面把空間劃分爲多個區域,每一個區域對應一個類別,給一篇文章,看它落在哪一個區域就知道了它的分類。
看起來很美對不對?只惋惜這種算法還基本停留在紙面上,由於一次性求解的方法計算量實在太大,大到沒法實用的地步。
稍稍退一步,咱們就會想到所謂「一類對其他」的方法,就是每次仍然解一個兩類分類的問題。好比咱們有5個類別,第一次就把類別1的樣本定爲正樣本, 其他2,3,4,5的樣本合起來定爲負樣本,這樣獲得一個兩類分類器,它可以指出一篇文章是仍是不是第1類的;第二次咱們把類別2的樣本定爲正樣本,把1,3,4,5的樣本合起來定爲負樣本,獲得一個分類器,如此下去,咱們能夠獲得5個這樣的兩類分類器(老是和類別的數目一致)。到了有文章須要分類的時候,咱們就拿着這篇文章挨個分類器的問:是屬於你的麼?是屬於你的麼?哪一個分類器點頭說是了,文章的類別就肯定了。這種方法的好處是每一個優化問題的規模比較小,並且分類的時候速度很快(只須要調用5個分類器就知道告終果)。但有時也會出現兩種很尷尬的狀況,例如拿一篇文章問了一圈,每 一個分類器都說它是屬於它那一類的,或者每個分類器都說它不是它那一類的,前者叫分類重疊現象,後者叫不可分類現象。分類重疊倒還好辦,隨便選一個結果都不至於太離譜,或者看看這篇文章到各個超平面的距離,哪一個遠就判給哪一個。不可分類現象就着實難辦了,只能把它分給第6個類別了……更要命的是,原本各個類別的樣本數目是差很少的,但「其他」的那一類樣本數老是要數倍於正類(由於它是除正類之外其餘類別的樣本之和嘛),這就人爲的形成了上一節所說的「數據集偏斜」問題。
所以咱們還得再退一步,仍是解兩類分類問題,仍是每次選一個類的樣本做正類樣本,而負類樣本則變成只選一個類(稱爲「一對一單挑」的方法,哦,不對,沒有單挑,就是「一對一」的方法,呵呵),這就避免了偏斜。所以過程就是算出這樣一些分類器,第一個只回答「是第1類仍是第2類」,第二個只回答「是第1類仍是第3類」,第三個只回答「是第1類仍是第4類」,如此下去,你也能夠立刻得出,這樣的分類器應該有5 X 4/2=10個(通式是,若是有k個類別,則總的兩類分類器數目爲k(k-1)/2)。雖然分類器的數目多了,可是在訓練階段(也就是算出這些分類器的分類平面時)所用的總時間卻比「一類對其他」方法少不少,在真正用來分類的時候,把一篇文章扔給全部分類器,第一個分類器會投票說它是「1」或者「2」,第二個會說它是「1」或者「3」,讓每個都投上本身的一票,最後統計票數,若是類別「1」得票最多,就判這篇文章屬於第1類。這種方法顯然也會有分類重疊的現象,但不會有不可分類現象,由於總不可能全部類別的票數都是0。看起來夠好麼?其實否則,想一想分類一篇文章,咱們調用了多少個分類器?10個,這仍是類別數爲5的時候,類別數若是是1000,要調用的分類器數目會上升至約500,000個(類別數的平方量級)。這如何是好?
看來咱們必須再退一步,在分類的時候下功夫,咱們仍是像一對一方法那樣來訓練,只是在對一篇文章進行分類以前,咱們先按照下面圖的樣子來組織分類器(如你所見,這是一個有向無環圖,所以這種方法也叫作DAG SVM)
這樣在分類時,咱們就能夠先問分類器「1對5」(意思是它可以回答「是第1類仍是第5類」),若是它回答5,咱們就往左走,再問「2對5」這個分類器,若是它還說是「5」,咱們就繼續往左走,這樣一直問下去,就能夠獲得分類結果。好處在哪?咱們其實只調用了4個分類器(若是類別數是k,則只調用k-1個),分類速度飛快,且沒有分類重疊和不可分類現象!缺點在哪?假如最一開始的分類器回答錯誤(明明是類別1的文章,它說成了5),那麼後面的分類器是不管如何也沒法糾正它的錯誤的(由於後面的分類器壓根沒有出現「1」這個類別標籤),其實對下面每一層的分類器都存在這種錯誤向下累積的現象。。
不過不要被DAG方法的錯誤累積嚇倒,錯誤累積在一對其他和一對一方法中也都存在,DAG方法好於它們的地方就在於,累積的上限,無論是大是小,總 是有定論的,有理論證實。而一對其他和一對一方法中,儘管每個兩類分類器的泛化偏差限是知道的,可是合起來作多類分類的時候,偏差上界是多少,沒人知道,這意味着準確率低到0也是有可能的,這多讓人鬱悶。
並且如今DAG方法根節點的選取(也就是如何選第一個參與分類的分類器),也有一些方法能夠改善總體效果,咱們總但願根節點少犯錯誤爲好,所以參與 第一次分類的兩個類別,最好是差異特別特別大,大到以致於不太可能把他們分錯;或者咱們就總取在兩類分類中正確率最高的那個分類器做根節點,或者咱們讓兩類分類器在分類的時候,不光輸出類別的標籤,還輸出一個相似「置信度」的東東,當它對本身的結果不太自信的時候,咱們就不光按照它的輸出走,把它旁邊的那條路也走一走,等等。
大Tips:SVM的計算複雜度
使用SVM進行分類的時候,其實是訓練和分類兩個徹底不一樣的過程,於是討論複雜度就不能一律而論,咱們這裏所說的主要是訓練階段的複雜度,即解那個二次規劃問題的複雜度。對這個問題的解,基本上要劃分爲兩大塊,解析解和數值解。
解析解就是理論上的解,它的形式是表達式,所以它是精確的,一個問題只要有解(無解的問題還跟着摻和什麼呀,哈哈),那它的解析解是必定存在的。固然存在是一回事,可以解出來,或者能夠在能夠承受的時間範圍內解出來,就是另外一回事了。對SVM來講,求得解析解的時間複雜度最壞能夠達到O(Nsv3),其中Nsv是支持向量的個數,而雖然沒有固定的比例,但支持向量的個數多少也和訓練集的大小有關。
數值解就是能夠使用的解,是一個一個的數,每每都是近似解。求數值解的過程很是像窮舉法,從一個數開始,試一試它當解效果怎樣,不知足必定條件(叫作停機條件,就是知足這個之後就認爲解足夠精確了,不須要繼續算下去了)就試下一個,固然下一個數不是亂選的,也有必定章法可循。有的算法,每次只嘗試一個數,有的就嘗試多個,並且找下一個數字(或下一組數)的方法也各不相同,停機條件也各不相同,最終獲得的解精度也各不相同,可見對求數值解的複雜度的討論不能脫開具體的算法。
一個具體的算法,Bunch-Kaufman訓練算法,典型的時間複雜度在O(Nsv3+LNsv2+dLNsv)和O(dL2)之間,其中Nsv是支持向量的個數,L是訓練集樣本的個數,d是每一個樣本的維數(原始的維數,沒有通過向高維空間映射以前的維數)。複雜度會有變化,是由於它不光跟輸入問題的規模有關(不光和樣本的數量,維數有關),也和問題最終的解有關(即支持向量有關),若是支持向量比較少,過程會快不少,若是支持向量不少,接近於樣本的數量,就會產生O(dL2)這個十分糟糕的結果(給10,000個樣本,每一個樣本1000維,基本就不用算了,算不出來,呵呵,而這種輸入規模對文本分類來講太正常了)。
這樣再回頭看就會明白爲何一對一方法儘管要訓練的兩類分類器數量多,但總時間實際上比一對其他方法要少了,由於一對其他方法每次訓練都考慮了全部樣本(只是每次把不一樣的部分劃分爲正類或者負類而已),天然慢上不少。
前文提到過,除了開方檢驗(CHI)之外,信息增益(IG,Information Gain)也是頗有效的特徵選擇方法。但凡是特徵選擇,老是在將特徵的重要程度量化以後再進行選擇,而如何量化特徵的重要性,就成了各類方法間最大的不一樣。開方檢驗中使用特徵與類別間的關聯性來進行這個量化,關聯性越強,特徵得分越高,該特徵越應該被保留。
在信息增益中,重要性的衡量標準就是看特徵可以爲分類系統帶來多少信息,帶來的信息越多,該特徵越重要。
所以先回憶一下信息論中有關信息量(就是「熵」)的定義。說有這麼一個變量X,它可能的取值有n多種,分別是x1,x2,……,xn,每一種取到的機率分別是P1,P2,……,Pn,那麼X的熵就定義爲:
意思就是一個變量可能的變化越多(反而跟變量具體的取值沒有任何關係,只和值的種類多少以及發生機率有關),它攜帶的信息量就越大(所以我一直以爲咱們的政策法規信息量很是大,由於它變化不少,基本朝令夕改,笑)。
對分類系統來講,類別C是變量,它可能的取值是C1,C2,……,Cn,而每個類別出現的機率是P(C1),P(C2),……,P(Cn),所以n就是類別的總數。此時分類系統的熵就能夠表示爲:
有同窗說很差理解呀,這樣想就行了,文本分類系統的做用就是輸出一個表示文本屬於哪一個類別的值,而這個值多是C1,C2,……,Cn,所以這個值所攜帶的信息量就是上式中的這麼多。
信息增益是針對一個一個的特徵而言的,就是看一個特徵t,系統有它和沒它的時候信息量各是多少,二者的差值就是這個特徵給系統帶來的信息量,即增益。系統含有特徵t的時候信息量很好計算,就是剛纔的式子,它表示的是包含全部特徵時系統的信息量。
問題是當系統不包含t時,信息量如何計算?咱們換個角度想問題,把系統要作的事情想象成這樣:說教室裏有不少座位,學生們每次上課進來的時候能夠隨便坐,於是變化是很大的(無數種可能的座次狀況);可是如今有一個座位,看黑板很清楚,聽老師講也很清楚,因而校長的小舅子的姐姐的女兒託關係(真展轉啊),把這個座位定下來了,每次只能給她坐,別人不行,此時狀況怎樣?對於座次的可能狀況來講,咱們很容易看出如下兩種狀況是等價的:(1)教室裏沒有這個座位;(2)教室裏雖然有這個座位,但其餘人不能坐(由於反正它也不能參與到變化中來,它是不變的)。
對應到咱們的系統中,就是下面的等價:(1)系統不包含特徵t;(2)系統雖然包含特徵t,可是t已經固定了,不能變化。
咱們計算分類系統不包含特徵t的時候,就使用狀況(2)來代替,就是計算當一個特徵t不能變化時,系統的信息量是多少。這個信息量其實也有專門的名稱,就叫作「條件熵」,條件嘛,天然就是指「t已經固定「這個條件。
可是問題接踵而至,例如一個特徵X,它可能的取值有n多種(x1,x2,……,xn), 當計算條件熵而須要把它固定的時候,要把它固定在哪個值上呢?答案是每一種可能都要固定一下,計算n個值,而後取均值纔是條件熵。而取均值也不是簡單的 加一加而後除以n,而是要用每一個值出現的機率來算平均(簡單理解,就是一個值出現的可能性比較大,固定在它上面時算出來的信息量佔的比重就要多一些)。
所以有這樣兩個條件熵的表達式:
這是指特徵X被固定爲值xi時的條件熵,
這是指特徵X被固定時的條件熵,注意與上式在乎義上的區別。從剛纔計算均值的討論能夠看出來,第二個式子與第一個式子的關係就是:
具體到咱們文本分類系統中的特徵t,t有幾個可能的值呢?注意t是指一個固定的特徵,好比他就是指關鍵詞「經濟」或者「體育」,當咱們說特徵「經濟」可能的取值時,實際上只有兩個,「經濟」要麼出現,要麼不出現。通常的,t的取值只有t(表明t出現)和(表明t不出現),注意系統包含t但t不出現與系統根本不包含t但是兩回事。
所以固定t時系統的條件熵就有了,爲了區別t出現時的符號與特徵t自己的符號,咱們用T表明特徵,而用t表明T出現,那麼:
與剛纔的式子對照一下,含義很清楚對吧,P(t)就是T出現的機率,就是T不出現的機率。這個式子能夠進一步展開,其中的
另外一半就能夠展開爲:
所以特徵T給系統帶來的信息增益就能夠寫成系統本來的熵與固定特徵T後的條件熵之差:
公式中的東西看上去不少,其實也都很好計算。好比P(Ci),表示類別Ci出現的機率,其實只要用1除以類別總數就獲得了(這是說你平等的看待每一個類別而忽略它們的大小時這樣算,若是考慮了大小就要把大小的影響加進去)。再好比P(t),就是特徵T出現的機率,只要用出現過T的文檔數除以總文檔數就能夠了,再好比P(Ci|t)表示出現T的時候,類別Ci出現的機率,只要用出現了T而且屬於類別Ci的文檔數除以出現了T的文檔數就能夠了。
從以上討論中能夠看出,信息增益也是考慮了特徵出現和不出現兩種狀況,與開方檢驗同樣,是比較全面的,於是效果不錯。但信息增益最大的問題還在於它只能考察特徵對整個系統的貢獻,而不能具體到某個類別上,這就使得它只適合用來作所謂「全局」的特徵選擇(指全部的類都使用相同的特徵集合),而沒法作 「本地」的特徵選擇(每一個類別有本身的特徵集合,由於有的詞,對這個類別頗有區分度,對另外一個類別則無足輕重)。
看看,導出的過程其實很簡單,沒有什麼神祕的對不對。可有的學術論文裏就喜歡把這種原本很直白的東西寫得很晦澀,彷彿只有讀者看不懂纔是做者的真正成功。
我們是新一代的學者,我們沒有知識不怕被別人看出來,我們有知識也不怕教給別人。因此咱都把事情說簡單點,說明白點,你們好,纔是真的好。
轉自:http://blog.sina.com.cn/s/blog_5f853eb10100qbb9.html