支援向量機(Support Vector Machine,簡稱 SVM)於 1995 年正式發表,由於其在文字分類任務中的卓越效能,很快就成為機器學習的主流技術。儘管現在 Deep Learning 很流行,SVM 仍然是一種很有的機器學習演算法,在資料集小的情況下能比 Deep Learning 取得更好的結果。
本文將詳細介紹線性 SVM,非線性 SVM 涉及到的 kernel,本文中沒有介紹。我將從以下兩個方面展開介紹線性 SVM:
- 間隔和支援向量
- 對偶問題
1. 間隔和支援向量
給定一個訓練集 \(D= \{( \boldsymbol{x}_1, y_1), (\boldsymbol{x}_2, y_2),..., (\boldsymbol{x}_m, y_m)\}, y \in \{ -1, +1\}\),我們想要找一個超平面對其進行劃分,可以有多種選擇,如下圖所示:
憑直覺,我們會選擇最中間的那個超平面(也就是圖 1 中最粗的那條,注:在 2 維情況下,超平面就是一條直線),為什麼?因為更 robust,測試集中的點一般沒有在訓練集中出現過,這個時候難免會有些點會偏向分類的超平面,要是該分類超平面離訓練資料點近了,這些偏向超平面的資料點豈不是直接分錯了。這個時候最中間的那條線受到的影響最小,所以最優。
在樣本空間中,劃分超平面可以通過以下線性方程來描述:
\begin{equation}
\boldsymbol{w}^T \boldsymbol{x} + b = 0
\end{equation}
其中 \(\boldsymbol{w} = [w_1; w_2; ...; w_d]\)(注:\(\boldsymbol{w}\) 是列向量)為法向量,決定了超平面的方向;\(b\) 是位移,決定了超平面和原定之間的距離。知道 \(\boldsymbol{w}\) 和 \(b\),我們也就能確定該超平面的位置。樣本空間中任一點 \(\boldsymbol{x}\) 到超平面 \(\boldsymbol{w}^T \boldsymbol{x} + b = 0\) 的距離可以記為:
\begin{equation}
r = \frac{ |\boldsymbol{w}^T \boldsymbol{x} + b |}{ \Vert \boldsymbol{w} \Vert }
\end{equation}
假設超平面 \(\boldsymbol{w}^T \boldsymbol{x} + b = 0\) 能夠將訓練集 \(D\) 完全正確分類,即對於 \(D\) 中任一樣本 \(( \boldsymbol{x}_i, y_i)\),若 $y_i = +1 $,則 \(\boldsymbol{w}^T \boldsymbol{x}_i + b > 0\);若 $y_i = -1 $,則 \(\boldsymbol{w}^T \boldsymbol{x}_i + b < 0\)。我們再假設訓練集 \(D\) 的兩個類別中,離超平面最近的點到超平面的距離都是 \(r^*(r^* > 0 )\)(兩個類別離超平面最近的點到超平面的距離是一樣的,不然超平面就不在“最中間”,該超平面肯定不是最優的,可以對其平移滿足這個條件)。此時所有訓練集 \(D\) 中點都滿足以下方程:
\begin{equation}
\begin{cases}
\boldsymbol{w}^T \boldsymbol{x}_i + b \ge +r^*, & y_i = +1 \cr
\boldsymbol{w}^T \boldsymbol{x}_i + b \le -r^*, & y_i = -1
\end{cases}
\end{equation}
此時我們對公式(3)做一個變換,不等式兩邊都除以 \(r^*\) 可以得到:
\begin{equation}
\begin{cases}
\frac{ \boldsymbol{w} ^T}{r^*} \boldsymbol{x}_i + \frac{b}{r^*} \ge +1, & y_i = +1 \cr
\frac{ \boldsymbol{w} ^T}{r^*} \boldsymbol{x}_i + \frac{b}{r^*} \le -1, & y_i = -1
\end{cases}
\end{equation}
對於公式(4)中的 \(\frac{ \boldsymbol{w} ^T}{r^*}\) 和 \(\frac{b}{r^*}\),我們令其分別為新的 \(\boldsymbol{w}^T\) 和 \(b\),這樣做只是對原超平面 \(\boldsymbol{w}^T \boldsymbol{x} + b = 0\) 的法向量和位移項進行了縮放,實際上並沒有改變超平面的位置。(對位移項和法向量同時進行縮放,不會改變原點到超平面的距離,可以代入公式(2)進行檢驗。同樣地,該變換也不會改變樣本點和分類超平面之間的距離。)故而,公式(4)可以寫成如下最常見的形式:
\begin{equation}
\begin{cases}
\boldsymbol{w}^T \boldsymbol{x}_i + b \ge +1, & y_i = +1 \cr
\boldsymbol{w}^T \boldsymbol{x}_i + b \le -1, & y_i = -1
\end{cases}
\end{equation}
如圖 2 所示,距離超平面最近的這幾個訓練樣本點使式(5)的等號成立,它們被稱為“支援向量”(support vector),兩個類別的支援向量到超平面的距離之和為:
\begin{equation}
\gamma = \frac{2}{\Vert \boldsymbol{w} \Vert}
\end{equation}
其中,\(\gamma\) 被稱為“間隔”(margin)。
式(5)中兩個不等式可以合成一個統一的形式,如下所示:(這也是為什麼類別 \(y_i\) 的取值為 -1 和 1 的原因,方便將兩個不等式統一形式)
\[
\quad y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) \ge 1, \quad i = 1,2,...m.
\]
欲找到具有“最大間隔”(maximum margin)的劃分超平面,也就是要找到能滿足式(5)中約束的引數 \(\boldsymbol{w}^T\) 和 \(b\),使得 \(\gamma\) 最大,即
\begin{equation}
\begin{split}
& \max_{\boldsymbol{w}, b} \frac{2}{\Vert \boldsymbol{w} \Vert } \quad \
& s.t. \quad y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) \ge 1, \quad i = 1,2,...m.
\end{split}
\end{equation}
為了最大化間隔,只需要式(7)中分母最小即可,即最小化 \(\Vert \boldsymbol{w} \Vert\),等價於最小化 \(\Vert \boldsymbol{w} \Vert^2\),式(7)可重新寫為:
\begin{equation}
\begin{split}
& \min_{\boldsymbol{w}, b} \frac{1}{2}\Vert \boldsymbol{w} \Vert^2 \quad \
& s.t. \quad y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) \ge 1, \quad i = 1,2,...m.
\end{split}
\end{equation}
式(8)就是支援向量機想要優化的目標函式。
2. 對偶問題
我們希望求解式(8)來得到最大間隔劃分超平面所對應的模型:
\begin{equation}
f(\boldsymbol{x} ) = \boldsymbol{w}^T \boldsymbol{x} + b
\end{equation}
其中 \(\boldsymbol{w}^T\) 和 \(b\) 是模型引數,式(8)本身是一個凸二次規劃(convex quadratic programming)問題,能直接用現成的優化計算包求解,但我們可以有更高效的辦法,即使用拉格朗日乘子法求其“對偶問題”(dual problem)。下面我們先來了解最優化問題可以分為哪幾類,什麼是拉格朗日乘子法,什麼又是對偶問題。
2.1 最優化問題分類
通常,我們需要求解的最優化問題有如下幾類:(注:2.1 小節的 \(f(\boldsymbol{x})\) 和公式(9)沒有關係)
(i)無約束優化問題:
\[
\min_{\boldsymbol{x}} f(\boldsymbol{x})
\]
(ii)有等式約束的優化問題:
\[
\begin{split}
& \min_{\boldsymbol{x}} f(\boldsymbol{x}) \\
s.t. \quad & h_i(\boldsymbol{x}) = 0, \quad i = 1,2,\dots,n.
\end{split}
\]
(iii)有不等於約束的優化問題:
\[
\begin{split}
& \min_{\boldsymbol{x}} f(\boldsymbol{x}) \\
s.t. \quad & h_i(\boldsymbol{x}) = 0, \quad i = 1,2,\dots,n; \\
& g_j(\boldsymbol{x}) \le 0, \quad j = 1,2,\dots, m.
\end{split}
\]
對於第(i)類的優化問題,嘗試使用的方法就是費馬大定理(Fermat),即使用求取函式 $ f(\boldsymbol{x}) $ 的導數,然後令其為零,可以求得候選最優值,再在這些候選值中驗證;如果是凸函式,可以保證是最優解。這也就是我們高中經常使用的求函式的極值的方法。
對於第(ii)類的優化問題,常常使用的方法就是拉格朗日乘子法(Lagrange Multiplier) ,即把等式約束 $ h_i(\boldsymbol{x}) = 0$ 用一個係數與 $ f(\boldsymbol{x}) $ 寫為一個式子,稱為拉格朗日函式,而係數稱為拉格朗日乘子。通過拉格朗日函式對各個變數求導,令其為零,可以求得候選值集合,然後驗證求得最優值。
對於第(iii)類的優化問題,常常使用的方法就是KKT條件。同樣地,我們把所有的等式、不等式約束與 $ f(\boldsymbol{x}) $ 寫為一個式子,也叫拉格朗日函式,係數也稱拉格朗日乘子,通過一些條件,可以求出最優值的必要條件,這個條件稱為KKT條件。(注:若事件 B 是事件 A 的必要條件,則從事件 A 可以推出事件 B)
SVM 的優化問題屬於第(iii)類。
2.2 拉格朗日乘子法
拉格朗日乘子法(Lagrange multipliers)是一種尋找多元函式在一組約束下的極值的方法。通過引入拉格朗日乘子,可以將有 \(d\) 個變數和 \(k\) 個約束條件的最優化問題轉化為具有 \(d+k\) 個變數的無約束優化問題求解。
為什麼需要拉格朗日乘子法?當然是因為無約束的問題比有約束的問題更好求解。
“我們知道我們要求解的是最小化問題,所以一個直觀的想法是如果我能夠構造一個函式,使得該函式在可行解區域內與原目標函式完全一致,而在可行解區域外的數值非常大,甚至是無窮大,那麼這個沒有約束條件的新目標函式的優化問題就與原來有約束條件的原始目標函式的優化問題是等價的問題。這就是使用拉格朗日方程的目的,它將約束條件放到目標函式中,從而將有約束優化問題轉換為無約束優化問題。”
隨後,人們又發現,使用拉格朗日獲得的函式,使用求導的方法求解依然困難。進而,需要對問題再進行一次轉換,即使用一個數學技巧:拉格朗日對偶。
所以,在拉格朗日優化的問題上,我們需要進行下面二個步驟:
- 將有約束的原始目標函式轉換為無約束的新構造的拉格朗日目標函式
- 使用拉格朗日對偶性,將不易求解的優化問題轉化為易求解的優化
下面首先將有約束的 SVM 目標函式式(8)轉化為無約束的拉格朗日函式:
式(8)中只有不等式約束 \(g_i(w, b) \le 0\) (即 \(1 - y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) \le 0, \quad i = 1,2,...m.\)),所以這裡不考慮等式約束的情況。式(8)轉化的無約束的拉格朗日函式如下所示:
\begin{equation}
L(\boldsymbol{w}, b, \boldsymbol{\alpha} ) = \frac{1}{2}\Vert \boldsymbol{w} \Vert^2 +\sum_{i = 1}^{m} \alpha_i (1 - y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) )
\end{equation}
其中 \(\boldsymbol{\alpha} = [\alpha_1, \alpha_2, ..., \alpha_m]^T\) 為拉格朗日乘子,且 \(\alpha_i \ge 0, i = 1,2,..., m\)。然後,我們令
\begin{equation}
\theta(\boldsymbol{w}) = \max_{\alpha_i \ge 0} L(\boldsymbol{w}, b, \boldsymbol{\alpha} )
\end{equation}
當樣本點不滿足約束條件時,即在可行解區域外:
\begin{equation}
y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) < 1
\end{equation}
此時我們將 \(\alpha_i\) 設定為正無窮,此時 $\theta(\boldsymbol{w}) $ 顯然也是正無窮。
當樣本點滿足約束條件時,即在可行解區域內:
\begin{equation}
y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) \ge 1
\end{equation}
此時,\(\alpha_i (1 - y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) ) \le 0\),想要最大化 $\theta(\boldsymbol{w}) $,這一項為 0 即可,即此時 $\theta(\boldsymbol{w}) = \frac{1}{2}\Vert \boldsymbol{w} \Vert^2 $。所以 $\theta(\boldsymbol{w}) $ 可以寫成如下形式:
\begin{equation}
\theta(\boldsymbol{w}) =
\begin{cases}
\frac{1}{2}\Vert \boldsymbol{w} \Vert^2, & \boldsymbol{x}_i \in 可行域; \cr
+\infty, & \boldsymbol{x}_i \in 不可行域, \quad i = 1,2,...m.
\end{cases}
\end{equation}
自此,我們建立了一個在可行域內和原目標函式相同,在可行域外函式值趨近無窮大的新函式。
現在我們的問題變成了求新函式的最小值:
\begin{equation}
\min_{\boldsymbol{w}, b} \theta(\boldsymbol{w}) =\min_{\boldsymbol{w}, b} \max_{\alpha_i \ge 0} L(\boldsymbol{w}, b, \boldsymbol{\alpha} ) = p^*
\end{equation}
這裡的 \(p^*\) 表示這個問題的最優值,和原目標函式的最優值是一樣的。
2.3 拉格朗日對偶
在式(15)中,我們先求最大值,再求最小值,在求最大值面臨的是含有未知引數 \(\boldsymbol{w}, b\) 的,而且 \(\alpha_i \ge 0\) 又是不等式約束,如果此時我們要對 \(\alpha_i\) 求偏導,那麼有多少個樣本就要求多少個偏導,這個求解過程不好做。所以,我們需要使用拉格朗日函式對偶性,將最小和最大的位置交換一下,這樣就變成了:
\begin{equation}
\max_{\alpha_i \ge 0} \min_{\boldsymbol{w}, b} L(\boldsymbol{w}, b, \boldsymbol{\alpha} ) = d^*
\end{equation}
式(16)是式(15)的對偶問題,這個新問題的最優值用 \(d^*\) 表示。顯然有 \(d^* \le p^*\),這稱為“弱對偶性”成立;若 \(d^* = p^*\),則稱為“強對偶性”成立,此時由對偶問題能獲得主問題的最優下界。對於一般的優化問題,強對偶性通常不成立。但是若主問題是凸優化問題,如式(8)中 $\frac{1}{2} \Vert \boldsymbol{w} \Vert^2 $ 和 $1 - y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) $ 均為凸函式,且其可行域中至少有一個點使不等式約束嚴格成立(即至少存在一個 \(\boldsymbol{w}, b\),使得 \(1 - y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) < 0\) 成立),則此時強對偶性成立。
令 \(L(\boldsymbol{w}, b, \boldsymbol{\alpha} )\) 對 \(\boldsymbol{w}\) 和 \(b\) 分別求偏導可得:
\begin{equation}
\boldsymbol{w} = \sum_{i = 1}^m \alpha_i y_i \boldsymbol{x}_i
\end{equation}
\begin{equation}
0 = \sum_{i = 1}^m \alpha_i y_i
\end{equation}
將公式(17)代入公式(10),即可將 \(L(\boldsymbol{w}, b, \boldsymbol{\alpha} )\) 中的 \(\boldsymbol{w}\) 和 \(b\) 消去,再考慮式(18)的約束,就得到式(8)的拉格朗日對偶問題:
\[ \begin{split} & \max_{\boldsymbol{\alpha}} & \sum_{i = 1}^m \alpha_i - \frac{1}{2} \sum_{i=1}^m \sum_{j = 1}^m \alpha_i \alpha_j y_i y_j \boldsymbol{x}_i^T \boldsymbol{x}_j \\ & s.t. & \sum_{i = 1}^m \alpha_i y_i = 0 , \\ & & \alpha_i \ge 0, \quad i = 1,2, \dots, m. \end{split}\tag{19} \]
現在我們的優化問題如公式(19)所示,我們只需要求出 \(\alpha_i\),然後將其代入公式(17)求出 \(\boldsymbol{w}\),然後找個支援向量帶入公式(9)算出 \(b\)。(支援向量代入公式(9)會得到 \(f(\boldsymbol{x} ) = \pm1\),此時隨便一個支援向量 \(\boldsymbol{x}^*\) 都能解出 $b = f(\boldsymbol{x}^* ) - \boldsymbol{w}^T \boldsymbol{x}^* = \pm1 - \boldsymbol{w}^T \boldsymbol{x}^* $。)而求解 \(\alpha_i\),一般會用 SMO 演算法。(這裡不再展開)
最後得到的 SVM 判別函式為:
\[
\begin{split}
f(\boldsymbol{x} ) & = \boldsymbol{w}^T \boldsymbol{x} + b \\
& = \sum_{i = 1}^m \alpha_i y_i \boldsymbol{x}_i^T \boldsymbol{x}_i +b
\end{split}\tag{20}
\]
這就結束了嗎?還沒有,注意到公式(8)中有不等式約束,因此上述過程需滿足 KKT(Karush-Kuhn-Tucker)條件,即要求
\[
\begin{cases}
\alpha_i \ge 0; \cr
1 - y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) \le 0; \cr
\alpha_i (1 - y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) = 0 .
\end{cases}\tag{21}
\]
具體 KKT 條件的由來這裡不做論述,但需要明白,如果目標函式求得了最優解,則 KKT 條件一定會滿足,即 KKT 條件是最優解的必要條件。
於是,對於任意的訓練樣本 \((\boldsymbol{x}_i, b_i)\),總有 \(\alpha_i = 0\) 或者 $y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) = 1 $。若 \(\alpha_i = 0\),則該樣本將不會出現在式(20)的求和中出現,也就不會對 \(f(\boldsymbol{x} )\) 有任何影響;若 \(\alpha_i > 0\),則必有 $y_i(\boldsymbol{w}^T \boldsymbol{x}_i + b) = 1 $,所對應的樣本點在位於最大間隔邊界上,是一個支援向量。這裡顯示出 SVM 的一個重要性質:訓練完成後,大部分的訓練樣本都不需要保留,最終模型僅與支援向量有關。
References
《機器學習》周志華
機器學習實戰教程(八):支援向量機原理篇之手撕線性SVM -- Jack Cui
深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT條件 -- xianlingmao
支援向量機(SVM)必備知識(KKT、slater、對偶)-- feilong_csdn