摘要
本文提出了一種用於訓練支援向量機的新演算法:序列最小優化演算法(SMO)。訓練支援向量機需要解決非常大的二次規劃(QP)優化問題。SMO 將這個大的 QP 問題分解為一系列最小的 QP 問題。這些小的 QP 問題可以通過解析來解決,從而避免了將耗時的數值 QP 優化用作內部迴圈。SMO 所需的記憶體量與訓練集大小成線性關係,這使 SMO 可以處理非常大的訓練集。由於避免了矩陣計算,因此對於各種測試問題,SMO 隨訓練集大小線上性和二次方之間縮放,而標準分塊 SVM 演算法隨訓練集大小線上性和三次方之間縮放。SMO 的計算時間主要由 SVM 評估決定,因此 SMO 對於線性 SVM 和稀疏資料集最快。在現實世界的稀疏資料集上,SMO 的速度可以比分塊演算法快 1000 倍以上。
研究背景
在過去的幾年中,學界對支援向量機(SVM)的研究興趣激增,因其在諸如手寫字元識別、面部檢測、行人檢測和文字分類等許多問題上均具有良好的泛化效能。然而,現有的 SVM 訓練演算法速度慢、記憶體開銷大,且實現過於複雜和困難,這使得 SVM 的使用仍然僅限於一小部分研究人員。因此,為了提高 SVM 的實用性,亟需一種更好的訓練演算法。
問題描述
SVM 的訓練本質上是求解一個二次規劃(QP)問題,其拉格朗日對偶表示如下:
當滿足如下 KKT 條件時,該 QP 問題得以解決:
其中,\(\vec x_i\) 是第 i 個訓練樣本,\(y_i\) 是第 i 個訓練樣本的真實標籤,\(u_i\) 是第 i 個訓練樣本的輸出,\(α_i\) 第 i 個訓練樣本對應的拉格朗日乘數,\(C\) 是懲罰引數。
上式中的二次形式涉及一個矩陣,該矩陣的元素數量等於訓練樣本數量的平方。一旦樣本數量稍大,該矩陣將難以存入記憶體,因而通過標準的 QP 技術無法輕鬆解決由 SVM 引出的 QP 問題。
本文所討論的內容即,作者所提出的訓練演算法是如何解決上述問題的。
研究現狀
Vapnik[2] 描述了一種“分塊”解決 SVM QP 的方法,將整個 QP 問題分解為多個 QP 子問題,其最終目標是識別所有非零拉格朗日乘數並丟棄所有零拉格朗日乘數。每個 QP 子問題都使用先前子問題的結果初始化。在最後一步,已經確定了整個非零拉格朗日乘數集,從而解決了整個 QP 問題。
分塊處理將矩陣的大小從訓練樣本數的平方,減少到大約為非零拉格朗日乘數的數目的平方。然而,分塊演算法仍然不能解決大規模的訓練問題,因為即使這個縮小的矩陣也無法放入記憶體中。
1997年,Osuna 等人[3] 從理論上證明,大的 QP 問題可以分解為一系列較小的 QP 子問題。基於此,論文建議在每一步中新增一個樣本,然後去除一個樣本,這樣每個 QP 子問題將保持一個恆定大小的矩陣,從而允許對任意大小的資料集進行訓練。但顯然這是低效的,因為它使用整個數值 QP 優化步驟來僅僅使一個訓練樣本服從 KKT 條件。
更重要的是,所有這些方法都需要數值 QP 解算器,而眾所周知,數值 QP 存在精度問題。
解決方法
作者在論文中提出的序列最小優化演算法(SMO)是一種簡單快速求解 SVM 引出的 QP 問題的方法,它將整個 QP 問題分解為多個 QP 子問題,通過 Osuna[3] 的定理保證收斂。
創新點與優勢
不像以往的演算法,SMO 在每一步僅選擇兩個拉格朗日乘數進行聯合優化。其優勢在於,兩個拉格朗日乘數的優化可以通過解析方法完成,避免了數值 QP 優化,計算更快、更精確。此外,由於 SMO 完全不需要額外的矩陣儲存,即使大規模的訓練問題也可以在個人電腦的記憶體中執行。下圖直觀地說明了 SMO 與以往演算法的區別。
圖中,每種演算法均展示了三個訓練輪次。水平細線代表訓練集,粗塊代表本輪中被優化的拉格朗日乘數。對於分塊演算法,每輪新增固定數量的樣本,而為零的拉格朗日乘數被丟棄。因此,每輪的訓練樣本數量趨於增加。對於Osuna的演算法,每輪都會優化固定數量的樣本,因為新增和刪除的樣本數量相同。對於SMO,每輪都僅對兩個樣本進行解析優化,因此每輪都非常快。
實現過程
SMO 由兩個部分組成:一種求解兩個拉格朗日乘數的解析方法,以及一種選擇要優化的乘數的啟發式方法。
求解兩個拉格朗日乘數的解析方法
為了求解兩個拉格朗日乘數,SMO 首先計算這些乘數的約束,然後求解約束最小值。如下圖所示,有界約束使拉格朗日乘數位於一個框內,而線性相等約束使拉格朗日乘數位於對角線上。 因此,目標函式的約束最小值必須位於對角線段上。
在實現上,假設當前為第 \(k\) 輪,使用解析法計算乘數 \(α_1^{(k)}\) 和 \(α_2^{(k)}\) 的最優解並更新至 \(α_1^{(k+1)}\) 和 \(α_2^{(k+1)}\),\(\vec α\) 中的其他乘數不變,得到 \(\vec α^{(k+1)}\),然後更新閾值 \(b^{(k+1)}\) 以及誤差 $E_i^{(k+1)} $。具體計算過程如下:
-
計算 \(α_2^{(k+1)}\) 的取值範圍 \([L, H]\),其中
-
求得最優解\(α_1^{(k+1)}\),\(α_2^{(k+1)}\),\(b^{(k+1)}\)
結合 \(α_2^{(k+1)}\) 的取值範圍,可得
由 \(α_2^{(k+1)}\) 可求得 \(α_1^{(k+1)}\)
之後更新閾值 \(b\)
-
更新 \(E_i\) 的值
選擇要優化的乘數的啟發式方法
第一個乘數的選擇稱為外迴圈。首先遍歷整個樣本集,選擇違反 KKT 條件的 \(α_i\) 作為第一個乘數,遍歷完整個樣本集後,遍歷非邊界樣本集 \(0<α_i<C\) 中違反 KKT 條件的 \(α_i\) 作為第一個乘數。遍歷完非邊界樣本集後,再次回到遍歷整個樣本集中尋找,即在整個樣本集與非邊界樣本集上來回切換。直到遍歷整個樣本集後,沒有違反 KKT 條件的 \(α_i\),則退出。
第二個乘數的選擇稱為內迴圈。選擇的依據是最大化聯合優化過程中採取的步長,而 SMO 通過 \(|E_1−E_2|\) 來近似步長,為此需要為訓練集中的每個非邊界樣本保留一個快取的誤差值 \(E_i\)。
實驗評估
作者對比標準分塊 SVM 學習演算法,對 SMO 演算法進行了一系列基準測試。
實驗平臺
兩種演算法都以 C++ 編寫,使用 Microsoft 的 Visual C++ 5.0 編譯器,且都在執行 Windows NT 4 的 266 MHz Pentium II 處理器上執行。
實驗配置
如 Burges[4] 的建議,分塊演算法使用投影共軛梯度演算法[5]作為 QP 解算器,並使用啟發式方法來設定停止閾值[1]。為了確保分塊演算法和 SMO 演算法達到相同的精度,如果輸出與其正確值相差 \(10^{-3}\) 以上,則兩種演算法都會將該樣本標識為違反 KKT 條件。
實驗方法
作者在收入預測任務、網頁分類任務和兩個不同的人工資料集上對 SMO 演算法進行了測試,研究演算法的時間效能以及資料稀疏性對運算速度的影響。以下表中列出的所有時間均以 CPU 秒為單位。
收入預測
用於測試 SMO 速度的第一個資料集是 UCI 的 adult 家庭普查資料集,共有 32562 個樣本,包括 14 個屬性。SVM 的任務是預測該家庭的收入是否超過 50,000 美元。針對該問題訓練了兩種不同的 SVM:線性 SVM 和方差為 10 的高斯SVM。
下表顯示了在 adult 資料集上,使用 SMO 演算法和分塊演算法訓練線性 SVM 的時間。
通過擬合訓練時間與訓練集大小的對數-對數圖,得出 SMO 的訓練時間規模為 ~\(N^{1.9}\),而分塊演算法為 ~\(N^{3.1}\)。因此,SMO將對於該問題的經驗縮放比例優化了至少一個數量級。
使用 SMO 演算法和分塊演算法訓練高斯 SVM 的時間如下表所示:
SMO 演算法對於非線性 SVM 比線性 SVM 慢,這是因為時間開銷主要由 SVM 的評估決定。這裡,SMO 的訓練時間規模為 ~\(N^{2.1}\),而分塊演算法為 ~\(N^{2.9}\)。同樣,SMO 比分塊演算法大約快一個數量級。
網頁分類
SMO 的第二項測試是對網頁進行分類。訓練集包括 49749 個網頁,從每個網頁中提取了 300 個稀疏的二進位制關鍵字屬性。在此問題上嘗試了兩種不同的 SVM:線性 SVM 和方差為 10 的高斯 SVM。
使用 SMO 演算法和分塊演算法訓練線性 SVM 的時間如下表所示:
對於該資料集上的線性 SVM,SMO 的訓練時間規模為 ~\(N^{1.6}\),而分塊演算法為 ~\(N^{2.5}\)。該實驗是 SMO 在計算時間上優於分塊演算法的另一個例子。
使用 SMO 演算法和分塊演算法訓練高斯 SVM 的時間如下表所示:
對於該資料集上的非線性 SVM,SMO 的訓練時間規模為 ~\(N^{1.7}\),而分塊演算法為 ~\(N^{2.0}\)。在這種情況下,SMO 比分塊演算法快 2~6 倍。
線性可分資料集
作者還在人工生成的資料集上對 SMO 進行了測試,以探索 SMO 在極端情況下的效能。
第一個人工資料集是完全線性可分離的資料集,輸入資料是隨機二進位制 300 維向量。這裡用線性 SVM 擬合此資料集。
使用 SMO 演算法和分塊演算法訓練線性 SVM 的時間如下表所示:
SMO 的訓練時間規模為 ~\(N\),較分塊演算法的 ~\(N^{1.2}\) 稍好。
此外,還可以在此簡單資料集上測量利用稀疏點積而獲得的SMO演算法和分塊演算法的加速。相同的資料集在使用和不使用稀疏點乘積程式碼的情況下都進行了測試。
稀疏/非稀疏實驗的結果如下表所示:
對於 SMO,使用稀疏資料結構將程式碼的速度提高了 10 倍以上,這表明 SVM 的評估時間完全決定了 SMO 的計算時間。稀疏點積程式碼僅將分塊演算法的速度提高了大約 1.1 倍,這表明數值 QP 步驟的評估在分塊計算中占主導地位。
噪聲資料集
第二個人工資料集由隨機的 300 維二進位制輸入點和隨機輸出標籤生成。SVM 擬合的是純噪聲。
將 SMO 和分塊演算法應用於線性 SVM 的結果如下所示:
SMO 的計算時間規模為 ~\(N^{1.8}\),而分塊演算法為 ~\(N^{3.2}\)。該結果顯示,當大多數支援向量都處於邊界時,SMO 表現出色。因此,為了確定由稀疏點積程式碼引起的速度增加,在沒有使用稀疏點乘積程式碼的情況下測試了 SMO 和分塊演算法:
線上性 SVM 情況下,稀疏點積程式碼將 SMO 的速度提高了大約 6 倍,而分塊演算法的速度提升很小。在該實驗中,即使對於非稀疏資料,SMO 也比分塊更快。
同樣地,作者也使用了方差為 10 的高斯 SVM 對第二個人工資料集進行了測試,實驗結果顯示在以下兩個表格中:
對於擬合純噪聲的高斯 SVM,SMO 的計算時間規模為 ~\(N^{2.2}\),而分塊演算法為 ~\(N^{3.4}\)。即使應用於非稀疏資料,SMO 的總執行時間仍然優於分塊演算法。對於非線性情況,輸入資料的稀疏性使 SMO 的速度提高了大約 4 倍,這表明對於非線性 SVM,點積速度仍佔 SMO 計算時間的主導地位。
實驗結論
- SMO 在多種不同的資料集上都比分塊演算法更快。
- SMO 在有許多拉格朗日乘數處於邊界上的 SVM 上表現出色。
- SMO 對於線性 SVM 表現良好,因為 SMO 的計算時間主要由 SVM 評估決定。
- SMO 對於具有稀疏輸入的 SVM 表現出色(即使是非線性 SVM),因為其可以減少核函式的計算時間,從而直接加速了 SMO。
- SMO 在大規模問題上表現良好,因為對於文中所有的測試問題,其計算時間隨訓練集大小的縮放規模都優於分塊演算法。
不足之處
S.S. Keerthi 等人[6]指出,由於 SMO 的計算方式以及僅維護和更新一個閾值 \(β\) 的特點,在某些情況下可能會進行不必要的第二個拉格朗日乘數的搜尋,從而導致 SMO 的效率低下。
左琳[7]也指出,SMO 實際上是在迴圈迭代上尋求快速演算法。因此如果沒有一個好的選擇迭代策略,SMO 演算法就存在盲目性,可能出現某些達到最優值的樣本卻不滿足 KKT 條件的情況,比如過度選擇的消耗,影響了演算法的執行效率。
參考文獻
- J. Platt, “Sequential minimal optimization: A fast algorithm for training support vector machines,” Microsoft, Res. Tech. Rep. MSR-TR-98-14, 1998.
- Vapnik, V., Estimation of Dependences Based on Empirical Data, Springer-Verlag, (1982).
- Osuna, E., Freund, R., Girosi, F., "Improved Training Algorithm for Support Vector Machines," Proc. IEEE NNSP ’97, (1997).
- Burges, Christopher JC. "A tutorial on support vector machines for pattern recognition." Data mining and knowledge discovery 2.2 (1998): 121-167.
- Gill, P. E., Murray, W., Wright, M. H., Practical Optimization, Academic Press, (1981).
- Keerthi, S. Sathiya, et al. "Improvements to Platt's SMO algorithm for SVM classifier design." Neural computation 13.3 (2001): 637-649.
- 左琳. "序列最小優化工作集選擇演算法的改進." 電子科技大學學報 42.3 (2013): 448-451.