本文提出了一種用於訓練支持向量機的新算法:序列最小優化算法(SMO)。訓練支持向量機須要解決很是大的二次規劃(QP)優化問題。SMO 將這個大的 QP 問題分解爲一系列最小的 QP 問題。這些小的 QP 問題能夠經過解析來解決,從而避免了將耗時的數值 QP 優化用做內部循環。SMO 所需的內存量與訓練集大小成線性關係,這使 SMO 能夠處理很是大的訓練集。因爲避免了矩陣計算,所以對於各類測試問題,SMO 隨訓練集大小在線性和二次方之間縮放,而標準分塊 SVM 算法隨訓練集大小在線性和三次方之間縮放。SMO 的計算時間主要由 SVM 評估決定,所以 SMO 對於線性 SVM 和稀疏數據集最快。在現實世界的稀疏數據集上,SMO 的速度能夠比分塊算法快 1000 倍以上。web
在過去的幾年中,學界對支持向量機(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 條件。spa
更重要的是,全部這些方法都須要數值 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 計算時間的主導地位。
S.S. Keerthi 等人[6]指出,因爲 SMO 的計算方式以及僅維護和更新一個閾值 \(β\) 的特色,在某些狀況下可能會進行沒必要要的第二個拉格朗日乘數的搜索,從而致使 SMO 的效率低下。
左琳[7]也指出,SMO 其實是在循環迭代上尋求快速算法。所以若是沒有一個好的選擇迭代策略,SMO 算法就存在盲目性,可能出現某些達到最優值的樣本卻不知足 KKT 條件的狀況,好比過分選擇的消耗,影響了算法的執行效率。