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

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