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

夜空中最亮的不咚發表於2018-04-11

轉載 原地址https://blog.csdn.net/on2way/article/details/47729419

寫在之前

支援向量機(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一定是個凸優化問題,什麼是凸的呢?像下面這個左圖:

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




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

f(x1)+f(x2)2>f(x1+x22)或者f(x1)+f(x2)2<f(x1+x22)

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

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

minf=2x21+3x22+7x23+α1(2x1+x2−1)+α2(2x2+3x3−2)

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

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

(二)關於KKT條件

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

minf=x21−2x1+1+x22+4x2+4s.t.x1+10x2>1010x1−10x2<10

那麼把約束條件變個樣子:
s.t.10−x1−10x2<010x1−x2−10<0

為什麼都變成等號與小於號,方便後面的,反正式子的關係沒有發生任何變化就行了。

現在將約束拿到目標函式中去就變成:

L(x,α)=f(x)+α1g1(x)+α2g2(x)=x21−2x1+1+x22+4x2+4+α1(10−x1−10x2)+α2(10x1−x2−10)

那麼KKT條件的定理是什麼呢?就是如果一個優化問題在轉變完後變成
L(x,α,β)=f(x)+∑αigi(x)+∑βihi(x)

其中g是不等式約束,h是等式約束(像上面那個只有不等式約束,也可能有等式約束)。那麼KKT條件就是函式的最優值必定滿足下面條件:

(1) L對各個x求導為零;
(2) h(x)=0;
(3) ∑αigi(x)=0,αi≥0

這三個式子前兩個好理解,重點是第三個式子不好理解,因為我們知道在約束條件變完後,所有的g(x)<=0,且αi≥0,然後求和還要為0,無非就是告訴你,要麼某個不等式gi(x)=0,要麼其對應的αi=0。那麼為什麼KKT的條件是這樣的呢?

假設有一個目標函式,以及它的約束條件,形象的畫出來就如下:

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

假設就這麼幾個吧,最終約束是把自變數約束在一定範圍,而函式是在這個範圍內尋找最優解。函式開始也不知道該取哪一個值是吧,那就隨便取一個,假設某一次取得自變數集合為x1*,發現一看,不滿足約束,然後再換呀換,換到了x2*,發現可以了,但是這個時候函式值不是最優的,並且x2*使得g1(x)與g2(x)等於0了,而g3(x)還是小於0。這個時候,我們發現在x2的基礎上再尋找一組更優解要靠誰呢?當然是要靠約束條件g1(x)與g2(x),因為他們等於0了,很極限呀,一不小心,走錯了就不滿足它們兩了,這個時候我們會選擇g1(x)與g2(x)的梯度方向往下走,這樣才能最大程度的拜託g1(x)與g2(x)=0的命運,使得他們滿足小於0的約束條件對不對。至於這個時候需不需要管g3(x)呢?正常來說管不管都可以,如果管了,也取g3在x2*處的梯度的話,因為g3已經滿足了小於0的條件,這個時候在取在x2*處的梯度,你能保證它是往好的變了還是往差的變了?答案是都有可能。運氣好,往好的變了,可以更快得到結果,運氣不好,往差的變了,反而適得其反。那麼如果不管呢?因為g1(x)與g2(x)已經在邊緣了,所以取它的梯度是一定會讓目標函式變好的。綜合來看,這個時候我們就不選g3。那麼再往下走,假設到了自變數優化到了x3*,這個時候發現g2(x)與g3(x)等於0,也就是走到邊了,而g1(x)小於0,可變化的空間綽綽有餘,那麼這個時候舉要取g2(x)與g3(x)的梯度方向作為變化的方向,而不用管g1(x)。那麼一直這樣走呀走,最終找到最優解。可以看到的是,上述如果g1(x)、g2(x)=0的話,我們是需要優化它的,又因為他們本身的條件是小於0的,所以最終的公式推導上表明,是要乘以一個正係數α作為他們梯度增長的倍數,而那些不需要管的g(x)為了統一表示,這個時候可以將這個係數設定為0,那麼這一項在這一次的優化中就沒有了。那麼把這兩種綜合起來就可以表示為
∑αigi(x)=0,αi≥0。
也即是某次的g(x)在為最優解起作用,那麼它的係數值(可以)不為0。如果某次g(x)沒有為下一次的最優解x的獲得起到作用,那麼它的係數就必須為0,這就是這個公式的含義。

比如上面例子的目標值與約束: 

minf=x21−2x1+1+x22+4x2+4s.t.10−x1−10x2<010x1−x2−10<0

將約束提到函式中有:
L(x,α)=x21−2x1+1+x22+4x2+4+α1(10−x1−10x2)+α2(10x1−x2−10)

此時分別對x1、x2求導數:
∂L∂x1=2x1−2−α1+10α2=0⇒x1=0.5(α1−10α2+2)∂L∂x2=2x2+4−10α1−α2=0⇒x2=0.5(10α1+α2−4)

而我們還有一個條件就是α∗g(x)=0,那麼也就是:
α1∗g1(x)=α1∗(10−x1−10x2)=0α2∗g2(x)=α2∗(10x1−x2−10)=0

這樣我們就去討論下,要麼g=0,要麼α=0,這裡兩個g兩個α,這樣我們就需要討論四種情況,可能你會說,這是約束條件少的情況,那麼如果有10個約束條件,這樣就有10個g和10個α,你去給我討論?多少種組合,不知道,但是換個思路,我們非得去10個一起去討論?機智的學者想到一種方法,考慮到∑αigi(x)=0這個條件,那麼我兩個兩個討論不就可以了,比如現在我就討論α7,α8,讓其他的α不變,為什麼選或者至少選兩個討論呢,因為這個式子求和為0,改變一個顯然是不行的,那就改變兩個,你增我就減,這樣和可以為0。再問為什麼不討論3個呢?也可以,這不是麻煩嘛,一個俗語怎麼說來著,三個和尚沒水喝,假設你改變了一個,另外兩個你說誰去減或者加使得和為0,還是兩個都變化一點呢?不好說吧,自然界都是成雙成對的才和諧,沒有成三成四的(有的話也少)。這裡順便提一下後面會介紹到的內容,就是實現SVM演算法的SMO方法,在哪裡,會有很多α,那麼人們怎麼解決的呢,就是隨便選擇兩個α去變化,看看結果好的話,就接受,不好的話就捨棄在選擇兩個α,如此反覆,後面介紹。

說回來,這裡有四種情況,正好兩個α,也不用挑不用減的,一次完事。那麼我們分著討論吧,
(1)α1=α2=0,那麼看上面的關係可以得到x1=1,x2=−1,再把兩個x帶到不等式約束,發現第一個就是需要滿足(10-1+20=29<0)顯然不行,29>0的。捨棄

(2)g1(x)=g2(x)=0,帶進去解得,x1=110/101;x2=90/101,再帶回去求解α1,α2,發現α1=58/101,α2=4/101,它們滿足大於0的條件,那麼顯然這組解是可以的。

(3)其他兩種情況再去討論發現是不行的。

可以看到像這種簡單的討論完以後就可以得到解了。
x1=110/101=1.08;x2=90/101=0.89,那麼它得到結果對不對呢?這裡因為函式簡單,可以在matlab下畫出來,同時約束條件也可以畫出來,那麼原問題以及它的約束面畫出來就如下所示:

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


這是擷取下來的符合約束要求的目標面 


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


可以看到最優解確實就是上面我們求的那個解。既然簡單的問題可以這樣解,那麼複雜一點的只需要簡單化,照樣可以解,至此KKT條件解這類約束性問題就是這樣,它對後續的SVM求解最優解至關重要。




相關文章