SMO算法(轉)


作者:[已重置]
鏈接:https://www.zhihu.com/question/40546280/answer/88539689
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

SMO(Sequential Minimal Optimization)是針對求解SVM問題的Lagrange對偶問題,一個二次規划式,開發的高效算法。傳統的二次規划算法的計算開銷正比於訓練集的規模,而SMO基於問題本身的特性(KKT條件約束)對這個特殊的二次規划問題的求解過程進行優化。對偶問題中我們最后求解的變量只有Lagrange乘子{\vec \alpha }向量,這個算法的基本思想就是每次都只選取一對\left( {{\alpha _i},{\alpha _j}} \right),固定{\vec \alpha }向量其他維度的元素的值,然后進行優化,直至收斂。

SMO干了什么?
首先,整個對偶問題的二次規划表達如下:
\begin{align}
\mathop {\max }\limits_{\vec \alpha } & \quad \sum\limits_{i = 1}^n {{\alpha _i}}  - \frac{1}{2}\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {{\alpha _i}{\alpha _j}{y_i}{y_j}{\bf{x}}_i^T{{\bf{x}}_j}} } \\
s.t.& \quad \sum\limits_{i = 1}^n {{\alpha _i}{y_i}}  = 0 \\
& \quad {\alpha _i} \ge 0, \quad i = 1,2, \ldots ,n
\end{align}
SMO在整個二次規划的過程中也沒干別的,總共干了兩件事:
  • 選取一對參數\left( {{\alpha _i},{\alpha _j}} \right)
  • 固定{\vec \alpha }向量的其他參數,將\left( {{\alpha _i},{\alpha _j}} \right)代入上述表達式進行求最優解獲得更新后的\left( {{\alpha _i},{\alpha _j}} \right)

SMO不斷執行這兩個步驟直至收斂。

因為有約束 \sum\limits_{i = 1}^n {{\alpha _i}{y_i}}  = 0存在,實際上 \[{{\alpha _i}}\]\[{{\alpha _j}}\]的關系也可以確定。 {\alpha _i}{y_i} + {\alpha _j}{y_j} = C這兩個參數的和或者差是一個常數。

所以雖然宣傳上說是選擇了一對\left( {{\alpha _i},{\alpha _j}} \right),但還是選擇了其中一個,將另一個寫作關於它的表達式代入目標函數求解。

為什么SMO跑的那么快,比提出之前的算法不知道高到哪里去了?
正如上面提到的,在固定其他參數以后,這就是一個單變量二次規划問題,僅有的約束也是這個變量\alpha _i \ge 0,顯然有閉式解。不必再調用數值優化算法。

KKT條件是對偶問題最優解的必要條件
\begin{cases}
{{\alpha _i} \ge 0}\\
{{y_i}f\left( {{{\bf{x}}_i}} \right) - 1 \ge 0}\\
{{\alpha _i}\left( {{y_i}f\left( {{{\bf{x}}_i}} \right) - 1} \right) = 0}
\end{cases}

除了第一個非負約束以外,其他約束都是根據目標函數推導得到的最優解必須滿足的條件,如果違背了這些條件,那得到的解必然不是最優的,目標函數的值會減小。

所以在SMO迭代的兩個步驟中,只要\left( {{\alpha _i},{\alpha _j}} \right)中有一個違背了KKT條件,這一輪迭代完成后,目標函數的值必然會增大。Generally speaking,KKT條件違背的程度越大,迭代后的優化效果越明顯,增幅越大。

怎樣跑的更快?
和梯度下降類似,我們要找到使之優化程度最大的方向(變量)進行優化。所以SMO先選取違背KKT條件程度最大的變量,那么第二個變量應該選擇使目標函數值增大最快的變量,但是這個變量怎么找呢?比較各變量優化后對應的目標函數值的變化幅度?這個樣子是不行的,復雜度太高了。

SMO使用了一個啟發式的方法,當確定了第一個變量后,選擇使兩個變量對應樣本之間最大的變量作為第二個變量。直觀來說,更新兩個差別很大的變量,比起相似的變量,會帶給目標函數更大的變化。間隔的定義也可以借用偏差函數
\[{E_i} = \max \left( {{y_i}f\left( {{{\bf{x}}_i}} \right) - 1,0} \right)\]
我們要找的也就是使對於\alpha_i來說使\left| {{E_i} - {E_j}} \right|最大的\alpha_j

很慚愧,只做了一點微小的工作。

References
[1] Platt, John. "Sequential minimal optimization: A fast algorithm for training support vector machines." (1998).


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM