機器學習筆記(十)——這樣推導SMO算法才易理解

線性支持向量機

上一篇文章對支持向量機的間隔、對偶和KKT條件做了詳細推導,但前文的基礎是原始問題爲線性可分問題,所以對線性不可分訓練數據是不適用的,這時需要引入一個新定義:軟間隔。

假如訓練數據中有一些特異點,也就是分類會出錯的樣本點,將這些特異點除去後,剩下的大部分樣本點組成的集合是線性可分的,訓練數據線性可分時所對應的間隔也被稱爲硬間隔。

線性不可分也就意味着某些樣本點不能滿足函數間隔大於等於1的約束條件,即位於兩條虛線之間;可以對每個樣本點引入一個鬆弛變量ξi>=0\xi_i>=0,使函數間隔加上這個鬆弛變量後大於等於1;並且對於每個鬆弛變量ξi\xi_i都會支付一個代價ξi\xi_i,所以目標函數和約束條件會變成如下形式:

其中C稱爲懲罰參數,新的目標函數是想函數間隔儘量大,同時錯分的樣本點個數儘量小,而C就是調和二者的係數,對於線性不可分的優化問題就變成了凸二次優化問題(原始問題)。

訓練數據樣本線性不可分時的模型也就成爲線性支持向量機,線性支持向量機是包含線性可分支持向量機的,由於現實中的數據集往往是線性不可分的,所以線性支持向量機具有更廣的適用性。

將這個原始問題利用拉格朗日乘子法的對偶性轉化成對偶問題的形式如下:

這裏的推導過程與前文的原理類似,所以只簡要概述一下。首先依據目標函數與約束條件利用拉格朗日乘子法構造出拉格朗日函數,然後依次對三個變量求導,而對偶問題就是拉格朗日函數的極大的極小值問題,隨後即可得出上述對偶問題的形式。

SMO算法

原理概要

SMO算法是一種啓發式算法,基本思路爲:如果所有變量的解滿足此最優化問題的KKT條件,那麼就得到了最優解,因爲KKT條件是該最優化問題的充分必要條件。

否則,需要選擇兩個變量,並且固定其他變量,只針對這兩個變量構建一個最優化問題,這裏的兩個變量一個是違反KKT條件最嚴重的那一個,另一個則是由約束條件確定。這樣原問題就可以不斷劃分成若干個子問題,從而提高了整個算法的效率。

爲什麼選擇兩個變量而不是一個呢?因爲當時拉格朗日函數對b求導時得到了一個等式約束條件,如下:

假如我們只選擇一個變量,固定剩下變量,那麼這個變量的值也已經固定了。

最優解上下界

對於最優化問題原問題而言,可以利用其約束條件計算出λi\lambda_i的上下界。如果固定的變量爲λ1λ2\lambda_1、\lambda_2,在等式條件的約束下可以化成下面形式,其中k爲自己設定的一個常量:

由於λi\lambda_i的取值範圍總是在0至C之間,並且對應y1=±1y2=±1y_1=±1和y_2=±1共有4種組合方式,這裏歸結爲兩種分別爲y1=y2y1y2y_1=y_2和y_1≠y_2,所以可以通過兩個式子繪圖如下:

假設上述約束條件的初始可行解爲λ1oldλ2old\lambda_1^{old}、\lambda_2^{old},對應最優解爲λ1newλ2new\lambda_1^{new}、\lambda_2^{new}。因爲現在兩個變量所取最優值位於平行於對角線的兩個線段上,一個達到最優時,另一個也會隨之達到最優,所以可以將其轉化成單變量λ2\lambda_2的最優化問題。

由於λ2new\lambda_2^{new}總是滿足不等式約束,所以這個解的取值一定會位於一個範圍之中,這裏將其下界設爲L、上界設爲H,這個L和H就是λ2new\lambda_2^{new}所在線段端點的界。
y1y2y_1≠y_2時,λ2new\lambda_2^{new}的上下界如下:

y1=y2y_1=y_2時,λ2new\lambda_2^{new}的上下界如下:

目標函數轉化

在處理過約束條件後,下面需要對原始問題的目標函數做一些處理,因爲SMO算法的思路首先就是選擇兩個變量固定剩餘變量嘛,所以將目標函數“打開”,相應處理如下:

經合併處理後得:

其中K(i,j)是正定核的知識,下篇文章會提及,這裏只需要知道K(i,j)=K(j,i)即可,上述公式中元素合併時會利用這個性質。

因爲在約束條件中已經確定了只優化λ2\lambda_2,所以目標函數對λ2\lambda_2求導時只想留下下標爲2的λ\lambda,其餘的變量就需要利用常數或者λ2\lambda_2替換。
這裏需要引入一個新的概念:誤差EiE_i

當i=1,2時,誤差EiE_i爲分類決策函數g(x)g(x)的預測值與真實值yiy_i之差。

目標函數式子中的λ1\lambda_1可以利用λ2\lambda_2進行替換,如下式:

除此之外目標函數中還有下標在3以上的累加集合,這部分相當於一個常數並且也存在於g(xi)g(x_i)中,所以可推出下列等式:

對目標函數的元素替換並結果對λ2\lambda_2求導後得出下式:

進一步移項處理後:

最後將誤差EiviE_i、v_i和關於k的等式約束條件帶入上式可得:

其中η\eta稱作學習速率,但是這裏的λ2\lambda_2還未被上述求得的上下界約束條件修剪,所以這裏暫時利用一個新的值λnew,unc\lambda^{new,unc}代替λ2\lambda_2

經過上述約束的修剪,最優解就可以記爲λ2new\lambda_2^{new}了,具體如下:

將得出的λ2new\lambda_2^{new}代入等式即可得出λ1new\lambda_1^{new}的值爲:

變量選擇

上文提及了SMO算法在每個子問題中都會選擇兩個變量,“一個變量是違反KKT條件最嚴重的”,這句話的意思也就是最不滿足KKT條件的,下面介紹選擇變量的具體操作。

SMO將第一個變量的選擇稱爲外層循環,首先遍歷整個樣本集,選擇違反KKT條件最嚴重的的樣本點,將其對應變量作爲第一個變量。具體操作就是檢驗樣本點是否滿足KKT條件,如下:

前兩個條件可以利用前文提及的硬間隔所對應的KKT條件理解,先回顧一下:

由這兩個條件可以確定當λi=0\lambda_i=0時,樣本點一定是位於兩側虛線之外;當0<λi<C0<\lambda_i<C時,即樣本點是支持向量,位於虛線之上;而對於λi=C\lambda_i=C,表示樣本點位於鬆弛變量ξi\xi_i與分離超平面之間。

在檢驗過程中,外層循環首先遍歷所有支持向量點(滿足第二個條件),檢驗他們是否滿足KKT條件。如果這樣樣本點都滿足KKT條件,那麼將遍歷整個數據集的樣本點,檢驗他們是否滿足KKT條件。直到整個數據集中沒有違反KKT條件的點,然後退出。

SMO將第二個變量的選擇稱爲內循環,假設在外層循環中已經找到了第一個變量λ1\lambda_1,現在就要在內層循環中找到第二個變量λ2\lambda_2,而λ2\lambda_2選擇的標準是希望能使λ2\lambda_2有足夠大的變化,這樣的目的是讓目標函數迭代優化的函數值收斂速度更快。

通過上面公式推導,我們已知的是λ2\lambda_2是依賴於E1E2|E_1-E_2|的,那麼只要使λ2\lambda_2對應的E1E2|E_1-E_2|最大即可。由於λ1\lambda_1已確定,所以E1E_1也隨之確定。如果E1E_1是正值,那麼選擇最小的EiE_i作爲E2E_2;如果E1E_1是負值,那麼選擇最大的EiE_i作爲E2E_2;通常將所有的EiE_i存入至一個列表中,在列表中選擇最大的E1E2|E_1-E_2|

內層循環選擇λ2\lambda_2的順序與外層循環一致,先遍歷支持向量點,若沒有合適的λ2\lambda_2,則將遍歷整個數據集;若仍找不到合適的λ2\lambda_2,則放棄λ1\lambda_1,再通過外層循環尋找另外的λ1\lambda_1

計算閾值b

每完成對兩個變量的優化後,要對b的值進行更新,因爲b的值關係到g(xi)g(x_i)的計算,即關係到下次優化時EiE_i的計算。

0<λi<C0<\lambda_i<C時,根據已知的條件可以做以下推導:


並且我們已知EiE_i的公式,將其“打開”得:

可以利用關於EiE_i的等式替換b1newb_1^{new}中的前兩項,最後得出b1newb_1^{new},具體推導如下:
在這裏插入圖片描述
同理可推導出b2newb_2^{new}的公式如下:

λ1newλ2new\lambda_1^{new}、\lambda_2^{new}同時滿足條件0<λi<C0<\lambda_i<C,此時bnew=b1new=b2newb^{new}=b_1^{new}=b_2^{new}

而如果λ1newλ2new\lambda_1^{new}、\lambda_2^{new}是0或者C時,則b1newb2newb_1^{new}、b_2^{new}及其中間的數都符合KKT條件,所以選擇兩者的中間值作爲此時的bnewb^{new}

在每次完成對兩個變量的優化之後,必須要更新對應的EiE_i值,而更新EiE_i時要用到上述提及bnewb^{new},以及所有支持向量對應的λj\lambda_j,更新過程如下:

其中,s爲所有支持向量λj\lambda_j的集合。

總結

最後梳理一下文章內涉及的知識點和流程,首先由線性不可分問題引出了軟間隔的定義,並構建了新的目標函數和約束條件,並且利用拉格朗日乘子法將原問題轉化成對應的對偶問題。

然後在已知最優化問題後開始介紹了SMO算法,將約束條件轉化爲需要優化的變量λ2\lambda_2的上下界。在處理目標函數時,我們只想留下λ2\lambda_2這一個變量,所以需要替換元素,這裏引入了誤差EiE_i解決了這個問題,並且在得到最優解後利用上下界進行修剪。

接着介紹了最優化問題中兩個變量是如何選擇的,最後介紹了閾值b的推導方法,並且在閾值b的基礎上得出每次更新EiE_i的公式。

關注公衆號【奶糖貓】獲取每篇文章的源碼和數據,歡迎各位夥伴和博主交流呀。

在這裏插入圖片描述

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