SVM學習(三):線性分類器的求解

1.問題的描述

         上節說到我們有了一個線性分類函數,也有了判斷解優劣的標準——即有了優化的目標,這個目標就是最大化幾何間隔,但是看過一些關於SVM的論文的人一定記得什麼優化的目標是要最小化||w||這樣的說法,這是怎麼回事呢?回頭再看看我們對間隔和幾何間隔的定義:

間隔:

δ=y(wx+b)=|g(x)|
幾何間隔:

可以看出δ=||w||δ幾何。注意到幾何間隔與||w||是成反比的,因此最大化幾何間隔與最小化||w||完全是一回事。而我們常用的方法並不是固定||w||的大小而尋求最大幾何間隔,而是固定間隔(例如固定爲1),尋找最小的||w||。

         而凡是求一個函數的最小值(或最大值)的問題都可以稱爲尋優問題(也叫作一個規劃問題),又由於找最大值的問題總可以通過加一個負號變爲找最小值的問題,因此我們下面討論的時候都針對找最小值的過程來進行。一個尋優問題最重要的部分是目標函數,顧名思義,就是指尋優的目標。例如我們想尋找最小的||w||這件事,就可以用下面的式子表示:


         但實際上對於這個目標,我們常常使用另一個完全等價的目標函數來代替,那就是:

.....(式0)

         不難看出當||w||^2達到最小時,||w||也達到最小,反之亦然(前提當然是||w||描述的是向量的長度,因而是非負的)。之所以採用這種形式,是因爲後面的求解過程會對目標函數作一系列變換,而式(0)的形式會使變換後的形式更爲簡潔(正如聰明的讀者所料,添加的係數二分之一和平方,皆是爲求導數所需)。

         接下來我們自然會問的就是,這個式子是否就描述了我們的問題呢?(回想一下,我們的問題是有一堆點,可以被分成兩類,我們要找出最好的分類面)。

         如果直接來解這個求最小值問題,很容易看出當||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),它同樣由兩部分組成,目標函數和約束條件,可以用下面的式子表示:

(式1)

          約束條件用函數c來表示,就是constrain的意思啦。你可以看出一共有p+q個約束條件,其中p個是不等式約束,q個等式約束

       關於這個式子可以這樣來理解:式中的x是自變量,但不限定它的維數必須爲1(視乎你解決的問題空間維數,對我們的文本分類來說,那可是成千上萬啊)。要求f(x)在哪一點上取得最小值(反倒不太關心這個最小值到底是多少,關鍵是哪一點),但不是在整個空間裏找,而是在約束條件所劃定的一個有限的空間裏找,這個有限的空間就是優化理論裏所說的可行域。注意可行域中的每一個點都要求滿足所有p+q個條件,而不是滿足其中一條或幾條就可以(切記,要滿足每個約束),同時可行域邊界上的點有一個額外好的特性,它們可以使不等式約束取得等號!而邊界內的點不行。

      關於可行域還有個概念不得不提,那就是凸集,凸集是指有這麼一個點的集合,其中任取兩個點連一條直線,這條線上的點仍然在這個集合內部,因此說“凸”是很形象的(一個反例是,二維平面上,一個月牙形的區域就不是凸集,你隨便就可以找到兩個點違反了剛纔的規定)。


      回頭再來看我們線性分類器問題的描述,可以看出更多的東西。

(式2)

      在這個問題中,自變量就是w,而目標函數是w的二次函數,所有的約束條件都是w的線性函數(哎,千萬不要把xi當成變量,它代表樣本,是已知的),這種規劃問題有個很有名氣的稱呼——二次規劃(Quadratic Programming,QP),而且可以更進一步的說,由於它的可行域是一個凸集,因此它是一個凸二次規劃

      一下子提了這麼多術語,實在不是爲了讓大家以後能向別人炫耀學識的淵博,這其實是我們繼續下去的一個重要前提,因爲在動手求一個問題的解之前(好吧,我承認,是動計算機求……),我們必須先問自己:這個問題是不是有解?如果有解,是否能找到?

      對於一般意義上的規劃問題,兩個問題的答案都是不一定,但凸二次規劃讓人喜歡的地方就在於,它有解(教科書裏面爲了嚴謹,常常加限定成分,說它有全局最優解,由於我們想找的本來就是全局最優的解,所以不加也罷),而且可以找到!(當然,依據你使用的算法不同,找到這個解的速度,行話叫收斂速度,會有所不同)。

        對比(式2)和(式1)還可以發現,我們的線性分類器問題只有不等式約束,因此形式上看似乎比一般意義上的規劃問題要簡單,但解起來卻並非如此。
        因爲我們實際上並不知道該怎麼解一個帶約束的優化問題。如果你仔細回憶一下高等數學的知識,會記得我們可以輕鬆的解一個不帶任何約束的優化問題(實際上就是當年背得爛熟的函數求極值嘛,求導再找0點唄,誰不會啊?笑),我們甚至還會解一個只帶等式約束的優化問題,也是背得爛熟的,求條件極值,記得麼,通過添加拉格朗日乘子,構造拉格朗日函數,來把這個問題轉化爲無約束的優化問題云云(如果你一時沒想通,我提醒一下,構造出的拉格朗日函數就是轉化之後的問題形式,它顯然沒有帶任何條件)。

        讀者問:如果只帶等式約束的問題可以轉化爲無約束的問題而得以求解,那麼可不可以把帶不等式約束的問題向只帶等式約束的問題轉化一下而得以求解呢?
        聰明,可以,實際上我們也正是這麼做的。下一節就來說說如何做這個轉化,一旦轉化完成,求解對任何學過高等數學的人來說,都是小菜一碟啦。

2.問題的轉化

          讓我再一次比較完整的重複一下我們要解決的問題:我們有屬於兩個類別的樣本點(並不限定這些點在二維空間中)若干,如圖:


        圓形的樣本點定爲正樣本(連帶着,我們可以把正樣本所屬的類叫做正類),方形的點定爲負例。我們想求得這樣一個線性函數(在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 (式3)

      (式3)其中的yi就是第i個樣本的標籤,它等於1或者-1。其實以上式子的那一堆拉格朗日乘子中,只有很少的一部分不等於0(不等於0纔對w起決定作用),這部分不等於0的拉格朗日乘子後面所乘的樣本點,其實都落在H1和H2上,也正是這部分樣本(而不需要全部樣本)唯一的確定了分類函數,當然,更嚴格的說,這些樣本的一部分就可以確定,因爲例如確定一條直線,只需要兩個點就可以,即便有三五個都落在上面,我們也不是全都需要。這部分我們真正需要的樣本點,就叫做支持(撐)向量!(名字還挺形象吧,他們“撐”起了分界線)。

        式子也可以用求和符號簡寫一下:


        因此原來的g(x)表達式可以寫爲:


        注意式子中x纔是變量,也就是你要分類哪篇文檔,就把該文檔的向量表示代入到 x的位置,而所有的xi統統都是已知的樣本。還注意到式子中只有xi和x是向量,因此一部分可以從內積符號中拿出來,得到g(x)的式子爲:


        發現了什麼?w不見啦!從求w變成了求α。

        但肯定有人會說,這並沒有把原問題簡化呀。嘿嘿,其實簡化了,只不過在你看不見的地方,以這樣的形式描述問題以後,我們的優化問題少了很大一部分不等式約束(記得這是我們解不了極值問題的萬惡之源)。但是接下來先跳過線性分類器求解的部分,來看看 SVM在線性分類器上所做的重大改進——核函數



轉載自:

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

2.http://www.blogjava.net/zhenandaci/archive/2009/02/14/254630.html

3.http://www.blogjava.net/zhenandaci/archive/2009/03/01/257237.html

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