按:之前的文章重新匯編一下,修改了一些錯誤和不當的說法,一起復習,然后繼續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的核心概念.
用一個二維空間里僅有兩類樣本的分類問題來舉個小例子。如圖所示
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,那么間隔就可以寫成
這個公式是不是看上去有點眼熟?沒錯,這不就是解析幾何中點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的值,為了敘述方便不再重復指明。
當用歸一化的w和b代替原值之后的間隔有一個專門的名稱,叫做幾何間隔,幾何間隔所表示的正是點到超平面的歐氏距離,我們下面就簡稱幾何間隔為“距離”。以上是單個點到某個超平面的距離(就是間隔,后面不再區別這兩個詞)定義,同樣可以定義一個點的集合(就是一組樣本)到某個超平面的距離為此集合中離超平面最近的點的距離。下面這張圖更加直觀的展示出了幾何間隔的現實含義:
H是分類面,而H1和H2是平行于H,且過離H最近的兩類樣本的直線,H1與H,H2與H之間的距離就是幾何間隔。
之所以如此關心幾何間隔這個東西,是因為幾何間隔與樣本的誤分次數間存在關系:
其中的δ是樣本集合到分類面的間隔,R=max ||xi|| i=1,...,n,即R是所有樣本中(xi是以向量表示的第i個樣本)向量長度最長的值(也就是說代表樣本的分布有多么廣)。先不必追究誤分次數的具體定義和推導過程,只要記得這個誤分次數一定程度上代表分類器的誤差。而從上式可以看出,誤分次數的上界由幾何間隔決定!(當然,是樣本已知的時候)
至此我們就明白為何要選擇幾何間隔來作為評價一個解優劣的指標了,原來幾何間隔越大的解,它的誤差上界越小。因此最大化幾何間隔成了我們訓練階段的目標,而且,與二把刀作者所寫的不同,最大化分類間隔并不是SVM的專利,而是早在線性分類時期就已有的思想。
而 (w1,w2)*(x,y)+b = 0 才是直線方程吧。
@地方
希望你以后能發更多的文章!!!
D = (Ax + By + c) /sqrt(A^2+B^2)
sqrt(A^2+B^2)就相當于||W||, 其中向量W=[A, B];
(Ax + By + c)就相當于g(X), 其中向量X=[x,y]。
這個說法好像不是很準確. 用線性分類器的話,有很多分類器可以處理高維數據,非線性分類的話,SVM也不能處理幾萬維的數據。
首先感謝樓主的好文,能把SVM說的通俗易懂真是佩服!比起樓主寫的,我看好多老師都可以下崗回家了,有些書、paper啊實在是不敢恭維。
看到好多人都在問g(x)=0 和 g(x)的問題,我在這里幫樓主補充一下:g(x)實際是以w為法向量的一簇超平面,在二維空間表示為一簇直線(就是一簇平行線,他們的法向量都是w),而g(x)=0只是這么多平行線中的一條。
物理意義搞清楚了,大家可以接著往后看了。我也繼續向樓主學習了。希望樓主都多多分享自己的理解,期待樓主后續好作品。
paper的目的是把1+1=2簡單的問題說成讓很多人看不懂。這就是paper。o(∩_∩)o 哈哈
如果有可能的話,能否做一些關于CRD(conditional random field)的介紹呢?看論文一點都沒懂。
不知道有沒有像樓主說的這樣子的書籍,??
現在的大牛書,就是故意弄得很難,故意讓你看不懂!
沒錯的。w是我們所用坐標系下x和y的系數組成的行向量,你再想下。
我也不太懂這個w在wx+b的含義
哇,這么說就清楚多了!感謝!
如果w是行向量,x是列向量,那wx就是一個數字了,那么b呢?b也應該是一個數字,我一直都把b理解成一個列向量了。
剛看到這里的時候我也不太了解,但看了下一篇SVM潤(四)就懂了。SVM的目標是最大化幾何間隔,而間隔一般是固定的,例如1。所以最大化幾何間隔就轉化成了最小化||w||。H到H1的幾何間隔是1/||w||,所以H1到H2的幾何間隔就是2/||w||了。
不是很理解VC維和這句話,我的理解是VC維和樣本維度是相關的,比如樣本維度是2,最多就有2^2個樣本,如果是二分類問題,’最大的VC維‘就是2^(2^2)
如果相關的話,上面的話不是矛盾么?
其心有兩個地方不理解:
1. ‘其他算法基本就沒能力應付了’中其他算法出了后面提到的knn還有誰?粗略想了一下常見的分類算法,貝葉斯,決策樹,線性回歸,邏輯回歸這些都OK吧?
2. ‘用到的樣本信息很少’大概明白LZ的意思,但還是感覺有點。。。
在二維里面,也就是這篇文章里的例子中。b就是一個數,而wx是兩個向量的內積。別被x的表面所迷惑,你把x換成別的字母會更好理解一些。要是把x換成s,就變成ws+b。w=(A,B);s=(x,y)^T,這里面的x,y你都可以理解為x軸的坐標和y軸的坐標。所以,ws+b的展開形式就是Ax+By+b=0,這剛好在二維平面里就是直線的定義。
個人理解,w,b都是未知的,怎么是一個點呢?X是已知量...
歸一化應該是讓X的系數為1,所以是提出一個w,wx+b=w(x+b/w)
簡單來說,二維坐標系的橫軸是x1,縱軸是x2