一、回顧
上節,我們介紹到了SMO的總體過程,本節對SMO的三個難點結合代碼進行詳細分析。
二、SMO算法
(1)設置拉格朗日乘子α=(α[1]...α[i]...α[l])的初始值(一般設爲全0),並設置迭代次數計數器k=1。
(2)如果α向量已經收斂(符合KKT達到停止條件),停止循環,返回結果;否則,找出工作集B=(i,j),實際上就是找出所要更新的兩個α(α[i],α[j])的下標,另外定義剩下的α的下標標號爲N,即N=(1,2...l)\B(\表示去掉B中元素),並定義B所對應的α爲,N所對對應的α爲。
(3)若,解決如下問題:
否則,解決下面問題:
實際上都是關於α的更新方式,至於如何解決這兩個問題以及α的詳細計算公式會在後面介紹。
4)用新的α[i],α[j]替換原來的α[i],α[j],迭代計數器k=k+1,跳到第二步,繼續循環。
三、KKT條件
在上一篇博客說過,上述SMO算法存在三個難點:
(1)如何判斷α收斂,即如何停止循環,達到KKT條件。
(2)如何找出工作集B=(i,j),即如何選出兩個要更新的α=(α[i],α[j]);
(3)如何更新工作集中的α,即如何更新α[i],α[j]。
下面我們來看如何解決第一個問題。
那麼什麼是KKT條件呢?
假設我們要解決的是含有等式和不等式約束的最優化問題:
其中,p爲等式約束條件的數量,q爲不等式約束條件的數量。
f(x)在達到最優值(最小值)時必須滿足KKT條件,即:
這就是所謂的KKT條件,也就是等式的拉格朗日乘子λ不能爲0,不等式(必須是小於號)的拉格朗日乘子μ必須大於0且與不等式g(x)的乘積等於0,同時拉格朗日函數對未知數α的導數等於0(上述2式)。
下面,我們看支持向量機的優化問題:
上述優化問題經過整理可得:
包含兩個不等式集合(分別爲l個)和一個等式約束集合(l個)。
該優化問題的拉格朗日函數如下:
即:
其中,。
當<C時,C-α>0,ξ(C-α)=0,那麼ξ=0,又因爲λ>=0,所以由14式得:>=0
同理,可得當>0,因爲λα=0,所以λ=0,因爲ξ>=0,所以由14式得: <=0。
綜上所知,得:
因爲,y取+1或者-1,將15式左右乘以yi,又可以分兩種情況,比如>C時,如果=+1,那麼=+b>=0;當=-1時,兩面乘以,得-=--b>=0,即+b<=0,同理可分析當>0和=+1和-1的情況,最後可得一個關於b的不等式:
實際上,上式就是15式對=+1和-1兩種情況的討論結果。這意味着,滿足KKT條件就得滿足上式,也就是:
當然,在現實中,我們不這麼嚴密,常採取以下的條件,即:
ε被稱爲容忍因子。
所以,當我們檢測17式就可以當作SMO循環結束的條件,LIBSVM中也是這麼做的。
四、工作集的選擇
在第三節中,我們討論了SMO的一個難點就是SMO循環結束的停止條件,接下來我們討論如何選取工作集B=(i,j),也就是如何選取所要更新的和。至於原理性的內容,論文Working Set Selection Using Second Order Information for Training Support Vector Machines(http://www.csie.ntu.edu.tw/~cjlin/papers/quadworkset.pdf)進行了詳細介紹,挺難理解的,本人目前也未理解,後續可能對原理性繼續進行闡述。本文主要對選擇過程進行描述。
工作集B=(i,j)的選擇過程如下:
(1)計算和
(2)若>0,則=,否則=,是自行設置的一個很小的正數。即:
(3)接下來選擇i和j,通過選擇最大離散對。首先選擇i,
通過計算,找出集合中使得最大的那個t(t屬於),將其值賦給i。
找出i後,根據i值尋找j:
上式的意思是在一個集合中計算值,找出使該值最小的t,賦給j,這個t屬於的集合滿足兩個條件:首先t屬於集合,同時,還得滿足,這裏的i爲第一步中選出的i。
過程稍微比較繞,但是理解了後就是兩步,第一步找出i,然後根據i找出j。
(4)將i和j返回。
五、和的更新
在第四節中我們找出了α的標號i和j,也就是工作集i和j,那麼接下來就是更新和。
在開頭我們介紹的SMO算法流程中,介紹了α的更新要根據是否大於0來解決兩個問題,這兩個問題的詳細解決過程在論文LIBSVM: A Library for Support Vector Machines(http://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.pdf)進行了介紹,本文只講述結果。
經過論文中的轉換和計算,最終和的計算公式如下:
其中,和爲舊值,和爲所對應的樣本標籤值,時,,時,。
因爲和可能同號也可能異號,所以42式又可以分爲兩種情況,這裏我們拿異號討論一下,同號可類似。
當和異號時:
將帶入42式得:
同時,因爲和還有0<=α<=C的限制。假設,我們將對應的懲罰因子記爲,對應的懲罰因子記爲(上篇博文中我們說過,爲了應對不平衡數據,不同符合的α可能採取不同的懲罰因子C),那麼綜合考慮,α的更新如下:
這個圖將α的更新的各種限制分爲4個區域。因爲(因爲SMO更新兩個α,其它不變,所有的α滿足y1α1+y2α2+...ylαl=常數,即yiαi+yjαj=常數,帶入y就可得,減號是因爲yi和yj異號),我們拿region I當作例子分析一下:
超過了界限,所以取最大值,由於,所以綜上所知,可得:
同樣,當處於region II等其它區域時,可類似分析。
這樣,α得更新就介紹完畢了,完整僞代碼如下:
if (y[i] != y[j])
{
double quad_coef = Q_i[i] + Q_j[j] + 2 * Q_i[j];
if (quad_coef <= 0)quad_coef = TAU;
double delta = (-G[i] - G[j]) / quad_coef;
double diff = alpha[i] - alpha[j];
alpha[i] += delta;
alpha[j] += delta;
if (diff > 0)
{
if (alpha[j] < 0) // in region III
{
alpha[j] = 0;
alpha[i] = diff;
}
}
else
{
if (alpha[i] < 0) // in region IV
{
alpha[i] = 0;
alpha[j] = -diff;
}
}
if (diff > C_i - C_j)
{
if (alpha[i] > C_i) // in region I
{
alpha[i] = C_i;
alpha[j] = C_i - diff;
}
}
else
{
if (alpha[j] > C_j) // in region II
{
alpha[j] = C_j;
alpha[i] = C_j + diff;
}
}
}
If yi = yj, the derivation is the same.
六、總結
本文詳細介紹了LIBSVM中SMO算法最重要得三個難點,結合代碼的分析將在以後進行介紹。