支持向量機(四)——深入理解SMO優化算法

本文結合了《統計學習方法》,吳恩達中文筆記,以及一些博客文章https://www.cnblogs.com/pinard/p/6111471.html,http://www.cnblogs.com/vivounicorn/archive/2011/06/01/2067496.html,https://blog.csdn.net/Victor_Gun/article/details/45228071,並結合個人理解總結出了這篇詳細介紹SMO算法的文章。文章有詳細的數學推導過程,可以解決大多數疑惑的地方,希望能對大家有所幫助。
支持向量機的最後一節,用SMO優化算法解決對偶函數的最後優化問題,首先先介紹座標上升法

1.座標上升法

假設我們有一個要求解的優化問題:maxαW(α1,α2,...,αm) 這裏W是α 向量的函數。之前我們講過求最優解的兩種方法分別是梯度下降法和牛頓法,這裏是新的一種方法——座標上升法,其方法過程爲:

這裏寫圖片描述
最裏面的語句表示固定除αi 之外所有αjji ,這時W可以看做只是關於αi 的函數,那麼直接對αi 求導優化即可。我們用一張圖來說明一下這個算法:
這裏寫圖片描述
由於每次只固定一個參數所以求導後是一條直線,從圖中可以看出迭代的優化路徑總是沿着和座標軸平行的方向前進,每一步都前進一步,因爲每一步只優化一個變量。
座標上升法雖然比牛頓法有更多的迭代,但每次迭代的代價都很小。

2.SMO優化算法(Sequential minimal optimization)

SMO算法解決對偶函數的最後優化問題:

這裏寫圖片描述
要解決的是在參數α 上求最大值W的問題,C是我們預先設定的已知數。將上面的式子修改一下可以寫成:
這裏寫圖片描述

按照座標上升的思路,我們固定除α1 其中一個參數以外的所有參數,但是這樣有問題,因爲固定α1 之外所有參數,那麼α1 不再是變量,因爲α1 可以由其他固定的參數表示出來。
因此我們需要一次選擇兩個參數做優化,比如α1α2 ,此時α2 可以由α1 和其他參數表示出來,再帶回W中,W就是隻關於α1 的函數,可解。這樣,SMO的主要步驟爲:
這裏寫圖片描述
第一步中的啓發式方法之後介紹。第二步就是進行約束。SMO高效的原因就是固定其他參數後,對一個參數優化過程很高效。有一點要注意的是,這裏的收斂條件是什麼呢?其實就是滿足KKT條件。那麼怎樣在滿足所有約束條件的情況下能相對於αi,αj取得W最優呢?假設我們選取的參數是α1,α2,那麼有:
這裏寫圖片描述
所以能得到:
這裏寫圖片描述

接下來將W(α) 改寫一下:
這裏寫圖片描述
對比原式W(α) ,展開爲W(α2)=Aα22+Bα2+C 那麼我們可以對W求導求得α2 相應的值爲α2new,unclipped (unclipped的意思是說不用考慮約束條件)。然後再更新我們得到剪輯後的α2的更新式子爲:
這裏寫圖片描述
得到α2new 後,也就可以求出α1new 了。


以下是推導過程,首先推導出未考慮約束條件的α2new,unclipped 。爲了敘述方便我們記:

這裏寫圖片描述
Ei爲函數g(xi)對輸入xi的預測值與真實輸出yi之間的差。
引入記號變量
vi=j=3NαjyjK(xi,xj)=g(xi)j=12αjyjK(xi,xj)b,i=1,2

目標函數可寫成
W(α1,α2)=12K11α12+12K22α22+y1y2K12α1α2(α1+α2)+y1viα1+y2viα2

根據α1y1=ζα2y2 以及yi2=1 ,將兩遍同乘一個yi ,則可將α1 表示爲:
α1=(ζα2y2)y1

α1 帶入到目標函數中,則目標函數變爲只含α2的函數:
這裏寫圖片描述
α1oldy1+α2oldy2=ζη=K11+K222K12 代入,就可以得到:
α2new,unc=α2old+y2(E1E2)η

接下來我們關注一下問題的約束條件:
這裏寫圖片描述
我們用圖片表示一下,當y1與y2異號的時候:
這裏寫圖片描述
同號的時候
這裏寫圖片描述
可以看到α1,α2 兩個乘子既要位於邊長爲C的盒子裏又要在相應直線上,於是對於α2 的界來說,有如下情況:
這裏寫圖片描述
我們實際來計算其中的一個,選定同號的計算x1old+x2old=x1new+x2new=ζ ,當x1new 處於邊界時,即x1new=0 時,x2new=x1old+x2old ,當x1new=C 時,x2new=x1old+x2oldx1new=x1old+x2oldC ,結合x2new 給定的限制,就得到了L和H的範圍,當y1,y2異號時也類似計算。
這裏寫圖片描述
代入(ζα2y2)y1 可求得α1new 值爲:α1new=α1old+y1y2(α2oldα1old)


選擇的兩個變量得到最優化的解α1newα2new 後,我們要根據最優化的解求出對應的滿足KKT條件的b值,因爲KKT條件就是我們收斂的條件。所以我們繼續推導出閾值b的更新:


推導b——首先來看一下KKT條件:

這裏寫圖片描述
0<α1new<C ,由以上KKT條件可知:
y1i=1NαiyiKi1b=0

於是有:
b1new=y1i=3NαiyiKi1α1newy1K11α2newy2K21

由之前E1 定義是得:
E1=i=3NαiyiKi1+α1oldy1K11+α2oldy2K21+boldy1
可以看到上兩式都有y1i=3NαiyiKi1 ,因此可以將b1newE1 表示爲:
b1new=E1yiK11(α1newα1old)y2K21(α2newα2old)+bold
同樣,如果0<α2new<C
b2new=E2yiK12(α1newα1old)y2K22(α2newα2old)+bold
如果α1newα2new 都滿足條件0<αinew<C ,i=1,2,那麼b1new=b2new ,如果αi 等於0或者C,那麼b1newb2new 以及它們之間的數都符合KKT條件的閾值,這時選擇它們的中點作爲bnew
每次完成優化後,還需要更新EiEi 更新要用到bnew ,以及所有支持向量對應的αj
Ei=SyjαjK(xi,xj)+bnewyi

其中,S是所有支持向量xj 的集合。

3.SMO中拉格朗日乘子的啓發式選擇方法

SMO算法在每個子問題中選擇兩個變量優化,其中至少一個變量是違反KKT條件的

3.1 第一個變量的選擇

SMO算法稱選擇第一個變量爲外層循環,這個變量需要選擇在訓練集中違反KKT條件最嚴重的樣本點。選擇方法爲
1.優先選擇樣本前面係數0<αi<Cαi 作優化(稱爲無界樣例),判斷它們是否滿足KKT條件。
2.如果這些樣本點都滿足KKT條件,那麼遍歷整個訓練集,檢驗它們是否都滿足KKT條件。
3.遍歷完子集後,重新開始1,2,直到在執行1和2時沒有任何修改就結束
遍歷方法不止這一種,其他版本的例如Platt論文中的是指出先遍歷整個樣本,再遍歷無界樣本的算法。


那麼大家最關心的的問題來了:爲什麼要選擇違反KKT條件最嚴重的點進行優化呢?其次,優化後是否就能保證樣本滿足KKT條件?
這裏需要引進一個概念——監視可行間隙
它是原始目標函數值和對偶目標函數值的間隙,對於凸二次優化來說這個間隙是零,]則原始目標函數O(w,b) 與對偶目標函數W(α) 的都是求極小值,它們的差爲:

這裏寫圖片描述
在這篇文章http://www.cnblogs.com/vivounicorn/archive/2011/06/01/2067496.html中推導了當選擇違背KKT條件的樣本時,可行間隙變大,結合Osuna定理我們只需要選取的αiαj 中有一個不滿足KKT條件,目標函數就會在迭代後值會減小(我們要求最大值),因此我們要對違反KKT條件的樣本點就行優化,最後可以選擇參數b使優化的參數滿足KKT條件。


3.2 第二個變量的選擇

首先我們來看之前得到的一個公式:

α2new=α2old+y2(E1E2)η

SMO算法稱選擇第二個變量爲內層循環,假設我們在外層循環已經找到了α1 , 則第二個變量α2 的選擇標準是讓|E1−E2|有足夠大的變化。因爲α1 已定,那麼E1 也確定了,所以要想|E1−E2|最大,只需要在E1 爲正時,選擇最小的Ei 作爲E2 , 在E1 爲負時,選擇最大的Ei 作爲E2 ,可以將所有的Ei 保存下來加快迭代。
確定第二個乘子方法:
1、首先在無界乘子中尋找使得|E_1-E_2|最大的樣本;
2、如果1中沒找到則從隨機位置查找無界乘子樣本;
3、如果2中也沒找到,則從隨機位置查找整個樣本(包含界上和無界乘子)。

最後的收斂條件是在界內(0<αi<C )的樣例都能夠遵循KKT條件,且其對應的αi 只在極小的範圍內變動。

4.SMO算法總結(統計學習方法中的算法)

SMO算法將原問題不斷分解爲子問題並對子問題求解,進而達到求解原問題的目的。
假設輸入是m個樣本(x1,y1),(x2,y2),...,(xm,ym) ,其中x爲n維特徵向量。y爲二元輸出,值爲1,或者-1.精度e。
輸出是近似解α
1)取初值α0=0,k=0
2)按照3.1節的方法選擇α1k ,接着按照3.2節的方法選擇α2k ,求出新的

α2new,unc=α2k+y2(E1E2)η

3)根據約束條件求出剪輯後的α2k+1α1k+1 ,更新ααk+1
4)計算bk+1Ei
5)在精度e範圍內檢查是否滿足如下的終止條件:
i=1Nαiyi=0
0αiC,i=1,2...m
αik+1=0yig(xi)1
0<αik+1<Cyig(xi)=1
αik+1=Cyig(xi)1

6)如果滿足則結束,返回αk+1 ,否則轉到步驟2。

5.總結

文章內容範圍比較大,完成比較倉促,在公式書寫上可能存在問題,希望大家能批評指正,我會及時修改過來,謝謝大家。


7.14 一更:對編程代碼中的一部分理解

            if (L == H),
                 % continue to next i. 
                   continue;
            end
            eta = 2 * K(i,j) - K(i,i) - K(j,j);
            if (eta >= 0),
                 % continue to next i. 
                   continue;
            end
            if (abs(alphas(j) - alpha_j_old) < tol),
                % continue to next i. 
                % replace anyway
                alphas(j) = alpha_j_old;
                continue;
            end

其實這三段代碼含義有類似之處,我們知道所選的兩個參數第一個參數是判斷不滿足KKT條件,這裏要求的a2目的是爲了|E2-E1|最大,如果a2沒有明顯的優化的話
或者a2就是常量的話,則並不需要求最優解,迭代後值不變,只需要帶到目標函數中計算最後的值。
這裏第一段L=H,說明a2是定值,即並不需要優化就是最優值。第二段η 是alpha(j)的最優修改量,η 大於等於0的情況說明,說明η 極小值在邊界上取,對應的a2也是定值,不需要優化。第三段發現優化後的a2與原值基本沒有變化,相當於沒有優化。因此都直接跳入到下一個循環中。最後的b要滿足帶入所有的樣本中都滿足KKT條件。
但是代碼中爲什麼不繼續計算更新後的b,而是直接跳到下一個循環中(繼續b的式子在這3個判斷之後),畢竟每次更新計算都要用到b,希望大神指點一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章