注:最近在工作中,高頻率的接觸到了SVM模型,而且還有使用SVM模型做回歸的情況,即SVR。另外考慮到自己從第一次知道這個模型到現在也差不多兩年時間了,從最開始的騰雲駕霧到現在有了一點直觀的認識,花費了不少時間。因此在這里做個總結,比較一下使用同一個模型做分類和回歸之間的差別,也紀念一下與SVM相遇的兩周年!這篇總結,不會涉及太多公式,只是希望通過可視化的方法對SVM有一個比較直觀的認識。
由於代碼比較多,沒有放到正文中,所有代碼都可以在github中:link
0. 支持向量機(support vector machine, SVM)
原始SVM算法是由弗拉基米爾·萬普尼克和亞歷克塞·澤范蘭傑斯於1963年發明的。1992年,Bernhard E. Boser、Isabelle M. Guyon和弗拉基米爾·萬普尼克提出了一種通過將核技巧應用於最大間隔超平面來創建非線性分類器的方法。當前標准的前身(軟間隔)由Corinna Cortes和Vapnik於1993年提出,並於1995年發表。
上個世紀90年代,由於人工神經網絡(RNN)的衰落,SVM在很長一段時間里都是當時的明星算法。被認為是一種理論優美且非常實用的機器學習算法。
在理論方面,SVM算法涉及到了非常多的概念:間隔(margin)、支持向量(support vector)、核函數(kernel)、對偶(duality)、凸優化等。有些概念理解起來比較困難,例如kernel trick和對偶問題。在應用方法,SVM除了可以當做有監督的分類和回歸模型來使用外,還可以用在無監督的聚類及異常檢測。相對於現在比較流行的深度學習(適用於解決大規模非線性問題),SVM非常擅長解決復雜的具有中小規模訓練集的非線性問題,甚至在特征多於訓練樣本時也能有非常好的表現(深度學習此時容易過擬合)。但是隨着樣本量$m$的增加,SVM模型的計算復雜度會呈$m^2$或$m^3$增加。
在下面的例子中,均使用上一篇博客中提到的鳶尾屬植物數據集。

圖1:Iris data set
1. SVM的前身:感知機(Perceptron)
感知機可以看做是低配版的線性SVM,從數學上可以證明:
在線性可分的兩類數據中,感知機可以在有限步驟中計算出一條直線(或超平面)將這兩類完全分開。
如果這兩類距離越近,所需的步驟就越多。此時,感知機只保證給出一個解,但是解不唯一,如下圖所示:

圖2:感知機訓練出來的3個不同的線性分類器
1.1 對二分類問題的具體描述
訓練樣本$x \in \mathbb{ R }^{n}$,標簽$y \in {-1, 1}$,對於線性分類器來說:
- 參數: $w \in \mathbb{ R }^n$ and $b \in \mathbb{ R }$
- 決策邊界(Decision boundary):$w \cdot x + b = 0$
- 對於一個新的點$x$做分類時,預測標簽為$sign(w \cdot x + b)$
參考上面的描述,在分類正確的情況下,如果一個點$x$的標簽為$y = 1$,預測值$w \cdot x + b > 0$,分類為1;標簽為-1,預測值小於0,分類為-1. 那么可以使用$y (w \cdot x + b) > 0 $來統一表示分類正確的情況,反之可以使用$y(w \cdot x + b) < 0$來表示分類錯誤的情況。
1.2 代價函數
在分類正確時,即$y (w \cdot x + b) > 0$,$loss = 0$;
在分類錯誤時,即$y (w \cdot x + b) \leq 0$,$loss = -y (w \cdot x + b)$.
1.3 算法的流程
利用隨機梯度下降的方式訓練模型,每次只使用一個樣本,根據代價函數的梯度更新參數,
step1: 初始化$w = 0, b = 0$;
step2: 循環從訓練集取樣本,每次一個
if $y (w \cdot x + b) \leq 0$(該樣本分類錯誤):
w = w + yx
b = b + y
從流程上來看,每次取出一個樣本點訓練模型,而且只在分錯的情況下更新參數,最終所有樣本都分類正確時,模型訓練過程結束。
2. SVM - 線性可分
在兩類樣本線性可分的情況下,感知機可以保證找到一個解,完全正確的區分這兩類樣本。但是解不唯一,而且這些決策邊界的質量也不相同,直觀上來看這條線兩邊的間隔越大越好。那么有沒有一種方法可以直接找到這個最優解呢?這就是線性SVM所做的事情。
從直觀上來看,約束條件越多對模型的限制也就越大,因此解的個數也就越少。感知機的解不唯一,那么給感知機的代價函數加上更強的約束條件好像就可以減少解的個數。事實上也是這樣的。
2.1 SVM的代價函數
在分類正確時,即$y (w \cdot x + b) > 1$,$loss = 0$;
在分類錯誤時,即$y (w \cdot x + b) \leq 1$,$loss = -y (w \cdot x + b)$.
比較一下可以發現,原來$w \cdot x + b$只需要大於0或小於0就可以了,但是現在需要大於1或小於1. 在這里為什么選擇1我還沒有很直觀的解釋,但是有一點非常重要:原來的決策邊界只是一條直線,現在則變成了一條有寬度的條帶。原來差異非常小的兩個點(例如$w \cdot x + b = 0$附近的兩個點)就可以被分成不同的兩類,但是現在至少要相差$\frac{2}{||w||}$才可以,如下圖所示。

圖3:設樣本屬於兩個類,用該樣本訓練SVM得到的最大間隔超平面。在超平面上的樣本點也稱為支持向量。
2.2 決策邊界以及間隔
圖3來自wiki,為了統一起見,下面還是將決策邊界定義為$w \cdot x + b = 0$,兩邊的邊界(兩條虛線)分別為$w \cdot x + b = 1$和$w \cdot x + b = 1$,此時只是b的符號不同其他性質都相同. 其中$w, b$就是模型訓練時需要優化的參數。由上面的示意圖可以得到以下信息:
- 兩條虛線之間的距離為$\frac{2}{||w||}$;
- 待優化參數$w$的方向就是決策邊界的法向量方向($w$與決策邊界垂直);
- 此時邊界上一共有3個點,這三個點也就是此時的支持向量。
下面是計算兩條虛線之間距離的過程:
將決策邊界的向量表示$w·x + b = 0$展開后可以得到,$w1*x1 + w2*x2 + b = 0$.
轉化成截距式可以得到,$x2 = - w1/w2 * x1 - b/w2$,因此其斜率為$-w1/w2$, 截距為$-b/w2$
直線的方向向量為,$(1, -w1/w2)$(可以取x=1, b=0時,得到y的值)
直線的法向量為$w = (w1, w2)$
因此,對於直線$w \cdot x + b = 1$來說,截距式為$x2 = - w1/w2 * x1 + (1 - b)/w2$,相當於沿着$x2$軸向上平移了$\frac{1}{w_2}$,計算可得該直線與$w \cdot x + b = 0$沿法向量方向的距離為$\gamma = \sqrt{\frac{1}{w_1^2 + w_2^2}} = \frac{1}{||w||}$,參考圖4.

圖4:margin的寬度$\gamma$
2.3 優化目標
在SVM中,優化的目標就是最大化margin的寬度$\gamma$,因為$\gamma = \frac{1}{||w||}$,其中$||w||$是待優化參數$w$的模長。因此優化目標等價於最小化$||w||$,可以表示為為:
對於$(x^{(1)}, y^{(1)}), \ ..., \ (x^{(m)}, y^{(m)}) \in \mathbb{R^d} \times \{-1, 1\}$,$\min_{w \in \mathbb{R}^d, b \in \mathbb{R}}||w||^2$
s.t. $y^{(i)}(w \cdot x^{(i)} + b) ≥ 1$對於所有的$i = 1, 2, ..., m$成立
下面是分別使用感知機和SVM對鳶尾屬數據集中setosa這一類和非setosa進行分類的效果比較:

圖5:感知機線性分類器

圖6:線性SVM的分類效果
比較圖5和圖6可以看到,SVM確定的決策邊界周圍的margin更大一些,因此對更多未知的樣本進行分類時,在邊界上的一些點可以得到更准確的分類結果。
3. SVM - 線性不可分
在圖1中可以看到,setosa這一類與其他兩類是線性可分的,但是virginica這一類與與之相鄰的versicolor有一些點是重合的,也就是說是線性不可分的。此時仍然可以使用SVM來進行分類,原理是在代價函數中加入了一個松弛變量(slack) $\xi$,
對於$(x^{(1)}, y^{(1)}), \ ..., \ (x^{(m)}, y^{(m)}) \in \mathbb{R^d} \times \{-1, 1\}$,$\min_{w \in \mathbb{R}^d, b \in \mathbb{R}}||w||^2 + C\sum_{i=1}^{m}{\xi^i} $
s.t. $y^{(i)}(w \cdot x^{(i)} + b) ≥ 1 - \xi_i$對於所有的$i = 1, 2, ..., m$成立
上面的優化目標加入松弛變量后,就可以允許一定程度的違反兩邊的邊界(由上式中的C來控制),允許一定的錯誤分類,從而將兩類原來線性不可分的兩類數據分開。
下面是$C=1000$時,對virginica和非virginica的分類效果:

圖8:加入松弛變量后的SVM分類效果
C作為SVM模型的超參數之一,需要從一個較大的范圍中一步一步的篩選,直到找到最適合的C。C值越大,表示錯誤分類的代價越大,就越趨於拒絕錯誤分類,即hard margin;C值越小,表示錯誤分類的代價越小,就越能容忍錯誤分類,即soft margin。即使是在線性可分的情況下,如果C設置的非常小,也可能導致錯誤分類的出現;在線性不可分的情況下,設置過大的C值會導致訓練無法收斂。
4. SVR - 利用SVM做回歸分析
支持向量回歸模型(Support Vector Regression, SVR)是使用SVM來擬合曲線,做回歸分析。分類和回歸問題是有監督機器學習中最重要的兩類任務。與分類的輸出是有限個離散的值(例如上面的$\{-1, 1\}$)不同的是,回歸模型的輸出在一定范圍內是連續的。下面不再考慮不同鳶尾花的類型,而是使用花瓣的長度(相當於自變量x)來預測花瓣的寬度(相當於因變量y)。
下圖中從所有150個樣本中,隨機取出了80%作為訓練集:

圖9:訓練SVR模型的訓練樣本
下面是使用線性SVR訓練出來的回歸線:

圖10:SVR模型訓練出來的回歸線
與SVM是使用一個條帶來進行分類一樣,SVR也是使用一個條帶來擬合數據。這個條帶的寬度可以自己設置,利用參數$\epsilon$來控制:

圖11:SVR模型回歸效果示意圖,其中帶紅色環的點表示支持向量
在SVM模型中邊界上的點以及兩條邊界內部違反margin的點被當做支持向量,並且在后續的預測中起作用;在SVR模型中邊界上的點以及兩條邊界以外的點被當做支持向量,在預測中起作用。按照對偶形式的表示,最終的模型是所有訓練樣本的線性組合,其他不是支持向量的點的權重為0. 下面補充SVR模型的代價函數的圖形:

圖12:soft margin SVR的代價函數
從圖12中可以看到,在margin內部的這些點的error都為0,只有超出了margin的點才會計算error。因此SVR的任務就是利用一條固定寬度的條帶(寬度由參數$\epsilon$來控制)覆蓋盡可能多的樣本點,從而使得總誤差盡可能的小。
Reference
https://zh.wikipedia.org/wiki/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA
https://zhuanlan.zhihu.com/p/26263309, 直線方程的各種形式
https://github.com/ageron/handson-ml/blob/master/05_support_vector_machines.ipynb
http://www.svms.org/regression/SmSc98.pdf
http://www.robots.ox.ac.uk/~az/lectures/ml/
edx: UCSanDiegoX - DSE220x Machine Learning Fundamentals
https://github.com/OnlyBelter/jupyter-note/blob/master/machine_learning/SVM/04_how%20SVM%20becomes%20to%20SVR.ipynb, 文中代碼
