拉格朗日乘子法 - KKT條件 - 對偶問題
支持向量機 (一): 線性可分類 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\) 將兩類樣本分隔開,這樣可以得到:
對於任意的 \(\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\) ,即:
這樣 \((1.1)\) 式就轉化為
上一節提到我們希望間隔最大化,那么間隔該如何表示? 樣本空間任意點 \(\boldsymbol{x}\) 到超平面的距離為 \(dist = \frac{|\boldsymbol{w}^\top\boldsymbol{x} + b|}{||\boldsymbol{w}||}\) (證明見附錄),間隔為距離超平面 \(\boldsymbol{w}^{\top} \boldsymbol{x}+b = 0\) 最近的樣本到超平面距離的兩倍,即:
這樣線性 svm 的優化目標即為:
這是一個凸二次規划(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)\) 式的拉格朗日函數為:
其相應的對偶問題為:
上式內層對 \((\boldsymbol{w}, b)\) 的優化屬於無約束優化問題,則令偏導等於零:
代入 \((2.2)\) 式得:
此依然屬於二次規划問題,求出 \(\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}\):
其中 \(SV\) 代表所有支持向量的集合。對於任意支持向量 \((\boldsymbol{x}_s, y_s)\),都有 \(y_s(\boldsymbol{w}^\top \boldsymbol{x}_s + b) = 1\) 。將 \((2.5)\) 式代入,並利用 \(y_s^2 = 1\) :
實踐中,為了得到對 \(b\) 更穩健的估計,通常對所有支持向量求解得到 \(b\) 的平均值:
於是線性 svm 的假設函數可表示為:
附錄: 點到超平面的距離

如上圖所示,想要求 \(\boldsymbol{x}\) 到超平面 \(\boldsymbol{w}^\top\boldsymbol{x} + b = 0\) 的距離 \(d\) 。設 \(\boldsymbol{x}_0\) 和 \(\boldsymbol{x}_1\) 是超平面上的兩個點,則:
即 \(\boldsymbol{w}\) 垂直於超平面。
證明1:
證明2: 由於 \(\frac{\boldsymbol{w}}{||\boldsymbol{w}||}\) 為單位向量:
/