前面咱們針對Hard Margin SVM推導了他的原問題:
ωmin2∣∣ω∣∣2
s.t.
y(i)(ωTx(i)+b)⩾1i=1,2,...m
對應的對偶問題:
αmin21i=1∑mj=1∑mαiαjyiyjx(i)⋅x(j)−i=1∑mαi
s.t.
αi⩾0i=1,2,...,m
i=1∑mαiyi=0html
以及決策邊界中未知量w的計算方法:
w=i=1∑mαiy(i)x(i)python
那決策邊界中的未知量b如何計算呢?就要用了KKT條件,同時用於求解對偶問題的SMO算法也要應用到KKT條件,因此這一次的內容從KKT條件開始。web
3-1 KKT條件
咱們說廣義拉格朗日乘子函數的構造是從本來只能解決帶等式約束的拉格朗日乘數法推廣而來,因此咱們先從最原始的拉格朗日乘數法的求解開始過程開始。算法
3-1-1 從拉格朗日乘數法的求解過程提及
拉格朗日乘數法是求解帶有等式約束的最優化問題app
xminf(x)
hi(x)=0,i=1,2,...,psvg
對應的求解方法就是構造拉格朗日乘子函數
L(x,λ)=f(x)+i=1∑pλihi(x)函數
接着對原始的優化變量以及乘子變量求導,並令導數爲0,即:
⎩⎨⎧∇xf+i=1∑pλi∇xhi(x)=0hi(x)=0,i=1,2,...,p優化
解這個方程組就能夠找到極值點,但目前只是把疑似極值點求出來了,至因而不是極值點,是極大仍是極小點,還須要進一步斷定。spa
因此上面的方程組只是取得極值的必要條件,而不是充分條件。orm
3-1-2 推廣出KKT條件
針對既帶有等式約束和不等式約束的優化問題,咱們能夠構造廣義拉格朗日函數
xminf(x)
gi(x)⩽0,i=1,2,...q
hi(x)=0,i=1,2,...p
構造拉格朗日乘子函數
L(x,λ,μ)=f(x)+i=1∑pλihi(x)+j=1∑qμjgj(x)
設極值點爲
x∗
在極值點出必需要知足:
|
|
1.原問題的約束條件 |
gi(x∗)⩽0,i=1,2,...q
hi(x∗)=0,i=1,2,...p |
2.對偶問題的約束條件 |
μi⩾0,i=1,2,...q |
3.鬆弛互補條件 |
μigi(x∗)=0,i=1,2,...q |
4.X同時是拉格朗日函數的極小點
∇xL(x∗,λ,μ)=0 |
∇xf(x∗)+i=1∑pλi∇xhi(x∗)+j=1∑qμj∇xgj(x∗)=0 |
再次詳細說明下其中的鬆弛互補條件:
根據
μigi(x∗)=0,i=1,2,...q
咱們會發現
當
μ>0時,
gi(x∗)=0。說明極值點在邊界處取得。
當
μ=0時,
gi(x∗)⩽0。說明這個不等式約束對函數沒有影響。
以上四條就是KKT條件,它是對原問題最優解的約束,是最優解的必要條件。
可是若是原問題和對偶問題存在強對偶問題,則KKT條件就是取得極值的充要條件。
而咱們的支持向量機的原問題不論是線性可分的仍是不可分,即便加上後面的核函數,都是強對偶問題。使得咱們可使用KKT條件,獲得極值點的一些特徵。
3-1-3 KKT條件用於原問題
原問題:
ωmin2∣∣ω∣∣2
s.t.
y(i)(ωTx(i)+b)⩾1i=1,2,...m
根據KKT條件中的鬆弛互補條件(對於不等式約束,乘子變量*函數值=0)
αi(yi(wTx(i)+b)−1)=0,i=1,2,...m
咱們仔細分析下鬆弛互補條件:
當
αi>0時,
yi(wTx(i)+b)=1 —>支撐向量
當
αi=0時,
yi(wTx(i)+b)⩾1—>自由變量,對分類超平面不起做用
3-1-4 KKT條件的做用:
- SMO算法選擇優化變量
SMO算法是用於求解以後對偶問題的算法,它是一個迭代算法,每次僅選取兩個乘子變量進行優化。KKT條件能夠幫助咱們尋找出須要優化的乘子變量。
- 迭代終止的斷定規則
由於對於支持向量機來講KKT條件是極值點的充分必要條件,因此若是在迭代過程當中發現待求點已經知足KKT條件了,那咱們就把極值點解出來了,無須繼續迭代。
3-1-5 決策邊界中b的計算:
咱們經過將原問題轉化爲拉格朗日對偶問題,使得最優化的變量從本來的w,b轉換爲拉格朗日乘子變量
α
若是咱們能夠求得使得對偶問題最優的
α後。則決策邊界中的w能夠經過
w=i=1∑mαiyix(i)求得
而決策邊界中b經過鬆弛互補條件求得。
前面說到,對於最優勢來講,當
αi>0時,
yi(wTx(i)+b)=1。
因此咱們只須要到
αi>0對應的樣本,求得b。
理論上來講,任意符合
αi>0的樣本,均可以用來計算b的值,但因爲計算有偏差,通常爲了減少偏差,會用全部知足
αi>0的樣本計算b,再取均值。
3-2 SMO算法
3-2-1 咱們如今面臨的棘手問題
前面講到了對偶問題,讓咱們再看下推導獲得的對偶問題
αmin21i=1∑mj=1∑mαiαjyiyjx(i)⋅x(j)−i=1∑mαi
s.t.
αi⩾0i=1,2,...,m
i=1∑mαiyi=0
爲了方便以後進一步的推導,咱們將對偶問題寫成向量化的形式
αmin21αTQα−eTα
s.t.
yTα=0
αi⩾0,i=1,2,...,m
其中
矩陣
Qij=yiyjx(i)⋅x(j)
向量
eT=[1,1,...,1]
關於從
j=1∑mαiαjyiyjx(i)⋅x(j)到
αTQα
應用了二次型展開。
這部分我不是熟悉,只依稀記得一個例子
x2+y2+z2=[xyz]⎣⎡100010001⎦⎤⎣⎡xyz⎦⎤
中間的矩陣對應的是本來的係數,因此Q本質上就是
αiαj的係數矩陣
這是一個大規模的二次函數的最優化問題,因爲自己是凸優化問題,因此一些經典的最優化算法(如牛頓法,梯度降低法)能夠收斂到極值點處。
但棘手的是還存在着等式約束和不等式約束,因此須要更好的求解算法,那就是SMO算法(序列最小最優化算法)
從SVM提出,到SMO算法提出以前,SVM並無普遍使用就是由於這個對偶問題的求解很是麻煩。
3-2-2 破解對偶問題的神器SMO算法
SMO算法(Sequential minimal optimization)序列最小最優算法的核心思想是分治法(把一個大問題拆解成不少子問題來求解,而後把解合併起來,造成大問題的解)
SMO算法的巧妙之處在於每次選取兩個變量進行優化。爲何不僅選出一個變量進行優化呢?
由於咱們有一個等式約束
i=1∑mαiyi=0,若是隻有一個
α變化的話,就會破壞原來的等式約束。
所以只調整一個變量是不行的,最少要調整2個變量。
根據這個想法,就能夠把原來的m元2次問題轉化成2元2次問題。
而對於2元2次函數的極值問題的求解就是初中內容了,能夠經過等式約束,消掉一個變量,變成一元二次函數求極值的問題。
一元二次函數就是一個拋物線,但由於有
α⩾0的限定條件,因此咱們須要根據這個狀況來進行極值的討論。
3-2-3 SMO算法的理論推導
3-2-3-1 定義一些變量
以後原來代換的變量也寫在這邊,方便查看
|
|
定義矩陣Q |
Qij=yiyjXiTXj |
定義
ui |
ui=j=1∑myjαjXj⋅Xi+b
ui至關於把第i個樣本帶到咱們的預測函數中 |
|
|
定義
Kij |
Kij=XiTXj |
定義s |
s=y1y2 |
定義
vi |
vi=k=1,k≠i,k≠j∑mykαkKik |
定義
ξ |
ξ=yiαi+yjαj=−k=1,k≠i,k≠j∑mykαk |
|
|
定義
w |
w=ξyi |
|
|
定義
η |
η=Kii+Kjj−2Kij |
定義
Ei |
Ei=ui−yi |
3-2-3-2 KKT條件的做用
再回憶KKT條件:
{αi>0αi=0yi(wTx(i)+b)=1yi(wTx(i)+b)⩾1
以前講到,KKT條件用於選擇優化變量,斷定迭代是否終止
-
選擇優化變量:
KKT條件幫助咱們選擇每次哪兩個變量來優化,怎麼挑呢?只要這個變量違反KKT條件,咱們就把它挑出來。
因此若是不知足kkt條件,就必定不是極值點,因此咱們要把它挑出來,調整
α使得知足KKT條件
-
斷定迭代的依據:
若是alphai都知足,說明找到了極值點。
因此大致上SMO算法的流程圖爲:
根據SMO算法的流程圖,能夠看出咱們須要解決的幾個小問題,分別是如何初始化,如何選出優化變量,如何優化選出的變量。先就其中最繁瑣的如何優化選出的變量提及。
3-2-3-3 子問題的推導->如何優化選出的變量
3-2-3-3-1 轉化爲二元二次函數問題
假如咱們已經經過KKT條件,從m個
α中已經選出了須要優化的2個變量
αi,αj
這時對於對偶問題
f(α)=21i=1∑mj=1∑mαiαjyiyjx(i)⋅x(j)−i=1∑mαi來講,只有
αi和
αj是變量,其餘的都是常量,這時咱們的目標函數就轉化成了二元二次函數,再根據等式約束,能夠進一步轉化爲一元二次求極值的問題。
咱們將上式整理下,寫成
係數αi2+係數αj2+係數αiαj+係數αi+係數αj+係數這樣的形式
g(αi,αj)=21Kiiαi2+21Kjjαj2+sKijαiαj+yiviαi+yjvjαj−αi−αj
其中
s=y1y2
vi=k=1,k≠i,k≠j∑mykαkKik
約束條件爲
αi⩾0
αj⩾0
k=1∑mykαk=0由此能夠推出
yiαi+yjαj=−k=1,k≠i,k≠j∑mykαk=ξ
接下來的目標就是計算
f(αi,αj)的極值
3-2-3-3-2 肯定
αj的可行域
由於
yiαi+yjαj=−k=1,k≠i,k≠j∑mykαk=ξ
因此
αi+yiyjαj=yiξ
因爲
yiyj的正負號不知,因此一共對應四種情形,同時咱們還能夠嘗試肯定下
ξ的正負
序號 |
yi |
yj |
αi+yiyjαj=yiξ |
ξ |
1 |
+ |
+ |
αi+αj=ξ |
+ |
2 |
- |
- |
αi+αj=−ξ |
- |
3 |
+ |
- |
αi−αj=ξ |
不知 |
4 |
- |
+ |
αi−αj=−ξ |
不知 |
對應這四種狀況,咱們能夠經過圖像,分別肯定出
αj的取值範圍
序號 |
yi |
yj |
αi+yiyjαj=yiξ |
ξ |
|
1 |
+ |
+ |
αi+αj=ξ |
+ |
Low boundary =
0 High boundary=
αi+αj |
2 |
- |
- |
αi+αj=−ξ |
- |
Low boundary =
0 High boundary=
αi+αj |
3 |
+ |
- |
αi−αj=ξ |
不知 |
Low boundary =
max{0,αi−αj} High boundary=
+∞ |
4 |
- |
+ |
αi−αj=−ξ |
不知 |
Low boundary =
max{0,αi−αj} High boundary=
+∞ |
最終總結下
αj的取值範圍
{αj∈[0,αi+αj]αj∈[max{0,αi−αj},+∞)yiyj=1yiyj=−1
3-2-3-3-2 肯定
αj的值
因爲
αi與
αj存在等式關係,即
yiαi+yjαj=ξ,
左右同時乘以
yi得
αi+yiyjαj=ξyi,即
αi+sαj=ξyi
令
w=ξyi
故
αi=w−sαj
因此咱們將上式帶入
g(αi,αj)=21Kiiαi2+21Kjjαj2+sKijαiαj+yiviαi+yjvjαj−αi−αj
就能夠獲得關於
αj的一元二次函數,接下來就是這個帶入過程。
g(αj)=21Kii(w−sαj)2+21Kjjαj2+sKij(w−sαj)αj+yivi(w−sαj)+yjvjαj−(w−sαj)−αj
咱們能夠經過對
g(αj)求導=0,獲得極值點的位置
g′(αj)=Kii(w−sαj)(−s)+Kjjαj+sKijw−2s2Kijαj−syivi+yjvj+s−1=0
在整理過程當中,咱們使用一個小技巧
syivi=yiyjyivi=yjvi
帶入目標函數中獲得
(Kii+Kjj−2Kij)αj=sw(Kii−Kij)+yjvi−yjvj−s+1
等號的右邊能夠進一步簡化成和左邊類似的結構。
用到一些小技巧好比
sw=yiyjyiξ=yjξ
其中
ξ=αi∗yi+αj∗yj
αi∗和
αj∗表示未迭代的值
因此
sw=yj(αi∗yi+αj∗yj)
將
sw=yj(αi∗yi+αj∗yj)帶入右式,同時讓
s=yiyj,
1=yjyj
sw(Kii−Kij)+yjvi−yjvj−s+1=yj(αi∗yi+αj∗yj)(Kii−Kij)+yjvi−yjvj−yiyj+yjyj=yiyjαi∗Kii+αj∗Kii−yiyjαi∗Kij−αj∗Kij+yj(vi−vj+yj−yi)
接下來的化簡要將
vi用
ui表示
回憶
vi=k=1,k≠i,k≠j∑mykαkKik=Xi⋅k=1,k≠i,k≠j∑mykαkXk
ui=j=1∑myjαjKij+b=Xi⋅j=1∑myjαjXj+b=vi+yiαi∗XiXi+yjαj∗XjXi+b
也就是說
vi−vj=ui−uj+yjαjXjXj+yiαiXiXj−yiαiXiXi−yjαjXjXi
=ui−uj+yjαj∗Kjj+yiαi∗Kij−yiαi∗Kii−yjαj∗Kij
因此等號右邊能夠繼續化簡
=yiyjαi∗Kii+αj∗Kii−yiyjαi∗Kij−αj∗Kij+yj(vi−vj+yj−yi)
=yiyjαi∗Kii+αj∗Kii−yiyjαi∗Kij−αj∗Kij+yj(ui−uj+yjαj∗Kjj+yiαi∗Kij−yiαi∗Kii−yjαj∗Kij+yj−yi)
=yiyjαi∗Kii+αj∗Kii−yiyjαi∗Kij−αj∗Kij+αj∗Kjj+sαi∗Kij−sαi∗Kii−αj∗Kij+yj((ui−uj)−(yi−yj))
=αj∗(Kii+Kjj−2Kij)+yj((ui−uj)−(yi−yj))
這時,等號的左右邊都有
(Kii+Kjj−2Kij),對於取得極值點的
αj能夠進一步化簡
設
η=Kii+Kjj−2Kij
Ei=ui−yi
ηαj=αj∗η+yj(Ei−Ej)
因此
αj=αj∗+ηyj(Ei−Ej)
這是在無約束時,使得
g(αi,αj)最小的點,咱們令其爲
αjbest但因爲
αj還存在不等式約束
{αj∈[0,αi+αj]αj∈[max{0,αi−αj},+∞)yiyj=1yiyj=−1
因此再根據約束,進一步考慮最終迭代後
αi的值
對應的一共有三種狀況
最終迭代後
αjnew的值爲
αjnew=⎩⎪⎪⎨⎪⎪⎧LαjbestHif αjbest<Lif L⩽αjbest⩽Hif αjbest>H
3-2-3-3-3 肯定
αi的值
由於
αinewyi+αjnewyj=αi∗yi+αj∗yj
因此迭代後
αinew=αi∗+s(αj∗−αjnew)
3-2-3-3-4 更新b
若是
α1>0
則
k=1∑mykαkXkX1+b1new=y1
即
k=3∑mykαkXkX1+α1newy1K11+α2newy2K21+b1new=y1
因此
b1new=y1−k=3∑mykαkXkX1−α1newy1K11−α2newy2K21
未更新的
E1=k=3∑mykαkKk1+α1∗y1K11+α2∗y2K21+b∗−y1
因此可得
y1−k=3∑mykαkKk1=−E1+α1∗y1K11+α2∗y2K21+b∗
故
b1new=−E1+α1∗y1K11+α2∗y2K21+b∗−α1newy1K11−α2newy2K21
=b∗−E1+y1K11(α1∗−α1new)+y2K21(α2∗−α2new)
同理可得
b2new=b∗−E2+y1K12(α1∗−α1new)+y2K22(α2∗−α2new)
最終
bnew的取值爲
bnew=2b1new+b2new
對b的更新還不是十分肯定,先暫時按這樣的方式實現下代碼
3-2-3-3-5 更新
Ek
每次完成兩個變量的優化以後,還必須更新對應的
Ek,並將他們保存在列表中,
Ek值的更新要用到
bnew
Eknew=i=1∑myiαiKik+bnew−yk
3-2-3-4 一些證實細節
3-2-3-4-1 SVM對偶問題的任意一個子問題都是凸優化問題(拋物線開口向上)
用到的方法利用是Hessian矩陣判斷
子問題的Hessian矩陣爲
[QiiQjiQijQjj]
能夠寫成以下矩陣乘積的形式
[yiXiTyiXjT][yiXiyjXj]=ATA
任意的向量x
xTATAx=(Ax)T(Ax)⩾0
因此Hessian矩陣半正定,所以目標函數必定爲凸函數
3-2-3-4-2 SVM算法收斂性的證實
由於不管迭代時,兩個變量的初始值時多少,經過上面的子問題求解算法獲得的是在可行域內的最小值,所以每次更新完這兩個變量後,都能保證目標函數的值小於或者等於初始值,即函數值降低。同時SVM要求解的對偶問題是凸優化問題,有全局最小解,因此SMO算法能保證收斂。
3-2-3-5 優化變量的選擇
使用KKT條件,挑選出違反KKT條件的樣本,進行優化。
根據前面的推導,在最優勢處必須知足
{αi>0αi=0yi(wTx(i)+b)=1yi(wTx(i)+b)⩾1
其中
w用
α來表示
設
ui=j=1∑myjαjXj⋅Xi+b
因此在最優勢處必須知足
{αi>0αi=0yiui=1yiui⩾1
根據上式,依此檢查全部樣本,若是違反了上面的條件,則須要優化。
優先優化
αi>0
第二個變量的選擇,選擇使
∣Ei−Ej∣最大化的值。
其中
Ei=ui−yi
爲何選
∣Ei−