關於 SVM(支持向量機),網上教程實在太多了,但真正能把內容講清楚的少之又少。這段時間在網上看到一個老外的 svm 教程,幾乎是我看過的所有教程中最好的。這里打算通過幾篇文章,把我對教程的理解記錄成中文。另外,上面這篇教程的作者提供了一本免費的電子書,內容跟他的博客是一致的,為了方便讀者,我把它上傳到自己的博客中。
這篇文章主要想講清楚 SVM 的目標函數,而關於一些數學上的優化問題,則放在之后的文章。
什么是 SVM
SVM 的全稱是 Support Vector Machine,中文名支持向量機。
關於 SVM 是什么這個問題,知乎上有一篇通俗易懂的文章,說到底,SVM 的提出主要是為了解決二分類的問題。下面會從最簡單的數學入手,一步步揭開 SVM 的面紗。
超平面
什么是超平面
在正式開講之前,需要先講一下超平面(hyperplane)的概念,這是 SVM 中一個相當重要的概念。
在初中的時候,我們就知道 \(ax+b-y=0\) 表示的是一條直線。在機器學習里面,為了方便用向量的形式來表示,我們一般用 \(x_1\) 來代替 \(x\),\(x_2\) 來代替 \(y\),這樣,直線就表示成了 \(\mathbf{w}^T\mathbf{x}+b=0\),其中 \(\mathbf{w}=\begin{bmatrix} a & -1 \end{bmatrix}^T\),\(\mathbf{x}=\begin{bmatrix} x_1 & x_2 \end{bmatrix}^T\)。
如果我們把目光投到三維:\(ax_1+bx_2+cx_3+d=0\),那么原來的直線就變成了一個平面。如果繼續將維度升高到四維、五維。。。這時,平面就變成了高維空間的超平面。機器學習中的問題基本都是在高維空間處理的。
不過,由於超平面沒法用畫圖表示,因此本文會使用二維的例子來介紹。
如果你看了上面知乎那篇文章,你就會知道,SVM 正是借助這個超平面來划分數據的。
關於這個超平面,我們要知道三點:
- 超平面也是由一系列點組成的。在線性代數中通常將點稱為向量。如果點 \(\mathbf{x}\) 在超平面上,則滿足 \(\mathbf{w}^T\mathbf{x}+b=0\)。由於這個超平面把數據分為兩類,因此這些點又被稱為支持向量。
- 假設超平面兩側各有一點 \(\mathbf{x_1}\) 和 \(\mathbf{x_2}\),則滿足 \(\mathbf{w}^T\mathbf{x_1}+b>0\),\(\mathbf{w}^T\mathbf{x_2}+b<0\)。在二維中這一點很明顯。
- \(\mathbf{w}\) 與超平面垂直。這一點是根據超平面的定義得來的,可以參看這個數學講義。當然,如果實在無法理解,可以令 \(b=0\),這樣超平面就變成 \(\mathbf{w}^T\mathbf{x}=0\),兩向量內積為 0,證明 \(\mathbf{w} \perp \mathbf{x}\)。在 SVM 中,正樣本的標簽通常記為 1,負樣本記為 -1。因此,為了保持符號上的一致性,規定 \(\mathbf{w}\) 的方向指向正樣本的一側。這樣,如果 \(\mathbf{x_1}\) 是一個正樣本,那么 \(\mathbf{w}^T\mathbf{x_1}+b>0\),否則 \(\mathbf{w}^T\mathbf{x_1}+b<0\)。
間距 margin
間距是 SVM 中另一個核心概念。間距指的就是點和超平面之間的距離。當樣本點很多時,我們取樣本點和超平面之間的最小距離作為間距。
SVM 的目標
SVM 的目的其實就是找一個區分數據最合適的超平面,超平面一側是正樣本,另一側是負樣本。我們應該能隱約感覺到:最合適的平面就在正負樣本「最中間」的位置。換句話說,就是找一個間距最大的超平面。這樣找到的超平面也將在正負樣本的最中間,因為如果超平面離任何樣本太近,間距都會變小,因此為了保證間距最大,就必須與所有正負樣本都足夠的遠。
如何找到最合適的超平面
假設下圖中的 A~G 表示樣本點,橙色線是超平面,兩條藍線表示與超平面平行的面,它們划定了超平面的間距(注意右側的藍線穿過了離超平面最近的 A、B 兩點)。
雖然這個超平面能把正負樣本點分開,但顯然不是最優的超平面,因為我們可以找到一個新的超平面,使間距更大(由 \(\frac{M_1}{2}\) 擴大到 \(\frac{M_2}{2}\))。
到這里,我們可以發現,超平面是否合適,跟間距大小息息相關。因此,尋找最優的超平面,就等價於找到最大的間距。
尋找最大間距
下面就來討論一下怎么找到最大的間距。
假設我們有一個樣本集 \(D=\{(\mathbf{x_i},y_i)\ \big |\ \mathbf{x_i} \in R^p, y_i \in \{-1,1\}\}\),\(y_i\) 表示樣本標簽,正樣本取 1,負樣本取 -1。
為了計算超平面 \(\mathbf{w}^T\mathbf{x}+b=0\) 的間距,我們可以仿照上圖中的藍線,引入兩個超平面: \(\mathbf{w}^T\mathbf{x}+b=\delta\) 和 \(\mathbf{w}^T\mathbf{x}+b=-\delta\)(\(\delta\) 取正數)。注意,這兩個超平面之間不能有任何數據點。因此,他們要滿足一個限制條件:對於正樣本(\(y_i=1\))而言,\(\mathbf{w}^T\mathbf{x}+b\ge \delta\),對於負樣本(\(y_i=-1\)),\(\mathbf{w}^T\mathbf{x}+b\le -\delta\)。這樣一來,求原超平面的間距就轉換為求這兩個超平面之間的距離。利用標簽的正負號,我們可以把兩個超平面的限制條件統一為:
接下來要考慮如何計算這兩個超平面之間的距離。
在高中階段,我們就學過如何計算兩條平行直線之間的距離,這里完全可以把二維的公式拓展到高維。不過,這里我們還是從向量的角度出發,看看如何計算兩個超平面之間的距離。
假設這兩個超平面分別為 \(H_0: \mathbf{w}^T\mathbf{x}+b=-\delta\) 和 \(H_1: \mathbf{w}^T\mathbf{x}+b=\delta\),\(x_0\) 是 \(H_0\) 上一點,兩個平面之間的距離是 \(m\)。
為了計算 \(m\),需要找一個跟 \(m\) 相關的表達式。假設 \(H_1\) 上有一點 \(x_1\),使得向量 \(\overline {x_0x_1} \perp H_1\),則 \(\mathbf{x_1}=\mathbf{x_0}+\overline {x_0x_1}\)。想要求 \(\overline {x_0x_1}\),我們需要確定它的方向和長度。在之前介紹超平面時,我們已經知道,\(\mathbf{w} \perp H_1\),所以這個向量的方向應該和 \(\mathbf{w}\) 相同,而它的長度就是我們要求的 \(m\),所以 \(\overline {x_0x_1}=m\frac{\mathbf{w}}{||\mathbf{w}||}\),既而 \(\mathbf{x_1}=\mathbf{x_0}+m\frac{\mathbf{w}}{||\mathbf{w}||}\)。
現在把 \(\mathbf{x_1}\) 代入 \(H_1 (\mathbf{w}^T\mathbf{x}+b=\delta)\) 中:
由於 \(\mathbf{x_0}\) 是 \(H_0\) 上一點,所以 \(\mathbf{w}^T\mathbf{x_0}+b=-\delta\),代入(2)式:
這樣我們就得到 \(m\) 的表達式:
考慮到 \(\delta\) 是一個正數,因此,要使 \(m\) 最大,就必須讓 \(||\mathbf{w}||\) 最小。再考慮到兩個超平面的限制條件(1),我們就可以得到如下 SVM 的目標函數。
目標函數
綜合考慮 (2) (3),我們得到 SVM 最終的目標函數:
找出使這個函數最小的 \(\mathbf{w}\) 和 \(b\),就找到了最合適的超平面。注意,由於我們有 \(m\) 個樣本,所以總共有 \(m\) 個限制條件。