SVM 詳解

按:之前的文章重新彙編一下,修改了一些錯誤和不當的說法,一起復習,然後繼續SVM之旅.

(一)SVM的八股簡介

支持向量機(Support Vector Machine)是Cortes和Vapnik於1995年首先提出的,它在解決小樣本、非線性及高維模式識別中表現出許多特有的優勢,並能夠推廣應用到函數擬合等其他機器學習問題中[10]。
支持向量機方法是建立在統計學習理論的VC 維理論和結構風險最小原理基礎上的,根據有限的樣本信息在模型的複雜性(即對特定訓練樣本的學習精度,Accuracy)和學習能力(即無錯誤地識別任意樣本的能力)之間尋求最佳折衷,以期獲得最好的推廣能力[14](或稱泛化能力)。

以上是經常被有關SVM 的學術文獻引用的介紹,有點八股,我來逐一分解並解釋一下。

Vapnik是統計機器學習的大牛,這想必都不用說,他出版的《Statistical Learning Theory》是一本完整闡述統計機器學習思想的名著。在該書中詳細的論證了統計機器學習之所以區別於傳統機器學習的本質,就在於統計機器學習能夠精確的給出學習效果,能夠解答需要的樣本數等等一系列問題。與統計機器學習的精密思維相比,傳統的機器學習基本上屬於摸着石頭過河,用傳統的機器學習方法構造分類系統完全成了一種技巧,一個人做的結果可能很好,另一個人差不多的方法做出來卻很差,缺乏指導和原則。

所謂VC維是對函數類的一種度量,可以簡單的理解爲問題的複雜程度,VC維越高,一個問題就越複雜。正是因爲SVM關注的是VC維,後面我們可以看到,SVM解決問題的時候,和樣本的維數是無關的(甚至樣本是上萬維的都可以,這使得SVM很適合用來解決文本分類的問題,當然,有這樣的能力也因爲引入了核函數)。

結構風險最小聽上去文縐縐,其實說的也無非是下面這回事。

機器學習本質上就是一種對問題真實模型的逼近(我們選擇一個我們認爲比較好的近似模型,這個近似模型就叫做一個假設),但毫無疑問,真實模型一定是不知道的(如果知道了,我們幹嗎還要機器學習?直接用真實模型解決問題不就可以了?對吧,哈哈)既然真實模型不知道,那麼我們選擇的假設與問題真實解之間究竟有多大差距,我們就沒法得知。比如說我們認爲宇宙誕生於150億年前的一場大爆炸,這個假設能夠描述很多我們觀察到的現象,但它與真實的宇宙模型之間還相差多少?誰也說不清,因爲我們壓根就不知道真實的宇宙模型到底是什麼。

這個與問題真實解之間的誤差,就叫做風險(更嚴格的說,誤差的累積叫做風險)。我們選擇了一個假設之後(更直觀點說,我們得到了一個分類器以後),真實誤差無從得知,但我們可以用某些可以掌握的量來逼近它。最直觀的想法就是使用分類器在樣本數據上的分類的結果與真實結果(因爲樣本是已經標註過的數據,是準確的數據)之間的差值來表示。這個差值叫做經驗風險Remp(w)。以前的機器學習方法都把經驗風險最小化作爲努力的目標,但後來發現很多分類函數能夠在樣本集上輕易達到100%的正確率,在真實分類時卻一塌糊塗(即所謂的推廣能力差,或泛化能力差)。此時的情況便是選擇了一個足夠複雜的分類函數(它的VC維很高),能夠精確的記住每一個樣本,但對樣本之外的數據一律分類錯誤。回頭看看經驗風險最小化原則我們就會發現,此原則適用的大前提是經驗風險要確實能夠逼近真實風險纔行(行話叫一致),但實際上能逼近麼?答案是不能,因爲樣本數相對於現實世界要分類的文本數來說簡直九牛一毛,經驗風險最小化原則只在這佔很小比例的樣本上做到沒有誤差,當然不能保證在更大比例的真實文本上也沒有誤差。

統計學習因此而引入了泛化誤差界的概念,就是指真實風險應該由兩部分內容刻畫,一是經驗風險,代表了分類器在給定樣本上的誤差;二是置信風險,代表了我們在多大程度上可以信任分類器在未知文本上分類的結果。很顯然,第二部分是沒有辦法精確計算的,因此只能給出一個估計的區間,也使得整個誤差只能計算上界,而無法計算準確的值(所以叫做泛化誤差界,而不叫泛化誤差)。

置信風險與兩個量有關,一是樣本數量,顯然給定的樣本數量越大,我們的學習結果越有可能正確,此時置信風險越小;二是分類函數的VC維,顯然VC維越大,推廣能力越差,置信風險會變大。

泛化誤差界的公式爲:

R(w)≤Remp(w)+Ф(n/h)

公式中R(w)就是真實風險,Remp(w)就是經驗風險,Ф(n/h)就是置信風險。統計學習的目標從經驗風險最小化變爲了尋求經驗風險與置信風險的和最小,即結構風險最小。

SVM正是這樣一種努力最小化結構風險的算法。

SVM其他的特點就比較容易理解了。

小樣本,並不是說樣本的絕對數量少(實際上,對任何算法來說,更多的樣本幾乎總是能帶來更好的效果),而是說與問題的複雜度比起來,SVM算法要求的樣本數是相對比較少的。

非線性,是指SVM擅長應付樣本數據線性不可分的情況,主要通過鬆弛變量(也有人叫懲罰變量)和核函數技術來實現,這一部分是SVM的精髓,以後會詳細討論。多說一句,關於文本分類這個問題究竟是不是線性可分的,尚沒有定論,因此不能簡單的認爲它是線性可分的而作簡化處理,在水落石出之前,只好先當它是線性不可分的(反正線性可分也不過是線性不可分的一種特例而已,我們向來不怕方法過於通用)。

高維模式識別是指樣本維數很高,例如文本的向量表示,如果沒有經過另一系列文章(《文本分類入門》)中提到過的降維處理,出現幾萬維的情況很正常,其他算法基本就沒有能力應付了,SVM卻可以,主要是因爲SVM 產生的分類器很簡潔,用到的樣本信息很少(僅僅用到那些稱之爲“支持向量”的樣本,此爲後話),使得即使樣本維數很高,也不會給存儲和計算帶來大麻煩(相對照而言,kNN算法在分類時就要用到所有樣本,樣本數巨大,每個樣本維數再一高,這日子就沒法過了……)。

下一節開始正式討論SVM。別嫌我說得太詳細哦。

 

SVM入門(二)線性分類器Part 1

線性分類器(一定意義上,也可以叫做感知機) 是最簡單也很有效的分類器形式.在一個線性分類器中,可以看到SVM形成的思路,並接觸很多SVM的核心概念.

用一個二維空間裏僅有兩類樣本的分類問題來舉個小例子。如圖所示

clip_image002

C1和C2是要區分的兩個類別,在二維平面中它們的樣本如上圖所示。中間的直線就是一個分類函數,它可以將兩類樣本完全分開。一般的,如果一個線性函數能夠將樣本完全正確的分開,就稱這些數據是線性可分的,否則稱爲非線性可分的。

什麼叫線性函數呢?在一維空間裏就是一個點,在二維空間裏就是一條直線,三維空間裏就是一個平面,可以如此想象下去,如果不關注空間的維數,這種線性函數還有一個統一的名稱——超平面(Hyper Plane)!

實際上,一個線性函數是一個實值函數(即函數的值是連續的實數),而我們的分類問題(例如這裏的二元分類問題——回答一個樣本屬於還是不屬於一個類別的問題)需要離散的輸出值,例如用1表示某個樣本屬於類別C1,而用0表示不屬於(不屬於C1也就意味着屬於C2),這時候只需要簡單的在實值函數的基礎上附加一個閾值即可,通過分類函數執行時得到的值大於還是小於這個閾值來確定類別歸屬。 例如我們有一個線性函數

g(x)=wx+b

我們可以取閾值爲0,這樣當有一個樣本xi需要判別的時候,我們就看g(xi)的值。若g(xi)>0,就判別爲類別C1,若g(xi)<0,則判別爲類別C2(等於的時候我們就拒絕判斷,呵呵)。此時也等價於給函數g(x)附加一個符號函數sgn(),即f(x)=sgn [g(x)]是我們真正的判別函數。

關於g(x)=wx+b這個表達式要注意三點:一,式中的x不是二維座標系中的橫軸,而是樣本的向量表示,例如一個樣本點的座標是(3,8),則xT=(3,8) ,而不是x=3(一般說向量都是說列向量,因此以行向量形式來表示時,就加上轉置)。二,這個形式並不侷限於二維的情況,在n維空間中仍然可以使用這個表達式,只是式中的w成爲了n維向量(在二維的這個例子中,w是二維向量,爲了表示起來方便簡潔,以下均不區別列向量和它的轉置,聰明的讀者一看便知);三,g(x)不是中間那條直線的表達式,中間那條直線的表達式是g(x)=0,即wx+b=0,我們也把這個函數叫做分類面。

實際上很容易看出來,中間那條分界線並不是唯一的,我們把它稍微旋轉一下,只要不把兩類數據分錯,仍然可以達到上面說的效果,稍微平移一下,也可以。此時就牽涉到一個問題,對同一個問題存在多個分類函數的時候,哪一個函數更好呢?顯然必須要先找一個指標來量化“好”的程度,通常使用的都是叫做“分類間隔”的指標。下一節我們就仔細說說分類間隔,也補一補相關的數學知識。

SVM入門(三)線性分類器Part 2

上回說到對於文本分類這樣的不適定問題(有一個以上解的問題稱爲不適定問題),需要有一個指標來衡量解決方案(即我們通過訓練建立的分類模型)的好壞,而分類間隔是一個比較好的指標。

在進行文本分類的時候,我們可以讓計算機這樣來看待我們提供給它的訓練樣本,每一個樣本由一個向量(就是那些文本特徵所組成的向量)和一個標記(標示出這個樣本屬於哪個類別)組成。如下:

Di=(xi,yi)

xi就是文本向量(維數很高),yi就是分類標記。

在二元的線性分類中,這個表示分類的標記只有兩個值,1和-1(用來表示屬於還是不屬於這個類)。有了這種表示法,我們就可以定義一個樣本點到某個超平面的間隔:

δi=yi(wxi+b)

這個公式乍一看沒什麼神祕的,也說不出什麼道理,只是個定義而已,但我們做做變換,就能看出一些有意思的東西。

首先注意到如果某個樣本屬於該類別的話,那麼wxi+b>0(記得麼?這是因爲我們所選的g(x)=wx+b就通過大於0還是小於0來判斷分類),而yi也大於0;若不屬於該類別的話,那麼wxi+b<0,而yi也小於0,這意味着yi(wxi+b)總是大於0的,而且它的值就等於|wxi+b|!(也就是|g(xi)|)

現在把w和b進行一下歸一化,即用w/||w||和b/||w||分別代替原來的w和b,那麼間隔就可以寫成

clip_image002[28]

這個公式是不是看上去有點眼熟?沒錯,這不就是解析幾何中點xi到直線g(x)=0的距離公式嘛!(推廣一下,是到超平面g(x)=0的距離, g(x)=0就是上節中提到的分類超平面)

小Tips:||w||是什麼符號?||w||叫做向量w的範數,範數是對向量長度的一種度量。我們常說的向量長度其實指的是它的2-範數,範數最一般的表示形式爲p-範數,可以寫成如下表達式

    向量w=(w1, w2, w3,…… wn)

它的p-範數爲

clip_image004[10]

看看把p換成2的時候,不就是傳統的向量長度麼?當我們不指明p的時候,就像||w||這樣使用時,就意味着我們不關心p的值,用幾範數都可以;或者上文已經提到了p的值,爲了敘述方便不再重複指明。

當用歸一化的w和b代替原值之後的間隔有一個專門的名稱,叫做幾何間隔,幾何間隔所表示的正是點到超平面的歐氏距離,我們下面就簡稱幾何間隔爲“距離”。以上是單個點到某個超平面的距離(就是間隔,後面不再區別這兩個詞)定義,同樣可以定義一個點的集合(就是一組樣本)到某個超平面的距離爲此集合中離超平面最近的點的距離。下面這張圖更加直觀的展示出了幾何間隔的現實含義:

image

H是分類面,而H1和H2是平行於H,且過離H最近的兩類樣本的直線,H1與H,H2與H之間的距離就是幾何間隔。

之所以如此關心幾何間隔這個東西,是因爲幾何間隔與樣本的誤分次數間存在關係:

 

clip_image012

其中的δ是樣本集合到分類面的間隔,R=max ||xi||  i=1,...,n,即R是所有樣本中(xi是以向量表示的第i個樣本)向量長度最長的值(也就是說代表樣本的分佈有多麼廣)。先不必追究誤分次數的具體定義和推導過程,只要記得這個誤分次數一定程度上代表分類器的誤差。而從上式可以看出,誤分次數的上界由幾何間隔決定!(當然,是樣本已知的時候)

至此我們就明白爲何要選擇幾何間隔來作爲評價一個解優劣的指標了,原來幾何間隔越大的解,它的誤差上界越小。因此最大化幾何間隔成了我們訓練階段的目標,而且,與二把刀作者所寫的不同,最大化分類間隔並不是SVM的專利,而是早在線性分類時期就已有的思想。



http://www.blogjava.net/zhenandaci/archive/2009/02/13/254519.html

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