本文參考自:https://www.zhihu.com/question/40546280/answer/88539689
簡化版:每次迭代隨機選取alpha_i和alpha_j,當然其中要有 一個違反kkt條件,通常先選一個違反kkt條件的alpha_i,然后隨機選擇一個alpha_j,然后用類似坐標上升(下降)的算法來 優化目標函數,具體細節題主可以看相關代碼,推薦《machine learning in action》的svm部分,但是這樣的優化方式並不是最快的;
優化版:用啟發式的算法選擇 alpha_j,即選擇alpha_j,使得|Ei-Ej|最大,至於為什么,因為 變量的更新步長正比於|Ei-Ej|,也就是說我們希望變量更新速度更快,其余的和簡化版其實區別不大;
應該還有其他版本的smo,沒看過不做評論,希望對題主有用。
SMO(Sequential Minimal Optimization)是針對求解SVM問題的Lagrange對偶問題,一個二次規划式,開發的高效算法。
傳統的二次規划算法的計算開銷正比於訓練集的規模,而SMO基於問題本身的特性(KKT條件約束)對這個特殊的二次規划問題的求解過程進行優化。
對偶問題中我們最后求解的變量只有Lagrange乘子向量,這個算法的基本思想就是每次都只選取一對
,固定
向量其他維度的元素的值,然后進行優化,直至收斂。
首先,整個對偶問題的二次規划表達如下:

SMO在整個二次規划的過程中也沒干別的,總共干了兩件事:
- 選取一對參數
- 固定
向量的其他參數,將
代入上述表達式進行求最優解獲得更新后的
SMO不斷執行這兩個步驟直至收斂。
因為有約束
![\[{{\alpha _i}}\]](/image/Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUMlNUIlN0IlN0IlNUNhbHBoYStfaSU3RCU3RCU1QyU1RA==.png)
![\[{{\alpha _j}}\]](/image/Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUMlNUIlN0IlN0IlNUNhbHBoYStfaiU3RCU3RCU1QyU1RA==.png)


所以雖然宣傳上說是選擇了一對,但還是選擇了其中一個,將另一個寫作關於它的表達式代入目標函數求解。
為什么SMO跑的那么快,比提出之前的算法不知道高到哪里去了?
正如上面提到的,在固定其他參數以后,這就是一個單變量二次規划問題,僅有的約束也是這個變量,顯然有閉式解。不必再調用數值優化算法。
KKT條件是對偶問題最優解的必要條件:
除了第一個非負約束以外,其他約束都是根據目標函數推導得到的最優解必須滿足的條件,如果違背了這些條件,那得到的解必然不是最優的,目標函數的值會減小。
所以在SMO迭代的兩個步驟中,只要中有一個違背了KKT條件,這一輪迭代完成后,目標函數的值必然會增大。Generally speaking,KKT條件違背的程度越大,迭代后的優化效果越明顯,增幅越大。
怎樣跑的更快?
和梯度下降類似,我們要找到使之優化程度最大的方向(變量)進行優化。所以SMO先選取違背KKT條件程度最大的變量,那么第二個變量應該選擇使目標函數值增大最快的變量,但是這個變量怎么找呢?比較各變量優化后對應的目標函數值的變化幅度?這個樣子是不行的,復雜度太高了。
SMO使用了一個啟發式的方法,當確定了第一個變量后,選擇使兩個變量對應樣本之間最大的變量作為第二個變量。直觀來說,更新兩個差別很大的變量,比起相似的變量,會帶給目標函數更大的變化。間隔的定義也可以借用偏差函數
我們要找的也就是使對於來說使
最大的
很慚愧,只做了一點微小的工作。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SVM算法優點:
(1)非線性映射是SVM方法的理論基礎,SVM利用內積核函數代替向高維空間的非線性映射;
(2)對特征空間划分的最優超平面是SVM的目標,最大化分類邊際的思想是SVM方法的核心;
(3)支持向量是SVM的訓練結果,在SVM分類決策中起決定性作用。因此,模型需要存儲空間小,算法魯棒性( Robust )強。
SVM算法缺點:
(1) SVM算法對大規模訓練樣本難以實施
由於SVM是借助二次規划來求解支持向量,而求解二次規划將涉及m階矩陣的計算(m為樣本的個數),當m數目很大時該矩陣的存儲和計算將耗費大量的機器內存和運算時間。
(2) 用SVM解決多分類問題存在困難
經典的支持向量機算法只給出了二類分類的算法,而在數據挖掘的實際應用中,一般要解決多類的分類問題。
基於以上問題,我們現在討論SOM( Sequential Minimal Optimization algorithm )算法。
1、SMO算法的原理
這一被稱為“順次最小優化”的算法和以往的一些SVM改進算法一樣,是把整個二次規划問題分解為很多易於處理的小問題,所不同的是,只有SMO算法把問題分解到可能達到的最小規模:每次優化只處理兩個樣本的優化問題,並且用解析的方法進行處理。我們將會看到,這種與眾不同的方法帶來了一系列不可比擬的優勢。
對SVM來說,一次至少要同時對兩個樣本進行優化(就是優化它們對應的Lagrange乘子),這是因為等式約束的存在使得我們不可能單獨優化一個變量。
所謂“最小優化”的最大好處就是使得我們可以用解析的方法求解每一個最小規模的優化問題,從而完全避免了迭代算法。
當然,這樣一次“最小優化”不可能保證其結果就是所優化的Lagrange乘子的最終結果,但會使目標函數向極小值邁進一步。我們再對其它Lagrange乘子做最小優化,直到所有乘子都符合KKT條件時,目標函數達到最小,算法結束。
這樣,SMO算法要解決兩個問題:一是怎樣解決兩個變量的優化問題,二是怎樣決定先對哪些Lagrange乘子進行優化。
2、SMO算法的特點和優勢
SMO算法和以往流行的SVM優化算法如塊算法、固定工作樣本集法相比,既有共同點,又有自己的獨特之處。
共同點在於它們都是把一個大的優化問題分解為很多小問題來處理。塊算法在每一步中將新加入樣本中違反KKT條件的樣本與原有的支持向量一起組成小問題的樣本集進行優化,優化完畢后只保留其中的支持向量,再加進來新的樣本進入下一步。固定工作樣本集法是每一步只收集新加入樣本中“最壞”的樣本,並將原來保留的支持向量集中“較好”的替換出去,以保持樣本集大小不變。SMO則是把每一步的優化問題縮減到了最小,它可以看作是固定工作樣本集法的一種特殊情況:把工作樣本集的大小固定為2,並且每一步用兩個新的Lagrange乘子替換原有的全部乘子。
SMO的最大特色在於它可以采用解析的方法而完全避免了二次規划數值解法的復雜迭代過程。這不但大大節省了計算時間,而且不會牽涉到迭代法造成的誤差積累(其它一些算法中這種誤差積累帶來了很大的麻煩)。理論上SMO的每一步最小優化都不會造成任何誤差積累,而如果用雙精度數計算,舍入誤差幾乎可以忽略,於是所有的誤差只在於最后一遍檢驗時以多大的公差要求所有Lagrange乘子滿足KKT條件。可以說SMO算法在速度和精度兩方面都得到了保證。
SMO在內存的節省上也頗具特色。我們看到,由於SMO不涉及二次規划數值解法,就不必將核函數矩陣整個存在內存里,而數值解法每步迭代都要拿這個矩陣作運算。(4000個樣本的核函數矩陣需要128M內存!)於是SMO使用的內存是與樣本集大小成線性增長的,而不象以往的算法那樣成平方增長。在我們的程序中SMO算法最多占用十幾兆內存。SMO使得存儲空間問題不再是SVM應用中的另一個瓶頸。
SMO算法對線性支持向量機最為有效,對非線性則不能發揮出全部優勢,這是因為線性情況下每次最小優化后的重置工作都是很簡單的運算,而非線性時有一步加權求和,占用了主要的時間。其他算法對線性和非線性區別不大,因為凡是涉及二次規划數值解的算法都把大量時間花在求數值解的運算中了。
當大多數Lagrange乘子都在邊界上時,SMO算法的效果會更好。
盡管SMO的計算時間仍比訓練集大小增長快得多,但比起其它方法來還是增長得慢一個等級。因此SMO較適合大數量的樣本。