1. 程式人生 > >詳解SVM系列(六):深入解析 序列最小最優化SMO演算法一

詳解SVM系列(六):深入解析 序列最小最優化SMO演算法一

SMO演算法是幹啥的

首先要先搞明白一個基本的問題: SMO演算法是幹啥的?
通過前面的介紹,我們現在掌握了線性不可分支援向量機。其形式為如下的凸二次規劃:
m i n 1 2

i = 1 N J =
1
N
α i α j y
i
y j K ( x i x j ) i = 1 N α i
min\frac{1}{2}\displaystyle\sum_{i=1}^{N}\displaystyle\sum_{J=1}^{N}α_iα_jy_iy_jK(x_ix_j)-\displaystyle\sum_{i=1}^{N}α_i
s . t . i = 1 N α i y i = 0 s.t.\displaystyle\sum_{i=1}^{N}α_iy_i=0
0 α i C 0≤α_i≤C
但是到現在為止,都沒有講解到底如何求解其中的引數 α α (通過對偶形式求解, α α 是拉格朗日乘子)
如果我們找到了一個 α α 向量, α = α 1 , α 1 , α N α=(α_1,α_1,……α_N) 是最優解,就可以利用KKT條件來計算出原問題的最優解 ( w , b ) (w,b)
w = i = 1 N α i y i x i w=\displaystyle\sum_{i=1}^{N}α_iy_ix_i
取一個 α i > 0 , b = y i w T x i α_i >0,b=y_i-w^Tx_i 就可以得到分離超平面。

那麼問題來了,針對一個這樣的凸二次規劃問題,如何求解?難點在哪?
現有的求解凸二次規劃問題的演算法,都有一個瓶頸,那就是當訓練樣本的容量非常大時,演算法往往變的比較低效,甚至無法求解。

SMO演算法是如何求解這個凸二次規劃問題的呢?它沒有想著怎麼去直接讓目標函式變小,而是採用一個啟發式演算法,想著法的讓這些 α α 變數滿足KKT條件。因為KKT條件是該最優化問題的充分必要條件。
具體怎麼優化 α α ?在優化的過程中需要遵循2個基本原則:
1)每次優化時,必須同時優化 α = α 1 , α 2 , α N α=(α_1,α_2,……α_N) 的兩個分量,因為只優化一個分量的話,新的 α α 向量就不再滿足KKT條件裡面的初始限制條件中的等式約束了( s . t . i = 1 N α i y i = 0 s.t.\displaystyle\sum_{i=1}^{N}α_iy_i=0
2)每次優化的兩個分量應當是違反KKT條件比較多的,還有一個重要的考量,就是經過一次優化後,兩個分量要有儘可能多的改變,這樣才能用盡可能少的迭代優化次數讓它們得到最優解。

SMO演算法是一種 啟發式演算法,其基本思路是:
1)如果 α = α 1 , α 2 , α N α=(α_1,α_2,……α_N) 的每一個分量都滿足該二次規劃的KKT條件,那麼這個最優化問題的解就得到了。(因為KKT條件是該最優化問題的充分必要條件)
2)否則,一次選擇兩個變數,固定其他變數,針對這兩個變數構建一個二次規劃問題。這個二次規劃問題關於這兩個變數的解應該更接近原始二次規劃問題的解,因為這會使得原始二次規劃問題的目標函式值變的更小。更重要的是,這時子問題可以通過解析方法求解,這樣就可以大大提高整個演算法的計算速度。
3)子問題有兩個變數,一個是違反KKT條件最嚴重的那一個(怎麼衡量嚴重性?),另一個由約束條件自動確定(沒那麼簡單)。,如此SMO演算法不斷將原問題分解為子問題並對子問題求解,進而得到求解原問題的目的。

兩個變數的二次規劃求解方法

先不考慮具體如何選擇兩個變數 α 1 , α 2 α_1,α_2 ,我們先來看下如何求解二次規劃問題。
不失一般性,假設選擇的兩個變數時 α 1 , α 2 α_1,α_2 ,其他變數 α i ( i = 3 , 4 , N ) α_i(i=3,4,……N) 是固定的。於是SMO的最優化問題:
m i n 1 2 i = 1 N J = 1 N α i α j y i y j K ( x i x j ) i = 1 N α i min\frac{1}{2}\displaystyle\sum_{i=1}^{N}\displaystyle\sum_{J=1}^{N}α_iα_jy_iy_jK(x_ix_j)-\displaystyle\sum_{i=1}^{N}α_i