1. 程式人生 > >支援向量機 (一): 線性可分類 svm

支援向量機 (一): 線性可分類 svm

支援向量機(support vector machine, 以下簡稱 svm)是機器學習裡的重要方法,特別適用於中小型樣本、非線性、高維的分類和迴歸問題。本系列力圖展現 svm 的核心思想和完整推導過程,以饗讀者。



一、原理概述

機器學習的一大任務就是分類(Classification)。如下圖所示,假設一個二分類問題,給定一個數據集,裡面所有的資料都事先被標記為兩類,能很容易找到一個超平面(hyperplane)將其完美分類。


然而實際上可以找到無數個超平面將這兩類分開,那麼哪一個超平面是效果最好的呢?


要回答這個問題,首先就要定義什麼叫做“效果好”?在面臨機器學習問題的時候普遍不是很關心訓練資料的分類正確與否,而是關心一個新資料出現時其能否被模型正確分類。如果新資料被分類的準確率高,可以認為是“效果好”,或者說有較好的泛化能力。因此這裡的問題就轉化為:上圖中哪一個超平面對新資料的分類準確率最高?

然而令人沮喪的是,沒人能確切地回答哪個超平面最好,因為沒人能把真實世界中的所有資料都拿過來測試。從廣義上來說,大部分的理論研究都是對真實情況的模擬,譬如我們用人均收入來衡量一個國家的人民生活水平,這裡的人均收入甚至只是一個不太接近的近似,因為不可能把每個國家中所有人的收入都拿出來一一比較。我們的大腦善於把繁瑣的細節組合起來並高度抽象化,形成模型和假設,來逼近真實情況。

所以,在這個問題上我們能做的,也只有提出假設,建立模型,驗證假設。而在 svm 中,這個假設就是:擁有最大“間隔”的超平面效果最好。

間隔(margin)指的是所有資料點中到這個超平面的最小距離。如下圖所示,實線為超平面,虛線為間隔邊界,黑色箭頭為間隔,即虛線上的點到超平面的距離。可以看出,虛線上的三個點(2藍1紅)到超平面的距離都是一樣的,實際上只有這三個點共同決定了超平面的位置,因而它們被稱為“支援向量(support vectors)”,而“支援向量機”也由此而得名。



於是我們來到了svm的核心思想 —— 尋找一個超平面,使其到資料點的間隔最大。原因主要是這樣的超平面分類結果較為穩健(robust),對於最難分的資料點(即離超平面最近的點)也能有足夠大的確信度將它們分開,因而泛化到新資料點效果較好。

比如上左圖的紅線和紫線雖然能將兩類資料完美分類,但注意到這兩個超平面本身非常靠近資料點。以紫線為例,圓點為測試資料,其正確分類為藍色,但因為超平面到資料點的間隔太近,以至於被錯分成了黃色。 而上右圖中因為間隔較大,圓點即使比所有藍點更靠近超平面,最終也能被正確分類。





二、間隔最大化與優化問題(線性可分類svm)


給定一組資料 \(\left\{\left(\boldsymbol{x}_{1}, y_{1}\right),\left(\boldsymbol{x}_{2}, y_{2}\right), \ldots,\left(\boldsymbol{x}_{m}, y_{m}\right)\right\}\), 其中 \(\boldsymbol{x}_i \in \mathbb{R}^d\), \(y_i \in \{-1, +1\}\) 。如果兩類樣本線性可分,即存在一個超平面 \(\boldsymbol{w}^{\top} \boldsymbol{x}+b = 0\) 將兩類樣本分隔開,這樣可以得到:

\[ y_{i} \operatorname{sign}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right)=1 \iff y_{i}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right)>0 \tag{1.1} \]
對於任意的 \(\zeta > 0\) ,\((1.1)\) 式等價於 \(y_{i}\left(\zeta\, \boldsymbol{w}^{\top} \boldsymbol{x}_{i}+\zeta\, b\right)>0\) ,則說明 \((\boldsymbol{w}, b)\) 具有放縮不變性,為了後面優化方便,令 \(\min |\boldsymbol{w^\top x} + b| = 1\) ,即:
\[ \begin{cases} \boldsymbol{w}^{\top}\boldsymbol{x}_i + b \geqslant +1, \quad \text{if} \;\; {y}_i = +1 \\ \boldsymbol{w}^{\top}\boldsymbol{x}_i + b \leqslant -1, \quad \text{if} \;\;y_i = -1 \\ \end{cases} \]
這樣 \((1.1)\) 式就轉化為
\[ y_{i}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right) \geq 1 \tag{1.2} \]


上一節提到我們希望間隔最大化,那麼間隔該如何表示? 樣本空間任意點 \(\boldsymbol{x}\) 到超平面的距離為 \(dist = \frac{|\boldsymbol{w}^\top\boldsymbol{x} + b|}{||\boldsymbol{w}||}\) (證明見附錄),間隔為距離超平面 \(\boldsymbol{w}^{\top} \boldsymbol{x}+b = 0\) 最近的樣本到超平面距離的兩倍,即:
\[ \gamma = 2 \min \frac{|\boldsymbol{w}^\top\boldsymbol{x} + b|}{||\boldsymbol{w}||} = \frac{2}{||\boldsymbol{w}||} \]
這樣線性 svm 的優化目標即為:
\[ \begin{aligned} {\max_{\boldsymbol{w}, b}} & \;\;\frac{2}{||\boldsymbol{w}||} \implies \min\limits_{\boldsymbol{w}, b}\frac12 ||\boldsymbol{w}||^2 \\[1ex] {\text { s.t. }} & \;\;y_{i}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right) \geq 1 , \quad i=1,2, \ldots, m \end{aligned} \tag{1.3} \]
這是一個凸二次規劃(convex quadratic programming)問題,可以用現成的軟體包計算。該問題有 \(d + 1\) 個變數 (\(d\) 為 \(\boldsymbol{x}_i\) 的維度) 和 \(m\) 個約束,如果 \(d\) 很大,則求解困難。所以現實中一般採用對偶演算法(dual algorithm),通過求解原始問題(primal problem)的對偶問題(dual problem),來獲得原始問題的最優解。這樣做的優點,一是對偶問題往往更容易求解,二是能自然地引入核函式,進而高效地解決高維非線性分類問題。





三、拉格朗日對偶性

原始的優化問題 \((1.3)\) 式與對偶問題的轉換關係如下,裡面的一些具體原理可參閱前文 (拉格朗日乘子法 - KKT條件 - 對偶問題) :
\[ 不等式約束優化問題 \;\;\overset{\normalsize 拉格朗日乘子法}{\iff} \;\; 無約束優化問題\;\; \overset{對偶性}{\iff} \;\;對偶問題 \]


由拉格朗日乘子法,注意這裡有 \(m\) 個樣本,於是為每條約束引入拉格朗日乘子 \(\alpha_i \geqslant 0\) ,\((1.3)\) 式的拉格朗日函式為:
\[ \mathcal{L}(\boldsymbol{w}, b, \boldsymbol{\alpha}) =\frac{1}{2} ||\boldsymbol{w}||^2+\sum_{i=1}^{m} \alpha_{i}\left(1-y_{i}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right)\right) \tag{2.1} \]
其相應的對偶問題為:
\[ \begin{align*} \max _{\boldsymbol{\alpha}}\min _{\boldsymbol{w}, b} & \;\; \frac{1}{2} ||\boldsymbol{w}||^2+\sum_{i=1}^{m} \alpha_{i}\left(1-y_{i}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right)\right) \\ \text{s.t.} & \;\; \alpha_i \geqslant 0, \quad i=1,2, \ldots, m \end{align*} \tag{2.2} \]


上式內層對 \((\boldsymbol{w}, b)\) 的優化屬於無約束優化問題,則令偏導等於零:
\[ \begin{align*} \frac{\partial \mathcal{L}}{\partial \boldsymbol{w}}=\mathbf{0} & \implies \boldsymbol{w}=\sum_{i=1}^{m} \alpha_{i} y_{i} \boldsymbol{x}_{i} \\ \frac{\partial \mathcal{L}}{\partial b}=0 & \implies \sum_{i=1}^{m} \alpha_{i} y_{i}=0 \\ \end{align*} \]
代入 \((2.2)\) 式得:
\[ \begin{align*} \max_{\boldsymbol{\alpha}} \quad& \sum\limits_{i=1}^m \alpha_i - \frac12 \sum\limits_{i=1}^m\sum\limits_{j=1}^m\alpha_i\alpha_j y_i y_j \boldsymbol{x}_i \boldsymbol{x}_j \\[1ex] \text{s.t.} \quad & \alpha_i \geqslant 0, \quad i=1,2, \ldots, m \\[1ex] & \sum\limits_{i=1}^m \alpha_i y_i = 0 \end{align*} \tag{2.3} \]
此依然屬於二次規劃問題,求出 \(\boldsymbol{\alpha}\) 後,即可得原始問題的引數 \((\boldsymbol{w}, b)\) 。該二次規劃問題有 \(m\) 個變數, \((m + 1)\)項約束,因而適用於 \(d\) 很大,\(m\) 適中 ( \(d >> m\) ) 的情況。而當 \(m\) 很大時,問題變得不可解,這時候可使用 SMO 這類專為 svm 設計的優化演算法,後文詳述。 另外上文也提到 \((1.3)\) 式的原始二次規劃問題適用於 \(d\) 比較小的低維資料,所以 scikit-learn 中的 LinearSVC 有 dual : bool, (default=True) 這個選項,當樣本數 > 特徵數時,宜設為 False,選擇解原始優化問題,可見使用 svm 並不是非要轉化為對偶問題不可 。而相比之下 SVC 則沒有 dual 這個選項,因為 SVC 中實現了核函式,必須先轉化為對偶問題,後文再議。


前文已證明 \((2.2)\) 式的最優解應滿足 KKT 條件,由 KKT 條件中的互補鬆弛條件可知 \(\alpha_i (1 - y_i (\boldsymbol{w}^\top \boldsymbol{x}_i + b)) = 0\) 。當 \(\alpha_i > 0\) 時, \(y_i(\boldsymbol{w}^\top\boldsymbol{x}_i + b) = 1\) ,說明這些樣本點 \((\boldsymbol{x}_i, y_i)\) 一定在間隔邊界上,它們被稱為“支援向量”,這些點共同決定了分離超平面。這是 svm 的一個重要特性: 訓練完成後,大部分訓練樣本不需要保留,最終模型僅與支援向量有關。

於是可根據支援向量求 \(\boldsymbol{w}\):
\[ \begin{align*} \boldsymbol{w} &=\sum_{i=1}^{m} \alpha_{i} y_{i} \boldsymbol{x}_{i} \\ &=\sum_{i:\,\alpha_i=0}^{m} 0 \cdot y_{i} \boldsymbol{x}_{i}+\sum_{i : \,\alpha_{i}>0}^{m} \alpha_{i} y_{i} \boldsymbol{x}_{i} \\ &=\sum_{i \in S V} \alpha_{i} y_{i} \boldsymbol{x}_{i} \end{align*} \tag{2.5} \]
其中 \(SV\) 代表所有支援向量的集合。對於任意支援向量 \((\boldsymbol{x}_s, y_s)\),都有 \(y_s(\boldsymbol{w}^\top \boldsymbol{x}_s + b) = 1\) 。將 \((2.5)\) 式代入,並利用 \(y_s^2 = 1\) :
\[ y_s(\sum\limits_{i \in {SV}} \alpha_i y_i \boldsymbol{x}_i^\top\boldsymbol{x}_s + b) = y_s^2 \quad \implies b = y_s - \sum\limits_{i \in SV} \alpha_i y_i \boldsymbol{x}_i^\top\boldsymbol{x}_s \]
實踐中,為了得到對 \(b\) 更穩健的估計,通常對所有支援向量求解得到 \(b\) 的平均值:
\[ b = \frac{1}{|SV|} \sum\limits_{s \in SV} \left( y_s - \sum\limits_{i \in SV} \alpha_i y_i \boldsymbol{x}_i^\top\boldsymbol{x}_s \right) \]
於是線性 svm 的假設函式可表示為:
\[ f(\boldsymbol{x}) = \text{sign} \left(\sum\limits_{i \in SV} \alpha_i y_i \boldsymbol{x}_i^\top \boldsymbol{x} + b \right) \]








附錄: 點到超平面的距離

如上圖所示,想要求 \(\boldsymbol{x}\) 到超平面 \(\boldsymbol{w}^\top\boldsymbol{x} + b = 0\) 的距離 \(d\) 。設 \(\boldsymbol{x}_0\) 和 \(\boldsymbol{x}_1\) 是超平面上的兩個點,則:
\[ \begin{cases} \boldsymbol{w}^{\top}\boldsymbol{x}_0 + b = 0 \\[0.5ex] \boldsymbol{w}^{\top}\boldsymbol{x}_1 + b = 0 \end{cases} \quad \implies \quad \boldsymbol{w}^\top (\boldsymbol{x}_0 - \boldsymbol{x}_1) = 0 \]
即 \(\boldsymbol{w}​\) 垂直於超平面。

證明1:
\[ d = ||\boldsymbol{x} - \boldsymbol{x}_1|| \cos \theta = ||\boldsymbol{x} - \boldsymbol{x}_1|| \frac{|\boldsymbol{w}^\top(\boldsymbol{x} - \boldsymbol{x}_1)|}{||\boldsymbol{w}||\cdot||\boldsymbol{x} - \boldsymbol{x}_1||} = \frac{|\boldsymbol{w}^\top\boldsymbol{x} - \boldsymbol{w}^\top \boldsymbol{x}_1|}{||\boldsymbol{w}||} = \frac{|\boldsymbol{w}^\top\boldsymbol{x} + b|}{||\boldsymbol{w}||} \]
證明2: 由於 \(\frac{\boldsymbol{w}}{||\boldsymbol{w}||}\) 為單位向量:
\[ \boldsymbol{w}^\top\boldsymbol{x}_0 + b = \boldsymbol{w}^\top \left(\boldsymbol{x} - d\cdot \frac{\boldsymbol{w}} {||\boldsymbol{w}||} \right) + b = 0 \quad \implies \quad d = \frac{|\boldsymbol{w}^\top\boldsymbol{x} + b|}{||\boldsymbol{w}||} \]







<