鏈接:https://www.zhihu.com/question/40546280/answer/88539689
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
SMO(Sequential Minimal Optimization)是針對求解SVM問題的Lagrange對偶問題,一個二次規划式,開發的高效算法。傳統的二次規划算法的計算開銷正比於訓練集的規模,而SMO基於問題本身的特性(KKT條件約束)對這個特殊的二次規划問題的求解過程進行優化。對偶問題中我們最后求解的變量只有Lagrange乘子向量,這個算法的基本思想就是每次都只選取一對
,固定
向量其他維度的元素的值,然后進行優化,直至收斂。
首先,整個對偶問題的二次規划表達如下:

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


所以雖然宣傳上說是選擇了一對,但還是選擇了其中一個,將另一個寫作關於它的表達式代入目標函數求解。
為什么SMO跑的那么快,比提出之前的算法不知道高到哪里去了?
正如上面提到的,在固定其他參數以后,這就是一個單變量二次規划問題,僅有的約束也是這個變量,顯然有閉式解。不必再調用數值優化算法。
KKT條件是對偶問題最優解的必要條件:
除了第一個非負約束以外,其他約束都是根據目標函數推導得到的最優解必須滿足的條件,如果違背了這些條件,那得到的解必然不是最優的,目標函數的值會減小。
所以在SMO迭代的兩個步驟中,只要中有一個違背了KKT條件,這一輪迭代完成后,目標函數的值必然會增大。Generally speaking,KKT條件違背的程度越大,迭代后的優化效果越明顯,增幅越大。
怎樣跑的更快?
和梯度下降類似,我們要找到使之優化程度最大的方向(變量)進行優化。所以SMO先選取違背KKT條件程度最大的變量,那么第二個變量應該選擇使目標函數值增大最快的變量,但是這個變量怎么找呢?比較各變量優化后對應的目標函數值的變化幅度?這個樣子是不行的,復雜度太高了。
SMO使用了一個啟發式的方法,當確定了第一個變量后,選擇使兩個變量對應樣本之間最大的變量作為第二個變量。直觀來說,更新兩個差別很大的變量,比起相似的變量,會帶給目標函數更大的變化。間隔的定義也可以借用偏差函數
我們要找的也就是使對於來說使
最大的
很慚愧,只做了一點微小的工作。
References[1] Platt, John. "Sequential minimal optimization: A fast algorithm for training support vector machines." (1998).