支持向量機(Support Vector Machine)-----SVM之SMO算法(轉)


此文轉自兩篇博文 有修改

序列最小優化算法(英語:Sequential minimal optimization, SMO)是一種用於解決支持向量機訓練過程中所產生優化問題的算法。SMO由微軟研究院的約翰·普萊特(John Platt)發明於1998年,目前被廣泛使用於SVM的訓練過程中,並在通行的SVM庫libsvm中得到實現。

1998年,SMO算法發表在SVM研究領域內引起了轟動,因為先前可用的SVM訓練方法必須使用復雜的方法,並需要昂貴的第三方二次規划工具。而SMO算法較好地避免了這一問題。

 

前面最后留下來一個對偶函數最后的優化問題,原式為:

 

          
max \quad \quad W(\alpha)=\sum\limits_{i=1}^{n}\alpha-\frac{1}{2}\sum\limits_{i,j=1}^{n}{y_iy_j\alpha_i\alpha_j(K(x_i,x_j))

 

                               -----------------這個是由拉格朗日方法 然后求偏導 列式帶入核函數得到的目標函數

                                                        s.t.        \sum\limits_{i=1}^{n}y_i\alpha_i=0

 

                                                                     0 \leq \alpha_i \leq C          

 

 

SMO就是要解這個凸二次規划問題,這里的C是個很重要的參數,它從本質上說是用來折中經驗風險和置信風險的,C越大,置信風險越大,經驗風險越小;並且所有的\alpha因子都被限制在了以C為邊長的大盒子里。

 

 

算法詳述

(1)、 KKT條件

        SMO是以C-SVC的KKT條件為基礎進行后續操作的,這個KKT條件是

                                         \alpha_i=0  \Leftrightarrow y_iu_i \geq 1

                                         0 \leq \alpha_i \leq C \Leftrightarrow y_iu_i = 1

                                         \alpha_i=C  \Leftrightarrow y_iu_i \leq 1

          其中u_i=<w,x_i />+b

上述條件其實就是KT互補條件,SVM學習——軟間隔優化一文,有如下結論:

                                 \alpha_i(y_i(<w,x_i />+b)- 1+\xi_i)=0 (i=1,2,...n)

                                         \mu_i\xi_i=(\alpha_i-C)\xi_i=0 (i=1,2,...n)

       從上面式子可以得到的信息是:\alpha_i=C時,松弛變量\xi_i  \geq 0,此時有:y_i(<w,x_i />+b)= 1-\xi_i \Rightarrow y_i(<w,x_i>+b) \leq 1 \Rightarrow y_iu_i  \leq 1 ,對應樣本點就是誤分點;當\alpha_i=0時,松弛變量\xi_i為零,此時有y_i(<w,x_i />+b) \geq  1 \Rightarrow  y_iu_i  \geq 1 ,對應樣本點就是內部點,即分類正確而又遠離最大間隔分類超平面的那些樣本點;而0 < \alpha_i  <C時,松弛變量\xi_i為零,有y_i(<w,x_i />+b) =  1 \Rightarrow  y_iu_i  = 1 ,對應樣本點就是支持向量。

(2)、凸優化問題停止條件

對於凸優化問題,在實現時總需要適當的停止條件來結束優化過程,停止條件可以是:

       1、監視目標函數W(\alpha)的增長率,在它低於某個容忍值時停止訓練,這個條件是最直白和簡單的,但是效果不好;

       2、監視原問題的KKT條件,對於凸優化來說它們是收斂的充要條件,但是由於KKT條件本身是比較苛刻的,所以也需要設定一個容忍值,即所有樣本在容忍值范圍內滿足KKT條件則認為訓練可以結束;

       3、監視可行間隙,它是原始目標函數值和對偶目標函數值的間隙,對於凸二次優化來說這個間隙是零,以一階范數軟間隔為例:

原始目標函數O(w,b)與對偶目標函數W(\alpha)的差為:

        Gap=\frac{1}{2}<w,w />+C\sum\limits_{i=1}^{n}\xi_i-( \sum\limits_{i=1}^{n}\alpha-\frac{1}{2}\sum\limits_{i,j=1}^{n}{y_iy_j\alpha_i\alpha_j(K(x_i,x_j)))

                                     =\frac{1}{2}\sum\limits_{i,j=1}^{n}{y_iy_j\alpha_i\alpha_jK(x_i,x_j)+C\sum\limits_{i=1}^{n}\xi_i-( \sum\limits_{i=1}^{n}\alpha_i-\frac{1}{2}\sum\limits_{i,j=1}^{n}{y_iy_j\alpha_i\alpha_j(K(x_i,x_j)))

                                     =\sum\limits_{i,j=1}^{n}{y_iy_j\alpha_i\alpha_jK(x_i,x_j)+C\sum\limits_{i=1}^{n}\xi_i- \sum\limits_{i=1}^{n}\alpha_i

                                     =2 \sum\limits_{i=1}^{n}\alpha_i
-2W(\alpha)+C\sum\limits_{i=1}^{n}\xi_i- \sum\limits_{i=1}^{n}\alpha_i

                                     = \sum\limits_{i=1}^{n}\alpha_i
-2W(\alpha)+C\sum\limits_{i=1}^{n}\xi_i

定義比率:

                 \frac{O(w,b)-W(\alpha)}{O(w,b)+1)},可以利用這個比率達到某個容忍值作為停止條件。

(3)、SMO思想

        沿襲分解思想,固定“Chunking工作集”的大小為2,每次迭代只優化兩個點的最小子集且可直接獲得解析解,算法流程:

 

image

 

(4)、僅含兩個Langrange乘子解析解

       為了描述方便定義如下符號:

                                          K_{ij}=K(\mathbf{x_i}, \mathbf{x_j})

                                           f(\mathbf{x_i})=\sum_{j=1}^n y_i \alpha_i K_{ij} + b

                                          v_i=\sum_{j=3}^n y_j \alpha_j K_{ij} =f(\mathbf{x_i})-\sum_{j=1}^2 y_j \alpha_j K_{ij} - b

於是目標函數就變成了:

                                         
W(\alpha_2) =\sum_{i=1}^n \alpha_i - \frac12 \sum_{i=1}^n \sum_{j=1}^n y_i y_j K(x_i, x_j) \alpha_i \alpha_j \\
   

                                                      =\alpha_1+\alpha_2+ \sum_{i=3}^n \alpha_i-\frac{1}{2}\sum_{i=1}^n(\sum_{j=1}^2y_iy_j\alpha_i\alpha_jK{(x_ix_j)}+\sum_{j=3}^ny_iy_j\alpha_i\alpha_jK{(x_ix_j)})   

                                                      =\alpha_1+\alpha_2+ \sum_{i=3}^n \alpha_i-\frac{1}{2}\sum_{i=1}^2(\sum_{j=1}^2y_iy_j\alpha_i\alpha_jK{(x_ix_j)}+\sum_{j=3}^ny_iy_j\alpha_i\alpha_jK{(x_ix_j)})

                                                                                     -\frac{1}{2}\sum_{i=3}^n(\sum_{j=1}^2y_iy_j\alpha_i\alpha_jK{(x_ix_j)}+\sum_{j=3}^ny_iy_j\alpha_i\alpha_jK{(x_ix_j)})           

                                                      =\alpha_1+\alpha_2+ \sum_{i=3}^n \alpha_i-\frac{1}{2}\sum_{i=1}^2\sum_{j=1}^2y_iy_j\alpha_i\alpha_jK{(x_ix_j)}-\sum_{i=1}^2\sum_{j=3}^ny_iy_j\alpha_i\alpha_jK{(x_ix_j)}

                                                                                     -\frac{1}{2}\sum_{i=3}^n\sum_{j=3}^ny_iy_j\alpha_i\alpha_jK{(x_ix_j)}

                                                       =\alpha_1+\alpha_2-\frac12 K_{11} \alpha_1^2 - \frac12 K_{22} \alpha_2^2 - y_1 y_2 K_{12} \alpha_1 \alpha_2 \\

                                                                     -y_1\alpha_1\sum_{j=3}^ny_j\alpha_jK{(x_1x_j)}-y_2\alpha_2\sum_{j=3}^ny_j\alpha_jK{(x_2x_j)}

                                                                     + \sum_{i=3}^n \alpha_i-\frac{1}{2}\sum_{i=3}^n\sum_{j=3}^ny_iy_j\alpha_i\alpha_jK{(x_ix_j)}

                                                       =\alpha_1+\alpha_2-\frac12 K_{11} \alpha_1^2 - \frac12 K_{22} \alpha_2^2 - y_1 y_2 K_{12} \alpha_1 \alpha_2 \\

                                                                     - y_1 \alpha_1 v_1 - y_2 \alpha_2 v_2 + \text{constant} \

注意第一個約束條件:\sum_{i=1}^n y_i \alpha_i = 0,可以將\alpha_3, \ldots, \alpha_n, y_3, \ldots, y_n看作常數,有\alpha_1 y_1 + \alpha_2 y_2 = C^'(C^'為常數,我們不關心它的值),等式兩邊同時乘以y_1,得到\alpha_1 = \gamma - s \alpha_2 \gamma為常數,其值為C^'y_1,我們不關心它,)。將\alpha_1用上式替換則得到一個只含有變量\alpha_2的求極值問題:

                                         W(\alpha_2) =\gamma - s \alpha_2 + \alpha_2 - \frac12 K_{11} (\gamma - s \alpha_2)^2 - \frac12 K_{22} \alpha_2^2 \\

                                                           - s K_{12} (\gamma - s \alpha_2)\alpha_2 - y_1(\gamma - s \alpha_2)v_1 - y_2 \alpha_2 v_2 + \text{constant}                                         

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

                                        
\frac{\partial W(\alpha_2)}{\partial \alpha_2} = -s + 1 + s K_{11} \gamma - K_{11} \alpha_2 - K_{22}\alpha_2 -s\gamma K_{12}+ 2K_{12}\alpha_2 + y_2v_1 - y_2 v_2 = 0

y_2^2=1 s=y_1y_2帶入上式有:

                    \alpha_2^{new} = \frac{y_2(y_2 - y_1 + y_1 \gamma (K_{11}-K_{12})+v_1-v_2)}{K_{11}+K_{22}-2K_{12}}

帶入v_i \gamma =\alpha_1^{old} + s \alpha_2^{old} ,用E_i = f(\mathbf{x}_i) - y_i,表示誤差項(可以想象,即使分類正確,f(x_i) 的值也可能很大)、\eta = K_{11}+K_{22}-2K_{12} \ = ||\Phi(x_1)-\Phi(x_2)||^2(\Phi是原始空間向特征空間的映射),這里\sqrt {\eta }可以看成是一個度量兩個樣本相似性的距離,換句話說,一旦選擇核函數則意味着你已經定義了輸入空間中元素的相似性

最后得到迭代式:

                                        \alpha_2^{new} = \alpha_2^{old} + \frac{y_2(E_1-E_2)}{\eta}

注意第二個約束條件——那個強大的盒子0 \leq \alpha_i \leq C,這意味着\alpha_2^{new}也必須落入這個盒子中,綜合考慮兩個約束條件,下圖更直觀:

image

y_1y_2異號的情形

image

y_1y_2同號的情形

可以看到\alpha_1, \alpha_2兩個乘子既要位於邊長為C的盒子里又要在相應直線上,於是對於\alpha_2的界來說,有如下情況:

                                         \begin{cases}
\ L=max{\left\{0, \alpha_2^{old} - \alpha_1^{old}\right\}} \quad \quad \quad  & y_1y_2 = -1, \\
\ L=max{\left\{0, \alpha_1^{old} + \alpha_2^{old} - C \right\}}& y_1y_2 = 1,
\end{cases  \begin{cases}
\ H=min{\left\{C,  C + \alpha_2^{old} - \alpha_1^{old}\right\}} \quad \quad   & y_1y_2 = -1\\
\ H=min{\left\{C, \alpha_1^{old} + \alpha_2^{old}  \right\}}& y_1y_2 = 1
\end{cases}

整理得下式:

                                          \alpha_2^{new,clipped}
=
\begin{cases}
\  L \quad \quad \quad & \alpha_2^{new}  \leq L\\
\ \alpha_2^{new}  \quad \quad \quad & L< \alpha_2^{new} < H\\
\ H  \quad & \alpha_2^{new}  \geq H
\end{cases}

又因為\alpha_1^{old} = \gamma - s \alpha_2 ^{old}\alpha_1^{new} = \gamma - s \alpha_2 ^{new,clipped},消去\gamma后得到:

                                          \alpha_1^{new}=\alpha_1^{old}+y_1y_2(\alpha_2^{old}-\alpha_2^{new,clipped})

 

(5).綜上可總結出SMO的算法框架

SMO算法是一個迭代優化算法。在每一個迭代步驟中,算法首先選取兩個待更新的向量,此后分別計算它們的誤差項,並根據上述結果計算出。最后再根據SVM的定義計算出偏移量\mathbf{b}。對於誤差項而言,可以根據和b的增量進行調整,而無需每次重新計算。具體的算法如下:

 

1. 隨機數初始化向量權重,並計算偏移b。(這一步初始化向量權重只要使符合上述的約束條件即可,原博文的程序就是range函數)

2.初始化誤差項,其中 

E_i = f(\mathbf{x}_i) - y_i   

  f(\mathbf{x_i})=\sum_{j=1}^n y_i \alpha_i K_{ij} + b

 

 

3.選取兩個向量作為需要調整的點(例如第一次下標為1,2兩點,第二次下標3,4...........),然后

    令\alpha_2^{new} = \alpha_2^{old} + \frac{y_2(E_1-E_2)}{\eta}其中\eta = K_{11}+K_{22}-2K_{12} \ = ||\Phi(x_1)-\Phi(x_2)||^2(\Phi是原始空間向特征空間的映射),K_{ij}=K(\mathbf{x_i}, \mathbf{x_j})

 

 

4.if  >H   令=H   if  <L  令=L (L,H前面已給出)

5.令

 

6.利用更新的修改和b的值

7.如果達到終止條件,則算法停止,否則轉向3

 

算法補充說明:

 優化向量選擇方法

可以采用啟發式的方法選擇每次迭代中需要優化的向量。第一個向量可以選取不滿足支持向量機KKT條件的向量,亦即不滿足

即:
   \alpha_i=0  \Leftrightarrow y_iu_i \geq 1

   0 \leq \alpha_i \leq C \Leftrightarrow y_iu_i = 1

   \alpha_i=C  \Leftrightarrow y_iu_i \leq 1               其中u_i=<w,x_i />+b

的向量。而第二個向量可以選擇使得最大的向量。

    終止條件

SMO算法的終止條件可以為KKT條件對所有向量均滿足,或者目標函數增長率小於某個閾值,即

(根據前面的凸優化問題停止條件所說,此效果可能不佳,可選擇其他方法,見(2))

 

---------------------------------以下內容是有關可行間隙方法,乘子優化,SMO加速問題,是深化的內容------------------------------------------------

(6)、啟發式的選擇方法

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

                                          \alpha_i=0 \quad \quad \quad && \quad \quad \quad y_iu_i<1

                                          0 \leq \alpha_i \leq C \quad \quad \quad && \quad \quad \quad y_iu_i \neq 1

                                          \alpha_i=C  \quad \quad \quad && \quad \quad \quad y_iu_i  /> 1

其中KKT條件

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

                                          Gap_i=\alpha_i(y_i(\sum\limits_{j=1}^{n}\alpha_jy_iK(x_i,x_j))-1)+C\xi_i=\alpha_i(y_iu_i-1-y_ib))+C\xi_i

                                         其中\xi_i=max(0,1-y_iu_i)

取值大的點,這些點導致可行間隙變大,因此應該首先優化它們(原因見原博文:http://www.cnblogs.com/vivounicorn/archive/2011/06/01/2067496.html)

 

  SMO的啟發式選擇有兩個策略:

        啟發式選擇1:

        最外層循環,首先,在所有樣本中選擇違反KKT條件的一個乘子作為最外層循環,用“啟發式選擇2”選擇另外一個乘子並進行這兩個乘子的優化,接着,從所有非邊界樣本中選擇違反KKT條件的一個乘子作為最外層循環,用“啟發式選擇2”選擇另外一個乘子並進行這兩個乘子的優化(之所以選擇非邊界樣本是為了提高找到違反KKT條件的點的機會),最后,如果上述非邊界樣本中沒有違反KKT條件的樣本,則再從整個樣本中去找,直到所有樣本中沒有需要改變的乘子或者滿足其它停止條件為止。

        啟發式選擇2:

        內層循環的選擇標准可以從下式看出:

                                             \alpha_2^{new} = \alpha_2^{old} + \frac{y_2(E_1-E_2)}{\eta}

要加快第二個乘子的迭代速度,就要使\alpha_2^{old} + \frac{y_2(E_1-E_2)}{\eta}
最大,而在\eta上沒什么文章可做,於是只能使|E_1-E_2|最大。

確定第二個乘子方法:

        1、首先在非界乘子中尋找使得|E_1-E_2|最大的樣本;        

        2、如果1中沒找到則從隨機位置查找非界乘子樣本;        

        3、如果2中也沒找到,則從隨機位置查找整個樣本(包含界上和非界乘子)。

(7)、關於兩乘子優化的說明  

         由式子

                    
\frac{\partial W(\alpha_2)}{\partial \alpha_2} = -s + 1 + s K_{11} \gamma - K_{11} \alpha_2 - K_{22}\alpha_2 -s\gamma K_{12}+ 2K_{12}\alpha_2 + y_2v_1 - y_2 v_2

        可知:

                   
\frac{\partial W^2(\alpha_2)}{\partial \alpha_2^2} =  - K_{11}  - K_{22}+ 2K_{12}=-\eta

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

1、\alpha_2^{new,clipped}=L 時:

                         \alpha_1^{new}= \alpha_1^{old}+s(\alpha_2^{old}-L)

2、\alpha_2^{new,clipped}=H 時:

                         \alpha_1^{new}= \alpha_1^{old}+s(\alpha_2^{old}-H)

                       

 

3、                   
W(\alpha_1,\alpha_2) =\sum_{i=1}^n \alpha_i - \frac12 \sum_{i=1}^n \sum_{j=1}^n y_i y_j K(x_i, x_j) \alpha_i \alpha_j \\

                                             =\alpha_1+\alpha_2-\frac12 K_{11} \alpha_1^2 - \frac12 K_{22} \alpha_2^2 - y_1 y_2 K_{12} \alpha_1 \alpha_2  - y_1 \alpha_1 v_1 - y_2 \alpha_2 v_2 + \text{constant} \

                                             =\alpha_1(1-y_1v_1)+\alpha_2(1-y_2v_2)-\frac12 K_{11} \alpha_1^2 - \frac12 K_{22} \alpha_2^2 - y_1 y_2 K_{12} \alpha_1 \alpha_2 + \text{constant} \

                                             =\alpha_1(1-y_1v_1)+\alpha_2(1-y_2v_2)-\frac12 K_{11} \alpha_1^2 - \frac12 K_{22} \alpha_2^2 - y_1 y_2 K_{12} \alpha_1 \alpha_2 + \text{constant} \
                                     

                                             =\alpha_1y_1(y_1-(f(x_1)-\alpha_1y_1K_{11}-\alpha_2y_2K_{12}-b))+\alpha_2y_2(y_2-(f(x_2)-\alpha_1y_1K_{12}-\alpha_2y_2K_{22}-b))

                                                

                                             =\alpha_1^{new}(y_1(b-E_1)+\alpha_1^{old}K_{11}+s\alpha_2^{old}K_{12})+ \alpha_2^{new,clipped}(y_2(b-E_2)+\alpha_2^{old}K_{22}+s\alpha_1^{old}K_{12})

                                                

 

分別將乘子帶入得到兩種情況下的目標函數值: W_LW_H。顯然,哪種情況下目標函數值最大,則乘子就往哪兒移動,如果目標函數的差在某個指定精度范圍內,說明優化沒有進展。

        另外發現,每一步迭代都需要計算輸出u進而得到E,於是還要更新閾值b,使得新的乘子\alpha_1\alpha_2滿足KKT條件,考慮\alpha_1\alpha_2至少有一個在界內,則需要滿足0 \leq \alpha_i \leq C \Leftrightarrow y_iu_i = 1,於是b的迭代可以這樣得到:

1、\alpha_1 ^{new}在界內,則:

                        y_1u_1^{new}=1 \Rightarrow y_1(\alpha_1^{new}y_1K_{11}+\alpha_2^{new,clipped}y_2K_{21}+\sum \limit_{i=3}^{n}(\alpha_iy_iK_{i1})+b^{new})=1

又因為:    

                        E_1=\alpha_1^{old}y_1K_{11}+\alpha_2^{old}y_2K_{21}+\sum \limit_{i=3}^{n}(\alpha_iy_iK_{i1})+b^{old}-y_1\Rightarrow \sum \limit_{i=3}^{n}(\alpha_iy_iK_{i1})=E_1-\alpha_1^{old}y_1K_{11}-\alpha_2^{old}y_2K_{21}-b^{old}+y_1

於是有:

                         y_1(\alpha_1^{new}y_1K_{11}+\alpha_2^{new,clipped}y_2K_{21}+\sum \limit_{i=3}^{n}(\alpha_iy_iK_{i1})+b^{new})

                         =y_1(\alpha_1^{new}y_1K_{11}+\alpha_2^{new,clipped}y_2K_{21}+E_1-\alpha_1^{old}y_1K_{11}-\alpha_2^{old}y_2K_{21}-b^{old}+y_1+b^{new})= 1

等式兩邊同乘y_1后移項得:

                         b^{new}=-\alpha_1^{new}y_1K_{11}-\alpha_2^{new,clipped}y_2K_{21}-E_1+\alpha_1^{old}y_1K_{11}+\alpha_2^{old}y_2K_{21}+b^{old}

                                =(\alpha_1^{old}-\alpha_1^{new})y_1K_{11}+(\alpha_2^{old}-\alpha_2^{new,clipped})y_2K_{21}-E_1+b^{old}

2、\alpha_2^{new,clipped}在界內,則:

                         b^{new} =(\alpha_1^{old}-\alpha_1^{new})y_1K_{12}+(\alpha_2^{old}-\alpha_2^{new,clipped})y_2K_{22}-E_2+b^{old}

3、\alpha_1 ^{new}\alpha_2^{new,clipped}都在界內,則:情況1和情況2的b值相等,任取一個;

4、\alpha_1 ^{new}\alpha_2^{new,clipped}都不在界內,則:b^{new}取值為情況1和情況2之間的任意值。

(8)、提高SMO的速度       

       從實現上來說,對於標准的SMO能提高速度的地方有:

       1、能用緩存的地方盡量用,例如,緩存核矩陣,減少重復計算,但是增加了空間復雜度;

       2、如果SVM的核為線性核時候,可直接更新w,畢竟每次計算w=\sum\limits_{i=1}^n y_i\alpha_ix_i 的代價較高,於是可以利用舊的乘子信息來更新w,具體如下:

w^{new}=w^{old}+(\alpha_1^{new}-\alpha_1^{old})y_1x_1
+(\alpha_2^{new}-\alpha_2^{old})y_2x_2
,應用到這個性質的例子可以參見SVM學習——Coordinate Desent Method。

       3、關注可以並行的點,用並行方法來改進,例如可以使用MPI,將樣本分為若干份,在查找|E_1-E_2|最大的乘子時可以現在各個節點先找到局部最大點,然后再從中找到全局最大點;又如停止條件是監視對偶間隙,那么可以考慮在每個節點上計算出局部可行間隙,最后在master節點上將局部可行間隙累加得到全局可行間隙。

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM