機器學習演算法 II : support vector machine (SVM)
第一節:導論
Support vector machine 最早是用來處理線性可分問題的。假設我們有一組數據 . 其中,矢量 是一組feature,標量 為該矢量所對應的label. 規定label的取值只能是 -1 或者 1. 對於線性可分問題,我們可以在由矢量 張成的空間中畫出所有的數據點,並且可以找到一個超平面,使得該超平面將這組數據點分為兩類。超平面一側的所有點的label都是 -1,另外一側所有點的label都是1. 如下圖所示。
圖片中是二維情形下的support vector machine的示意圖。這裡每一個數據點都有一個label。這些數據點可以用一條直線分離為兩類。一類點label 都是1,另外一類點label都是 -1. 很明顯,不止一條線可以將這組數據點分為兩類。Support vector machine演算法的目的是找出一條最優的分離線。最優分離線(或者對應高維情況下的最優分離面)的定義在下一節。
第二節:最優分離面的定義
把數據點記作 . 假設分離平面為 . 位於平面一側的點滿足關係 ,另一側的點滿足關係 . 通過合適的scaling,我們總是可以令所有 label 為 1 的點滿足關係 ,所有 label 為 -1 的點滿足關係 . 總是存在一組參數 ,使得平面 與 之間的距離最大。定義此時的分離平面 為最優分離面。接下來我們要計算平面 與 之間的距離。
已知一點 到線性集合 的距離的平方為 . 如果已知點 位於平面 上,也就是該點滿足 . 那麼該點距離平面 的距離為
. 所以最優分離面的計算可以歸結為下面的優化問題:
這個問題並不容易求解。為了求解這個問題,我們需要引入拉格朗日對偶關係。
第三節:拉格朗日對偶
上一節已經證明了,最優分離面的求解可以歸結為計算一個受限約束條件下的極小值問題。這類問題可以通過拉格朗日乘子法來解決。定義拉格朗日函數為
為了計算拉格朗日函數的極小值,根據 KKT 條件(關於KKT條件,這裡有一篇文章,給出了非常好的推導: 淺談最優化問題的KKT條件),求該函數對變數 的梯度,令梯度為零,得到
此外,根據 KKT 條件,我們有
由此,我們可以得到拉格朗日對偶函數為
利用拉格朗日對偶關係,原來的極小化問題可以轉化為一個極大化問題:
相比原問題,這個問題更容易求解。下一節將會給出求解該類問題的一個演算法。
第四節:內點法求解拉格朗日對偶問題
上一節已經將計算最優分離面問題轉化為它的拉格朗日對偶問題,該問題可以重新寫作一種等價形式為:
為了求解這個問題,我們可以用內點法(interior point method)。在這裡我已經描述過內點法在線性規劃問題中的應用:凸優化演算法 I: 內點法(interior point method)求解線性規劃問題
同樣可以使用內點法求解現在的拉格朗日對偶問題。為此,定義函數:
定義對稱矩陣 . 這個矩陣可以進一步寫作 , 其中 . 因為通常情況下點的個數遠大於矢量 的維數,所以矩陣 為不可逆矩陣。利用這個記號,函數 可以寫作
對於固定的參數 ,我要計算使得該函數取得極值時變數 的值. 一旦知道了 的值,我們就可以通過 求出最優分離面的法向量 的值,並且進一步求出截距. 注意, 為長度為 的矢量, 為一個標量。
對變數 求微分,得到
令微分等零,得到一個方程組
可以用牛頓迭代法求解該方程,牛頓迭代公式為
這裡,Hessian矩陣 為
其中,矩陣 .
通過牛頓迭代,可以求出對應固定參數 時方程的解 .根據內點法的定義,我們有 . 通過淬火演算法,我們可以得到符合精度的解。
第五節:程序
我已經寫了一個Python程序來實現這個演算法。程序地址為:
https://github.com/PrimerLi/svm第六節:結果
對於一組可以線性分離的點,通過上一節的程序可以解得最優分離面。如下圖所示:
第七節:附錄I
在這裡,我將要推導如何計算空間中一點到一個線性集合的距離。這個公式在推導兩個平面之間的距離時起了關鍵性作用。
定義一個線性集合為 . 其中 為一個矩陣, 為一個矢量。超平面可以理解為一個特殊的線性集合。空間中一點 到集合 的距離定義為:
.
為了求解距離的表達式,我們可以藉助凸優化演算法。首先,將問題重新表述為
定義拉格朗日函數為
求梯度:
令梯度為零,得到 . 拉格朗日對偶函數為
令梯度為零,求得 . 這裡,因為線性集合的定義中,約束條件的個數小於變數的個數,所以矩陣 可逆,並且該矩陣為正定矩陣。將 代入 ,得到
所以,空間中一點到線性集合的距離為
對於一張平面 ,空間中一點 到該平面的距離為
很容易看出來,兩張平面 之間的距離為
第八節:附錄II
上面的全都是hard margin SVM的演算法。所謂hard margin,指的是該分類方法不允許出現任何不可分的點。實際情況下,兩類點未必是嚴格可分的,而且就算兩類點是嚴格可分的,我們有時也希望對margin做一些鬆動,以錯分一些點為代價換取一個更寬的margin. 這時就需要用到soft margin SVM. 該演算法與hard margin SVM 演算法唯一的區別是拉格朗日對偶問題中限制條件變成了 , 也就是我們的目標函數變為
當 時, ,此時點落在上下兩個邊界之外; 時, ,此時點落在上下兩個邊界之間 ; 時, ,此時點在落在上下兩條邊界上。
這個受限優化問題仍然可以使用內點法求解. 構造輔助函數:
為了簡化,可以令 , 於是輔助函數簡化為
該函數的梯度為
Hessian矩陣元素為
矩陣形式為
當 時,Hessian矩陣退化為hard margin SVM的形式。
只需對原來的 SVM 程序稍作修改就可以實現soft margin SVM. 程序地址為:
https://github.com/PrimerLi/svm/blob/master/soft_margin_svm.py結果如圖所示:
如果點嚴格可分,那麼我們仍然可以得到與SVM 相同的結果;如果有不可分的點,那麼 soft margin SVM 仍然可以給出一個比較好的結果,而hard margin SVM在這時就得不到任何結果了。
推薦閱讀:
※機器學習-決策樹 Decision Tree
※Coursera Machine Learning疑惑與解答-第0篇-Week2 Assignments
※10分鐘圖解論文直覺(開題)
※【深度學習系列】卷積神經網路CNN原理詳解(一)——基本原理
※pytorch中如何處理RNN輸入變長序列padding