2 拉格朗日對偶(Lagrange duality)
先拋開上面的二次規划問題,先來看看存在等式約束的極值問題求法,比如下面的最優化問題:
目標函數是f(w),下面是等式約束。通常解法是引入拉格朗日算子,這里使用來表示算子,得到拉格朗日公式為
L是等式約束的個數。
然后分別對w和求偏導,使得偏導數等於0,然后解出w和
。至於為什么引入拉格朗日算子可以求出極值,原因是f(w)的dw變化方向受其他不等式的約束,dw的變化方向與f(w)的梯度垂直時才能獲得極值,而且在極值處,f(w)的梯度與其他等式梯度的線性組合平行,因此他們之間存在線性關系。(參考《最優化與KKT條件》)
然后我們探討有不等式約束的極值問題求法,問題如下:
我們定義一般化的拉格朗日公式
這里的和
都是拉格朗日算子。如果按這個公式求解,會出現問題,因為我們求解的是最小值,而這里的
已經不是0了,我們可以將
調整成很大的正值,來使最后的函數結果是負無窮。因此我們需要排除這種情況,我們定義下面的函數:
這里的P代表primal。假設或者
,那么我們總是可以調整
和
來使得
有最大值為正無窮。而只有g和h滿足約束時,
為f(w)。這個函數的精妙之處在於
,而且求極大值。
因此我們可以寫作
我們使用來表示
。如果直接求解,首先面對的是兩個參數,而
也是不等式約束,然后再在w上求最小值。這個過程不容易做,那么怎么辦呢?
D的意思是對偶,將問題轉化為先求拉格朗日關於w的最小值,將
和
看作是固定值。之后在
求最大值的話:
這個問題是原問題的對偶問題,相對於原問題只是更換了min和max的順序,而一般更換順序的結果是Max Min(X) <= MinMax(X)。然而在這里兩者相等。用來表示對偶問題如下:
下面解釋在什么條件下兩者會等價。假設f和g都是凸函數,h是仿射的(affine,)。並且存在w使得對於所有的i,
。在這種假設下,一定存在
使得
是原問題的解,
是對偶問題的解。還有
另外,
滿足庫恩-塔克條件(Karush-Kuhn-Tucker, KKT condition),該條件如下:
所以如果滿足了庫恩-塔克條件,那么他們就是原問題和對偶問題的解。讓我們再次審視公式(5),這個條件稱作是KKT dual complementarity條件。這個條件隱含了如果
,那么
。也就是說,
時,w處於可行域的邊界上,這時才是起作用的約束。而其他位於可行域內部(
的)點都是不起作用的約束,其
。這個KKT雙重補足條件會用來解釋支持向量和SMO的收斂測試。
這部分內容思路比較凌亂,還需要先研究下《非線性規划》中的約束極值問題,再回頭看看。KKT的總體思想是將極值會在可行域邊界上取得,也就是不等式為0或等式約束里取得,而最優下降方向一般是這些等式的線性組合,其中每個元素要么是不等式為0的約束,要么是等式約束。對於在可行域邊界內的點,對最優解不起作用,因此前面的系數為0。
最優間隔分類器(optimal margin classifier)
重新回到SVM的優化問題:
我們將約束條件改寫為:
從KKT條件得知只有函數間隔是1(離超平面最近的點)的線性約束式前面的系數,也就是說這些約束式
,對於其他的不在線上的點(
),極值不會在他們所在的范圍內取得,因此前面的系數
.注意每一個約束式實際就是一個訓練樣本。
看下面的圖:
實線是最大間隔超平面,假設×號的是正例,圓圈的是負例。在虛線上的點就是函數間隔是1的點,那么他們前面的系數,其他點都是
。這三個點稱作支持向量。構造拉格朗日函數如下:
注意到這里只有沒有
是因為原問題中沒有等式約束,只有不等式約束。
下面我們按照對偶問題的求解步驟來一步步進行,
首先求解的最小值,對於固定的
,
的最小值只與w和b有關。對w和b分別求偏導數。
並得到
將上式帶回到拉格朗日函數中得到,此時得到的是該函數的最小值(目標函數是凸函數)
代入后,化簡過程如下:
最后得到
由於最后一項是0,因此簡化為
此時的拉格朗日函數只包含了變量。然而我們求出了
才能得到w和b。
前面提到過對偶問題和原問題滿足的幾個條件,首先由於目標函數和線性約束都是凸函數,而且這里不存在等式約束h。存在w使得對於所有的i,。因此,一定存在
使得
是原問題的解,
是對偶問題的解。在這里,求
就是求
了。
即可求出b。即離超平面最近的正的函數間隔要等於離超平面最近的負的函數間隔。
關於上面的對偶問題如何求解,將留給下一篇中的SMO算法來闡明。
這里考慮另外一個問題,由於前面求解中得到
我們通篇考慮問題的出發點是,根據求解得到的
,我們代入前式得到
也就是說,以前新來的要分類的樣本首先根據w和b做一次線性運算,然后看求的結果是大於0還是小於0,來判斷正例還是負例。現在有了,我們不需要求出w,只需將新來的樣本和訓練數據中的所有樣本做內積和即可。那有人會說,與前面所有的樣本都做運算是不是太耗時了?其實不然,我們從KKT條件中得到,只有支持向量的
,其他情況
。因此,我們只需求新來的樣本和支持向量的內積,然后運算即可。這種寫法為下面要提到的核函數(kernel)做了很好的鋪墊。這是上篇,先寫這么多了。