序列最小優(yōu)化算法(SMO)淺析

寫在前面

有一個多月沒有更新博客了是钥,整個三月份都在忙項目的事掠归,忙著各種掃尾解決一些“歷史遺留問題”。終于到了清明節(jié)假期悄泥,可以寫一寫博客了虏冻。老實講,一共有好幾篇可以寫弹囚,不過想來想去還是先寫這篇SVM相關的吧厨相!主要是再不寫估計算法的推導細節(jié)就快忘完了,其他的坑慢慢再填:(哭鸥鹉。

OK蛮穿,言歸正傳,先簡單介紹一下什么是序列最小優(yōu)化算法(以下簡稱SMO算法)宋舷。SMO算法是一種解決二次優(yōu)化問題的算法绪撵,其最經(jīng)典的應用就是在解決SVM問題上。SVM推導到最后祝蝠,特別是使用了拉格朗日因子法求解之后便不難發(fā)現(xiàn)其最終等效為一個二次規(guī)劃問題音诈。二次規(guī)劃問題有很多成熟的解法,在SMO算法出現(xiàn)之前這些解法就已經(jīng)應用到了SVM問題的求解上绎狭。但是這些解法無論效果如何都有一個共同的缺點即是計算量太大细溅,在小樣本的情況下尚堪使用,數(shù)據(jù)量一大就變得難以奏效儡嘶。1996年喇聊,John Platt發(fā)布了一個稱為SMO的強大算法,用于訓練SVM分類器蹦狂。其基本思路就是一次迭代只優(yōu)化兩個變量而固定剩余的變量誓篱。直觀地講就是將一個大的優(yōu)化問題分解為若干個小的優(yōu)化問題朋贬,這些小的優(yōu)化問題往往是易于求解的。要想搞清楚SMO算法首先要簡要介紹一下SVM窜骄。

什么是SVM

SVM是Support Vector Machine(支持向量機)的英文縮寫锦募,是上世紀九十年代興起的一種機器學習算法,在目前神經(jīng)網(wǎng)絡大行其道的情況下依然保持著生命力邻遏。有人說現(xiàn)在是神經(jīng)網(wǎng)絡深度學習的時代了糠亩,AI從業(yè)者可以不用了解像SVM這樣的古董了。姑且不說SVM是否真的已經(jīng)沒有前途了准验,僅僅是SVM在數(shù)學上優(yōu)美的推導就值得后來者好好欣賞一番赎线,這也是筆者迄今為止見過機器學習領域最優(yōu)美的數(shù)學推導。

和大多數(shù)二分類算法一樣糊饱,SVM算法也是致力于在正例和反例之間找出一個超平面來將它們區(qū)分開來垂寥,如下圖所示:

圖1

如圖所示,正例用“+”號表示济似,反例用“-”號表示矫废。從圖中可以看出,正例和反例是線性可分的砰蠢。學習器的目的就是要學出一條如圖所示的紅色超平面將正例和反例區(qū)分開來蓖扑。這也是其他非SVM分類器的共同目標,即:

而SVM與其它分類器所不同的是它引入了“支持向量”這一概念台舱,反映到圖中也就是紅色的小點所代表的向量律杠。(注:由于筆者作圖時采用的SVM是軟間隔的版本,因此支持向量不像是大多數(shù)教科書上采用硬間隔的SVM那樣)由SVM的優(yōu)化目標我們可以知道:樣本空間中任意一個點x到該超平面的的距離可寫為:

假設超平面可以完全正確地將所有樣本分類竞惋,則對于任意一個樣本(xi柜去,yi)來說都有如下性質(注:樣本的標簽用+1代表正例,-1代表反例):

訓練樣本中使上式成立的樣本稱為支持向量拆宛,兩個異類支持向量到超平面距離之和為:

上式被稱為“間隔”嗓奢。SVM的優(yōu)化目標是為了找到這樣一個劃分超平面,該超平面能使間隔最大化浑厚,則SVM的優(yōu)化目標可以表示為如下形式:

這就是SVM的基本數(shù)學表達股耽,接下來就要對SVM問題進行求解。從上面的數(shù)學形式可以看出這是一個優(yōu)化問題钳幅,可以使用拉格朗日乘子法求解其對偶問題物蝙。由于本文不是專門介紹SVM的,因此忽略掉具體的推導敢艰,直接給出SVM的對偶問題表達:

由于采用了拉格朗日乘子法诬乞,因此該對偶問題還有一個KKT條件約束,即要求:

以上,就是SVM的一些相關介紹震嫉。需要特別說明的是森瘪,以上的推導都是建立在“硬間隔”的基礎上,“硬間隔”要求樣本集中每一個樣本都滿足約束條件票堵。在現(xiàn)實中往往很難確定合適的核函數(shù)使得訓練樣本在特征空間中是線性可分的柜砾,緩解該問題的一個辦法是允許支持向量機在一些樣本上出錯,為此引入“軟間隔”的概念换衬。具體來說,“硬間隔”要求所有參與訓練的樣本都必須滿足SVM的約束條件证芭,而“軟間隔”允許有部分樣本不滿足這樣的約束瞳浦。由于本文不是專門論述SVM的,因此就不展開講“軟間隔”所帶來的一些新的問題废士,只說一下“軟間隔”條件下新的優(yōu)化目標:

KKT條件為:

其中叫潦,C為容忍度因子,可以理解為SVM對“軟間隔”的支持度官硝。若C為無窮大矗蕊,則所有的訓練樣本均必須滿足SVM的約束條件,C值越小就允許越多的樣本不滿足約束條件氢架。

SMO算法思想

通過觀察SVM的優(yōu)化目標我們可以發(fā)現(xiàn)其最終的目的是要計算出一組最優(yōu)的alpha和常數(shù)項b的值傻咖。SMO算法的中心思想就是每次選出兩個alpha進行優(yōu)化(之所以是兩個是因為alpha的約束條件決定了其與標簽乘積的累加等于0,因此必須一次同時優(yōu)化兩個岖研,否則就會破壞約束條件)卿操,然后固定其他的alpha值。重復此過程孙援,直到達到某個終止條件程序退出并得到我們需要的優(yōu)化結果害淤。接下來,就具體推導一下SMO算法的細節(jié)拓售。

算法數(shù)學推導

由于SVM中有核函數(shù)的概念窥摄,因此我們用Kij來表示在核函數(shù)K下向量i和向量j的計算值。現(xiàn)在假定我們已經(jīng)選出alpha1和alpha2兩個待優(yōu)化項础淤,然后將原優(yōu)化目標函數(shù)展開為與alpha1和alpha2有關的部分和無關的部分:

其中c是與alpha1和alpha2無關的部分崭放,在本次優(yōu)化中當做常數(shù)項處理。由SVM優(yōu)化目標函數(shù)的約束條件:

可以得到:

將優(yōu)化目標中所有的alpha1都替換為用alpha2表示的形式值骇,得到如下式子:

此時莹菱,優(yōu)化目標中僅含有alpha2一個待優(yōu)化變量了,我們現(xiàn)在將待優(yōu)化函數(shù)對alpha2求偏導得到如下結果:

已知:

將以上三個條件帶入偏導式子中吱瘩,得到如下結果:

化簡后得:

記:

若n<=0則退出本次優(yōu)化道伟,若n>0則可得到alpha2的更新公式:

此時,我們已經(jīng)得到了alpha2的更新公式。不過我們此時還需要考慮alpha2的取值范圍問題蜜徽。因為alpha2的取值范圍應該是在0到C之間祝懂,但是在這里并不能簡單地把取值范圍限定在0至C之間,因為alpha2的取值不僅僅與其本身的范圍有關拘鞋,也與alpha1砚蓬,y1和y2有關。設alpha1*y1+alpha2*y2=k盆色,畫出其約束灰蛙,在這里要分兩種情況,即y1是否等于y2隔躲。我們在這里先來考慮y1!=y2的情況:在這種情況下alpha1-alpha2=k:

圖2

可以看出此時alpha2的取值范圍為:

當y1=y2時摩梧,alpha1+alpha2=k:

圖3

可以看出此時alpha2的取值范圍為:

以上,可以總結出alpha2的取值上下界的規(guī)律:

故可得到alpha2的取值范圍:

由alpha_old1y1+alpha_old2y2=alpha_new1y1+alpha_new2y2可得alpha1的更新公式:

接下來宣旱,需要確定常數(shù)b的更新公式仅父,在這里首先需要根據(jù)“軟間隔”下SVM優(yōu)化目標函數(shù)的KKT條件推導出新的KKT條件,得到結果如下:

由于現(xiàn)在alpha的取值范圍已經(jīng)限定在0至C之間浑吟,也就是上面KKT條件的第三種情況笙纤。接下來我們將第三種KKT條件推廣到任意核函數(shù)的情境下:

由此我們可以得到常數(shù)b的更新公式:

其中Ei是SVM的預測誤差,計算式為:

以上组力,筆者就已經(jīng)把SMO算法的大部分細節(jié)推導出來了省容。接下來,我們可以根據(jù)這些推導對SMO算法進行實現(xiàn)燎字,并且用我們的算法訓練一個SVM分類器蓉冈。

SMO的算法實現(xiàn)

SMO算法的實現(xiàn)還是比較復雜的,有很多細節(jié)轩触,我們不用一一關注寞酿,只用抓住其中兩個特別重要的點就行了:1、如何選取每次迭代的alpha對脱柱;2伐弹、如何確定SVM優(yōu)化程序的退出條件。筆者將就這兩個主要問題進行論述榨为。首先關注第一個問題:如何選取alpha對惨好。

我們可以簡化一下第一個問題:假定現(xiàn)在已經(jīng)選取了第一個待優(yōu)化的alpha,如何選取另一個alpha随闺?在SMO算法中為了讓迭代次數(shù)盡量少日川,收斂速度盡量快,算法要求我們選取的兩個alpha有盡可能大的“差異”矩乐。在算法的實現(xiàn)中我們用預測的誤差值來表征一個alpha的效果龄句。那么兩個aplha盡可能不同反映在算法上就是兩個alpha所對應的預測誤差值之差的絕對值最大回论,該思想用代碼表現(xiàn)出來如下圖所示:

圖4

上面的代碼反映出了這樣一種思想:首先傳入第一個alpha所對應的索引值“i”,然后搜索誤差列表eCache分歇,在其中找到與“i”所對應的誤差值相差絕對值最大的那個索引值“j”傀蓉,則另一個alpha的索引值就定為“j”。若誤差值列表eCache還沒有初始化則從所有的索引值中隨機選取一個索引值作為另一個alpha的索引值职抡。

那么第一個alpha如何選取呢葬燎?這個問題與另外兩個問題是相關的:第一個問題是選取的alpha值是否違反KKT條件,如果該alpha值違反了KKT條件則該alpha是不能夠作為優(yōu)化對象的缚甩;第二個問題與SMO優(yōu)化算法的優(yōu)化終止條件有關谱净,通常SMO算法會在一個死循環(huán)中反復執(zhí)行兩個過程,第一個過程是遍歷所有的alpha值擅威,每掃描到一個alpha就將其作為alpha對的第一個值傳入內循環(huán)岳遥,同時根據(jù)上一段提出的選取準則選擇另一個alpha。遍歷完一次alpha值之后若alpha值被優(yōu)化器改變的次數(shù)不為0則本次循環(huán)結束同時修改一些標志量然后進入下一次循環(huán)裕寨。下一次循環(huán)執(zhí)行第二個過程:遍歷alpha值列表中所有不為0的值,每掃描到一個不為0的alpha值之后就將其傳入內循環(huán)派继,然后執(zhí)行和上面相同的過程宾袜。重復執(zhí)行上述過程,最終驾窟,當某次循環(huán)遍歷優(yōu)化所有alpha列表后卻沒有一個alpha值被優(yōu)化器改變則程序認為優(yōu)化任務完成了庆猫,程序退出。代碼如下:

圖5

以上绅络,就是SMO算法在實現(xiàn)時的一些細節(jié)月培。完整的SMO實現(xiàn)還是比較復雜的,有很多的小細節(jié)需要注意恩急,在這里就不一一論述了杉畜。如果讀者想了解更多可以訪問我的git倉庫,上面有我的詳細代碼衷恭,倉庫地址在文章的末尾給出此叠。

后記

SVM算法其實筆者很早就用過,最早是大學時用來做垃圾郵件的分類随珠,但那個時候一直是在調用算法包灭袁,對SVM算法的種種細節(jié)不是很了解。今年寒假的時候數(shù)據(jù)挖掘這門課剛好有一個大作業(yè)用到了這個算法窗看,這才算好好了解了一下這種算法實現(xiàn)的內部細節(jié)茸歧,自己用python好好實現(xiàn)了一下。

自從上了研究生以后就一直在了解學習機器學習的種種算法显沈,真心感覺這個領域非常有意思软瞎,對數(shù)學的要求很高。雖然自己學習的算法現(xiàn)在還是停留在像支持向量機,隨機森林铜涉,決策樹智玻,邏輯回歸這些經(jīng)典的算法上,可以說進步緩慢芙代,但是我還是很有信心吊奢,總是要先把基礎打好嘛!嗯~目前為止這些經(jīng)典的算法幾乎都快被我掃清了纹烹,數(shù)據(jù)挖掘領域的十大算法自己已經(jīng)差不多實現(xiàn)了六七個页滚,接下來想想看就該進入概率圖模型,馬爾科夫隨機場铺呵,神經(jīng)網(wǎng)絡深度學習什么的了裹驰,剛好這學期有一門神經(jīng)網(wǎng)絡的課。估計這篇文章就是傳統(tǒng)機器學習算法的最后一篇博客了片挂,以后再寫就應該是神經(jīng)網(wǎng)絡和分布式系統(tǒng)方面的了幻林,什么TensorFlow,什么CNN音念,RNN都寫一寫沪饺。哈哈!請大家關注我的github闷愤,我會在上面把我自己的機器學習筆記代碼都實時公開的整葡,博客也會有時間就寫。

https://github.com/yhswjtuILMARE/Machine-Learning-Study-Notes

2018年4月8日

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末讥脐,一起剝皮案震驚了整個濱河市遭居,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旬渠,老刑警劉巖俱萍,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異告丢,居然都是意外死亡鼠次,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門芋齿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腥寇,“玉大人,你說我怎么就攤上這事觅捆∩庖郏” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵栅炒,是天一觀的道長掂摔。 經(jīng)常有香客問我术羔,道長,這世上最難降的妖魔是什么乙漓? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任级历,我火速辦了婚禮,結果婚禮上叭披,老公的妹妹穿的比我還像新娘寥殖。我一直安慰自己,他們只是感情好涩蜘,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布嚼贡。 她就那樣靜靜地躺著,像睡著了一般同诫。 火紅的嫁衣襯著肌膚如雪粤策。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天误窖,我揣著相機與錄音叮盘,去河邊找鬼。 笑死霹俺,一個胖子當著我的面吹牛柔吼,可吹牛的內容都是我干的。 我是一名探鬼主播吭服,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蝗罗!你這毒婦竟也來了艇棕?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤串塑,失蹤者是張志新(化名)和其女友劉穎沼琉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桩匪,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡打瘪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了傻昙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闺骚。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妆档,靈堂內的尸體忽然破棺而出僻爽,到底是詐尸還是另有隱情,我是刑警寧澤贾惦,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布胸梆,位于F島的核電站敦捧,受9級特大地震影響,放射性物質發(fā)生泄漏碰镜。R本人自食惡果不足惜兢卵,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绪颖。 院中可真熱鬧秽荤,春花似錦、人聲如沸菠发。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滓鸠。三九已至雁乡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間糜俗,已是汗流浹背踱稍。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悠抹,地道東北人珠月。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像楔敌,于是被迫代替她去往敵國和親啤挎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容