前幾篇侃了侃SVM的基本原理和一些相關知識,尤其是在SVM學習——軟間隔最佳化這一篇,提到了SVM學習器的兩種形式,常被叫做L1-SVM和L2-SVM,這兩種形式的區別在損失函數的形式上,令訓練範例為,取值為-1或+1,
軟間隔最佳化的原始形式為:
當損失函數時就叫做L1-SVM,當損失函數 時叫做L2-SVM,實際當中解這個問題其實可以從原始形式開始,也可以從其對偶形式開始:
設,,則兩種軟間隔最佳化的對偶形式可以用統一的形式表示:
其中:為單位列向量,,,為對角矩陣
對於L1-SVM: && ;對於L2-SVM: && 。
不管哪種形式,都是一個凸二次規劃問題,不論是向量維度大或者是樣本量很大的時候,求解這個最佳化問題難度都不小,於是在解得稀疏性(比如只需要得到支援向量)、目標函數的凸性等方面動腦筋,得到一些較有效率的方法,比如SMO(Sequential Minimal Opimisation)、梯度下降法、Trust Region Newton Method、Coordinate Desent Method 等等,這裡面呢,我對Coordinate Desent Method 比較感興趣,我就把我學到的東西說一下。
先瞭解幾個概念:
1、度量空間:它是一個集合,在其中可以定義這個集合中元素之間的距離(叫做度量)的概念,這個距離滿足非負性、同一性、對稱性以及三角不等式(類似於咱們小時候學的,任意三角形,兩邊之和大於第三邊),見http://zh.wikipedia.org/zh-cn/%E5%BA%A6%E9%87%8F%E7%A9%BA%E9%97%B4。
2、Lipschitz 函數:對於一個實值函數以及定義在實數域(實數域包含有理數和無理數而且它是完備的)上的集合,如果存在常數L>0,使得,則這個函數叫做Lipschitz 函數(這裡用2-範數來度量集合中兩個向量和的距離),它的幾何意義其實就是:曲線上的任意兩點的連線的斜率都有一個相同的上界,見http://zh.wikipedia.org/zh-cn/%E5%88%A9%E6%99%AE%E5%B8%8C%E8%8C%A8%E9%80%A3%E7%BA%8C。
直觀的看滿足Lipschitz 條件條件的函數一定是連續函數,而且曲線更加光滑,反之不然,比如在[0,1]上的函數,顯然它不滿足Lipschitz 條件。
定理1:如果定義在實數域上的集合是一個凸集,實值函數連續可微且在內其梯度有界,則。
偶簡單推導一下:
是一個凸集,那麼根據凸集定義:對於凸集中的任意向量和(不是一般性,假設),有,其中。顯然在[,]上連續,在(,)內可導,而在與之間,根據拉格朗日中值定理有,,其中,顯然。
之所介紹Lipschitz 條件是因為,如果可微函數的梯度滿足Lipschitz連續條件,即:,則有:
(證明過程比較直白,偶就不寫了,只要把f展開成二階泰勒級數,然後代入Lipschitz連續條件得證)
基於梯度下降(GD)的演算法應該是最為大家所熟知的一類演算法(最速下降法、牛頓法、阻尼牛頓法、擬牛頓法等等),我把滿足上述條件的不等式換成另一種寫法吧:
對於最小化問題,總是希望每次迭代都可以讓,這樣我們會越來越接近目標,對於上式的右邊部分用函數代替,可以很容易知道,在點,取到極小值(嘿嘿,比如求導),於是,梯度下降演算法可以被概括為:
GD Algorithm:
1、選擇初始點,令;
2、(不滿足結束條件){
; //這裡的S是個保序操作符(是保序操作符,指如果,則有)
;
}
與GD較為不同的另一類演算法就叫做Coordinate Desent Method,這種方法的特點是,演算法有兩層迭代,最內層迭代是一個搜尋過程,搜尋是依據n維向量的n個座標方向分別搜尋,每次迭代會將除了當前方向外的其他方向分量固定,然後在此基礎上最小化目標函數,下次迭代時會選擇另外一個分量進行相同的處理,經過了n次迭代後得到一個n維向量,然後更新目標向量,接著繼續進行外層的迭代,概括這個過程如下:
CD Algorithm :
1、選擇初始點,令;
2、(不滿足結束條件){
{ //假設特徵空間維度為
; //這裡的S是個操作符
; ()
}
;
;
}
還記著開篇提到的L1-SVM和L2-SVM的統一形式吧,稍微轉換一下形式,並把擴充為,把擴充為:
其中:為單位列向量,,,為對角矩陣
對於L1-SVM: && ;對於L2-SVM: && 。
下面介紹一種基於Coordinate Descent 的演算法,該演算法出自《A Dual Coordinate Descent Method for Large-scale Linear SVM》一文。
整個演算法架構同CD Algorithm。
1、假設樣本數為,當前外層迴圈的索引為,當前內層迴圈索引為,其取值為,對於向量有表示形式:
,;
,表示還沒有開始內層迴圈時的狀態,,表示對所有分量更新完畢。
2、內層迴圈中的S操作的過程是求解子問題:
,其中,第個分量的值為1。
大家可以在紙上稍作推導,上面這個問題的目標函數可以表示為:
,其中表示梯度的第個分量
這是一個二次函數,除了帶d的部分以外可以看做一個常量,即上述形式為:
令\begin{cases}
\nabla_i W(\alpha) & if \quad 0<\alpha_i<U\\
min(0,\nabla_i W(\alpha)) & if \quad \alpha_i=0\\
max(0,\nabla_i W(\alpha)) & if \quad \alpha_i=U
\end{cases}" src="http://chart.apis.google.com/chart?cht=tx&chl=%5cnabla_i%5e'+W(%5calpha)%3d%0d%0a%5cbegin%7bcases%7d%0d%0a%5cnabla_i+W(%5calpha)+%26+if+%5cquad+0%3c%5calpha_i%3cU%5c%5c%0d%0amin(0%2c%5cnabla_i+W(%5calpha))+%26+if+%5cquad+%5calpha_i%3d0%5c%5c%0d%0amax(0%2c%5cnabla_i+W(%5calpha))+%26+if+%5cquad+%5calpha_i%3dU%0d%0a%5cend%7bcases%7d">
1)、當時不需要對當前分量進行更新;
2)、對上式求K-T點並考慮約束條件,如果則有:
計算,就是將核矩陣的第行向量和向量做內積,這個操作代價很高,但是對於線性SVM,有(還記得那個互補條件吧,嘿嘿),又有、,於是上式就變成了,這個計算的代價就沒有那麼高了,顯然在更新的時候需要對也更新,要是每次都計算就代價太高了,所以文中利用更新前和更新後的值來確定,如下:
(這個方法很巧)
3)、當時候,可知,這種情況只會出現在L1_SVM中,且此時沒有閾值項,就是那個向量裡的分量1,否則不可能滿足,此時新的分量值就取。
A dual coordinate descent method for Linear SVM演算法描述如下:
1、選擇初始點,
令,
;
2、(不滿足結束條件,這裡可以設定一個精度條件){
{
;
\begin{cases}
G & if \quad 0<\alpha_i<U\\
min(0,G) & if \quad \alpha_i=0\\
max(0,G) & if \quad \alpha_i=U
\end{cases}" src="http://chart.apis.google.com/chart?cht=tx&chl=PG%3d%0d%0a%5cbegin%7bcases%7d%0d%0aG+%26+if+%5cquad+0%3c%5calpha_i%3cU%5c%5c%0d%0amin(0%2cG)+%26+if+%5cquad+%5calpha_i%3d0%5c%5c%0d%0amax(0%2cG)+%26+if+%5cquad+%5calpha_i%3dU%0d%0a%5cend%7bcases%7d"> ;
{
;
;
;
}
}
;
;
}
與GD方法相比,coordinate descent 類方法的特點是每次迭代的代價較低,由於各分量之間有前後依賴關係,所以感覺要實現並行有點困難, 但是總的來說,沒有最好的方法只有最適合的方法。