1. 前言
最近又重新復習了一遍支持向量機(SVM)。其實個人感覺SVM整體可以分成三個部分:
1. SVM理論本身:包括最大間隔超平面(Maximum Margin Classifier),拉格朗日對偶(Lagrange Duality),支持向量(Support Vector),核函數(Kernel)的引入,松弛變量的軟間隔優化(Outliers),最小序列優化(Sequential Minimal Optimization)等。
2. 核方法(Kernel):其實核方法的發展是可以獨立於SVM來看待的,核方法在很多其它算法中也會應用到。
3. 優化理論:這里主要介紹的是最小序列優化(Sequential Minimal Optimization),優化理論的發展也是獨立於SVM的。
2. SVM理論基礎
SVM的理論基礎在上一篇博客的總結中可以參考:http://www.cnblogs.com/bentuwuying/p/6444249.html。
對於支持向量機(SVM)的簡單總結:
1. Maximum Margin Classifier

2. Lagrange Duality

3. Support Vector
4. Kernel

5. Outliers


6. Sequential Minimal Optimization
個人覺得SMO又可以分為兩部分:
(1)如何選擇每次迭代時候的目標工作集,即選擇哪兩個拉格朗日乘子來迭代。
(2)如何對選擇好的工作集(拉格朗日乘子)進行更新迭代。
3. SMO最初的版本(Platt,1998)



SMO就是要解這個凸二次規划問題,這里的C是個很重要的參數,它從本質上說是用來折中經驗風險和置信風險的,C越大,置信風險越大,經驗風險越小;並且所有的拉格朗日乘子都被限制在了以C為邊長的大盒子里。SMO的出現使得我們不必去求助於昂貴的第三方工具去解決這個凸二次規划問題,目前對它的改進版本很多,這一節先介紹它的最初形式和思想。
SMO是Microsoft Research的John C. Platt在《Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines》一文中提出的,其基本思想是將Vapnik在1982年提出的Chunking方法推到極致,即:通過將原問題分解為一系列小規模凸二次規划問題而獲得原問題解的方法,每次迭代只優化由2個點組成的工作集,SMO算法每次啟發式地選擇兩個拉格朗日乘子同時固定其它拉格朗日乘子來找到這兩個拉格朗日乘子的最優值,直到達到停止條件。
(1)、 KKT條件
SMO是以C-SVC的KKT條件為基礎進行后續操作的,這個KKT條件是:
其中
上述條件其實就是KT互補條件,SVM學習——軟間隔優化一文,有如下結論:


從上面式子可以得到的信息是:當
時,松弛變量
,此時有:
,對應樣本點就是誤分點;當
時,松弛變量
為零,此時有
,對應樣本點就是內部點,即分類正確而又遠離最大間隔分類超平面的那些樣本點;而
時,松弛變量
為零,有
,對應樣本點就是支持向量。
(2)、凸優化問題停止條件
對於凸優化問題,在實現時總需要適當的停止條件來結束優化過程,停止條件可以是:
1、監視目標函數
的增長率,在它低於某個容忍值時停止訓練,這個條件是最直白和簡單的,但是效果不好;
2、監視原問題的KKT條件,對於凸優化來說它們是收斂的充要條件,但是由於KKT條件本身是比較苛刻的,所以也需要設定一個容忍值,即所有樣本在容忍值范圍內滿足KKT條件則認為訓練可以結束;
3、監視可行間隙,它是原始目標函數值和對偶目標函數值的間隙,對於凸二次優化來說這個間隙是零,以一階范數軟間隔為例:
原始目標函數
與對偶目標函數
的差為:





定義比率:
,可以利用這個比率達到某個容忍值作為停止條件。
(3)、SMO思想
沿襲分解思想,固定“Chunking工作集”的大小為2,每次迭代只優化兩個點的最小子集且可直接獲得解析解,算法流程:
(4)、僅含兩個Langrange乘子解析解
為了描述方便定義如下符號:



於是目標函數就變成了:








注意第一個約束條件:
,可以將
看作常數,有
(
為常數,我們不關心它的值),等式兩邊同時乘以
,得到
(
為常數,其值為
,我們不關心它,
)。將
用上式替換則得到一個只含有變量
的求極值問題:

這下問題就簡單了,對
求偏導數得到:

將
、
帶入上式有:
帶入
、
,用
,表示誤差項(可以想象,即使分類正確,
的值也可能很大)、
(
是原始空間向特征空間的映射),這里
可以看成是一個度量兩個樣本相似性的距離,換句話說,一旦選擇核函數則意味着你已經定義了輸入空間中元素的相似性。
最后得到迭代式:

注意第二個約束條件——那個強大的盒子:
,這意味着
也必須落入這個盒子中,綜合考慮兩個約束條件,下圖更直觀:
和
異號的情形
和
同號的情形
可以看到
兩個乘子既要位於邊長為C的盒子里又要在相應直線上,於是對於
的界來說,有如下情況:

整理得下式:

又因為
,
,消去
后得到:

(5)、啟發式的選擇方法
根據選擇的停止條件可以確定怎么樣選擇點能對算法收斂貢獻最大,例如使用監視可行間隙的方法,一個最直白的選擇就是首先優化那些最違反KKT條件的點,所謂違反KKT條件是指:



由前面的停止條件3可知,對可行間隙貢獻最大的點是那些

其中,
取值大的點,這些點導致可行間隙變大,因此應該首先優化它們,原因如下:
1、當滿足KKT條件:即
時,
當違背KKT條件:即
時,
,於是
可見,由於違背KKT條件導致可行間隙變大;
2、當滿足KKT條件:即
時,
當違背KKT條件:即
時
若
則
且
,其中
若
則
且
,其中
可見,由於違背KKT條件依然導致可行間隙變大;
3、當滿足KKT條件:即
時,
當違背KKT條件:即
時,
且
,其中
可見,由於違背KKT條件還是會導致可行間隙變大。
SMO的啟發式選擇有兩個策略:
啟發式選擇1:
最外層循環,首先,在所有樣本中選擇違反KKT條件的一個乘子作為最外層循環,用“啟發式選擇2”選擇另外一個乘子並進行這兩個乘子的優化,接着,從所有非邊界樣本中選擇違反KKT條件的一個乘子作為最外層循環,用“啟發式選擇2”選擇另外一個乘子並進行這兩個乘子的優化(之所以選擇非邊界樣本是為了提高找到違反KKT條件的點的機會),最后,如果上述非邊界樣本中沒有違反KKT條件的樣本,則再從整個樣本中去找,直到所有樣本中沒有需要改變的乘子或者滿足其它停止條件為止。
啟發式選擇2:
內層循環的選擇標准可以從下式看出:

要加快第二個乘子的迭代速度,就要使
最大,而在
上沒什么文章可做,於是只能使
最大。
確定第二個乘子方法:
1、首先在非界乘子中尋找使得
最大的樣本;
2、如果1中沒找到則從隨機位置查找非界乘子樣本;
3、如果2中也沒找到,則從隨機位置查找整個樣本(包含界上和非界乘子)。
(6)、關於兩乘子優化的說明
由式子

可知:

於是對於這個單變量二次函數而言,如果其二階導數
,則二次函數開口向下,可以用上述迭代的方法更新乘子,如果
,則目標函數只能在邊界上取得極值(此時二次函數開口向上),換句話說,SMO要能處理
取任何值的情況,於是在
時有以下式子:
1、
時:

2、
時:

3、 






分別將乘子帶入得到兩種情況下的目標函數值:
和
。顯然,哪種情況下目標函數值最大,則乘子就往哪兒移動,如果目標函數的差在某個指定精度范圍內,說明優化沒有進展。
另外發現,每一步迭代都需要計算輸出
進而得到
,於是還要更新閾值
,使得新的乘子
、
滿足KKT條件,考慮
、
至少有一個在界內,則需要滿足
,於是
的迭代可以這樣得到:
1、設
在界內,則:

又因為:


於是有:


等式兩邊同乘
后移項得:
;
2、設
在界內,則:
;
3、設
、
都在界內,則:情況1和情況2的
值相等,任取一個;
4、設
、
都不在界內,則:
取值為情況1和情況2之間的任意值。
(7)、提高SMO的速度
從實現上來說,對於標准的SMO能提高速度的地方有:
1、能用緩存的地方盡量用,例如,緩存核矩陣,減少重復計算,但是增加了空間復雜度;
2、如果SVM的核為線性核時候,可直接更新
,畢竟每次計算
的代價較高,於是可以利用舊的乘子信息來更新
,具體如下:
,應用到這個性質的例子可以參見SVM學習——Coordinate Desent Method。
3、關注可以並行的點,用並行方法來改進,例如可以使用MPI,將樣本分為若干份,在查找
最大的乘子時可以現在各個節點先找到局部最大點,然后再從中找到全局最大點;又如停止條件是監視對偶間隙,那么可以考慮在每個節點上計算出局部可行間隙,最后在master節點上將局部可行間隙累加得到全局可行間隙。
對標准SMO的改進有很多文獻,例如使用“Maximal Violating Pair ”去啟發式的選擇乘子是一種很有效的方法,還有使用“ Second Order Information”的方法,我覺得理想的算法應該是:算法本身的收斂速度能有較大提高,同時算法可並行程度也較高。
4. SMO更新的版本(Fan,2005)
前面提到過,SMO可以分為兩部分:
(1)如何選擇每次迭代時候的目標工作集,即選擇哪兩個拉格朗日乘子來迭代。
(2)如何對選擇好的工作集(拉格朗日乘子)進行更新迭代。
而如何選擇工作集,是SMO算法很重要的一個部分,因為不同的選擇方式可以導致不同的訓練速度。
Rong-En Fan等人在2005的paper《Working Set Selection Using Second Order Information for Training Support Vector Machines》介紹了每次迭代時幾種不同的工作集選擇方法。
首先還是放出SMO需要優化的目標函數:

(1)Algorithm 1 (SMO-type decomposition method)

(2)WSS 1 (Working set selection via the “maximal violating pair”)

這個working set selection是Keerthi等人在2001年提出的,在2001年發布的libSVM中有所應用。
該working set selection可以由(1)式的KKT條件得出:假設存在向量
是(1)式的解,則必然存在實數
和兩個非負向量
使得下式成立:

其中,
是目標函數的梯度。
上面的條件可以被重寫為:

進一步,有
令,
則目標函數存在最優解
的條件是:


由上面這個關於“Violating pair”的定義可以看出,最大程度上違反(6)式條件的{i, j} pair 即是working set的最佳選擇,因為我們需要對這些最違反(6)式的{i, j} pair做更新迭代,讓它們符合(6)式的要求,便會逐步讓目標函數得到最優值。具體的理論定理如下:

有趣的是,選擇最大程度上違反KKT條件的{i, j} pair 與 “求目標函數的一階近似的最小值”時候取得的{i, j} pair是一致的。即通過WSS 1獲得的{i, j} pair滿足:

通過定義
,(8a)的目標函數即是對
的一階近似進行求最優解:

其中,
是由於
,而(8b)和(8c)是由於
。由於(8a)是線性函數,
則避免了目標函數取值無窮小。
第一眼看上去,(7)式似乎需要對所有的拉格朗日乘子遍歷一遍才能夠找出最優的{i,j} pair,然而,WSS 1可以在線性時間復雜度內找到最優值。證明如下:
Proof

(3)A New Working Set Selection
上面是使用了目標函數的一階近似作為代替進行優化,於是乎,我們可以再進一步,使用目標函數的二階近似作為代替進行優化:


(4)WSS 2 (Working set selection using second order information)

下面的理論證明按照WSS 2可以有效地解決(11)式中的最優值問題:

(5)Non-Positive Definite Kernel Matrices
前面的方法並沒有涵蓋
的情況,對於這種情況,Chen等人在2006年給出了解決方法:


(6)WSS 3 (Working set selection using second order information: any symmetric K)

於是,使用WSS 3來對SMO-type 分解方法選擇working set的步驟為:
(7)Algorithm 2 (An SMO-type decomposition method using WSS 3)




