支持向量機(support vector machine, 如下簡稱 svm)是機器學習裏的重要方法,特別適用於中小型樣本、非線性、高維的分類和迴歸問題。本系列力圖展示 svm 的核心思想和完整推導過程,以饗讀者。html
機器學習的一大任務就是分類(Classification)。以下圖所示,假設一個二分類問題,給定一個數據集,裏面全部的數據都事先被標記爲兩類,能很容易找到一個超平面(hyperplane)將其完美分類。
算法
然而實際上能夠找到無數個超平面將這兩類分開,那麼哪個超平面是效果最好的呢?
機器學習
要回答這個問題,首先就要定義什麼叫作「效果好」?在面臨機器學習問題的時候廣泛不是很關心訓練數據的分類正確與否,而是關心一個新數據出現時其可否被模型正確分類。若是新數據被分類的準確率高,能夠認爲是「效果好」,或者說有較好的泛化能力。所以這裏的問題就轉化爲:上圖中哪個超平面對新數據的分類準確率最高?函數
然而使人沮喪的是,沒人能確切地回答哪一個超平面最好,由於沒人能把真實世界中的全部數據都拿過來測試。從廣義上來講,大部分的理論研究都是對真實狀況的模擬,譬如咱們用人均收入來衡量一個國家的人民生活水平,這裏的人均收入甚至只是一個不太接近的近似,由於不可能把每一個國家中全部人的收入都拿出來一一比較。咱們的大腦善於把繁瑣的細節組合起來並高度抽象化,造成模型和假設,來逼近真實狀況。學習
因此,在這個問題上咱們能作的,也只有提出假設,創建模型,驗證假設。而在 svm 中,這個假設就是:擁有最大「間隔」的超平面效果最好。測試
間隔(margin)指的是全部數據點中到這個超平面的最小距離。以下圖所示,實線爲超平面,虛線爲間隔邊界,黑色箭頭爲間隔,即虛線上的點到超平面的距離。能夠看出,虛線上的三個點(2藍1紅)到超平面的距離都是同樣的,實際上只有這三個點共同決定了超平面的位置,於是它們被稱爲「支持向量(support vectors)」,而「支持向量機」也由此而得名。優化
因而咱們來到了svm的核心思想 —— 尋找一個超平面,使其到數據點的間隔最大。緣由主要是這樣的超平面分類結果較爲穩健(robust),對於最難分的數據點(即離超平面最近的點)也能有足夠大的確信度將它們分開,於是泛化到新數據點效果較好。spa
好比上左圖的紅線和紫線雖然能將兩類數據完美分類,但注意到這兩個超平面自己很是靠近數據點。以紫線爲例,圓點爲測試數據,其正確分類爲藍色,但由於超平面到數據點的間隔太近,以致於被錯分紅了黃色。 而上右圖中由於間隔較大,圓點即便比全部藍點更靠近超平面,最終也能被正確分類。設計
給定一組數據 \(\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} \]3d
上一節提到咱們但願間隔最大化,那麼間隔該如何表示? 樣本空間任意點 \(\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條件 - 對偶問題) :
由拉格朗日乘子法,注意這裏有 \(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}||} \]
/