1. 程式人生 > >解密SVM系列(一):關於拉格朗日乘子法和KKT條件

解密SVM系列(一):關於拉格朗日乘子法和KKT條件

寫在之前

支援向量機(SVM),一個神祕而眾知的名字,在其出來就受到了莫大的追捧,號稱最優秀的分類演算法之一,以其簡單的理論構造了複雜的演算法,又以其簡單的用法實現了複雜的問題,不得不說確實完美。
本系列旨在以基礎化的過程,例項化的形式一探SVM的究竟。曾經也只用過整合化的SVM軟體包,效果確實好。因為眾人皆說原理複雜就對其原理卻沒怎麼研究,最近經過一段時間的研究感覺其原理還是可以理解,這裡希望以一個從懵懂到略微熟知的角度記錄一下學習的過程。
其實網路上講SVM演算法的多不勝數,部落格中也有許多大師級博主的文章,寫的也很簡單明瞭,可是在看過之和總是感覺像差點什麼,當然對於那些基礎好的可能一看就懂了,然而對於像我們這些薄基礎的一遍下來也能馬馬虎虎懂,過一兩天後又忘了公式怎麼來的了。比如說在研究SVM之前,你是否聽說過拉格朗日乘子法?你是否知道什麼是對偶問題?你是否瞭解它們是怎麼解決問題的?Ok這些不知道的話,更別說什麼是KKT條件了,哈哈,有沒有說到你的心聲,不用怕,學學就會了。話說像拉格朗日乘子法,在大學裡面學數學的話,不應該沒學過,然你學會了嗎?你知道是幹什麼的嗎?如果那個時候就會了,那你潛質相當高了。作為一個剛過來的人,將以簡單例項化形式記錄自己的學習過程,力圖幫助新手級學習者少走彎路。

(一)關於拉格朗日乘子法

首先來了解拉格朗日乘子法,那麼為什麼需要拉格朗日乘子法?記住,有拉格朗日乘子法的地方,必然是一個組合優化問題。那麼帶約束的優化問題很好說,就比如說下面這個:

minf=2x21+3x22+7x23s.t.2x1+x2=12x2+3x3=2

這是一個帶等式約束的優化問題,有目標值,有約束條件。那麼想想假設沒有約束條件這個問題是怎麼求解的呢?是不是直接f對各個x求導等於0,,解x就可以了,可以看到沒有約束的話,求導為0,那麼各個x均為0吧,這樣f=0了,最小。但是x都為0不滿足約束條件呀,那麼問題就來了。這裡在說一點的是,為什麼上面說求導為0就可以呢?理論上多數問題是可以的,但是有的問題不可以。如果求導為0一定可以的話,那麼f一定是個凸優化問題,什麼是凸的呢?像下面這個左圖:
這裡寫圖片描述

凸的就是開口朝一個方向(向上或向下)。更準確的數學關係就是:

f(x1)+f(x2)2>f(x1+x22)f(x1)+f(x2)2<f(x1+x22)
注意的是這個條件是對函式的任意x取值。如果滿足第一個就是開口向上的凸,第二個是開口向下的凸。可以看到對於凸問題,你去求導的話,是不是隻有一個極點,那麼他就是最優點,很合理。類似的看看上圖右邊這個圖,很明顯這個條件對任意的x取值不滿足,有時滿足第一個關係,有時滿足第二個關係,對應上面的兩處取法就是,所以這種問題就不行,再看看你去對它求導,會得到好幾個極點。然而從圖上可以看到,只有其中一個極點是最優解,其他的是區域性最優解,那麼當真實問題的時候你選擇那個?說了半天要說啥呢,就是拉格朗日法是一定適合於凸問題的,不一定適合於其他問題,還好我們最終的問題是凸問題。

回頭再來看看有約束的問題,既然有了約束不能直接求導,那麼如果把約束去掉不就可以了嗎?怎麼去掉呢?這才需要拉格朗日方法。既然是等式約束,那麼我們把這個約束乘一個係數加到目標函式中去,這樣就相當於既考慮了原目標函式,也考慮了約束條件,比如上面那個函式,加進去就變為:

minf=2x21+3x22+7x23+α1(2x1+x21)+α2(2x2+3x32)
這裡可以看到與α1,α2相乘的部分都為0,所以α1,α2的取值為全體實數。現在這個優化目標函式就沒有約束條件了吧,既然如此,求法就簡單了,分別對x求導等於0,如下:
fx1=4x1+2α1=0x1=0.5α1fx2=6x2+α1+2α2=0x2=α1+2α26fx3=14x3+3α2=0x3=3α214

把它在帶到約束條件中去,可以看到,2個變數兩個等式,可以求解,最終可以得到α1=0.39,α2=1.63,這樣再帶回去求x就可以了。那麼一個帶等式約束的優化問題就通過拉格朗日乘子法完美的解決了。那麼更高一層的,帶有不等式的約束問題怎麼辦?那麼就需要用更一般化的拉格朗日乘子法即KKT條件來解決這種問題了。

(二)關於KKT條件

繼續討論關於帶等式以及不等式的約束條件的凸函式優化。任何原始問題約束條件無非最多3種,等式約束,大於號約束,小於號約束,而這三種最終通過將約束方程化簡化為兩類:約束方程等於0和約束方程小於0。再舉個簡單的方程為例,假設原始約束條件為下列所示:

minf=x212x1+1+x22+4x2+4s.t.x1+10x2>1010x110x2<10
那麼把約束條件變個樣子:
s.t.10x