機器學習實戰 - 讀書筆記(06) – SVM支持向量機


機器學習實戰 - 讀書筆記(06) – SVM支持向量機

前言

最近在看Peter Harrington寫的“機器學習實戰”,這是我的學習筆記,這次是第6章:SVM 支持向量機。
支持向量機不是很好被理解,主要是因為里面涉及到了許多數學知識,需要慢慢地理解。我也是通過看別人的博客理解SVM的。
推薦大家看看on2way的SVM系列:

基本概念

  • SVM - Support Vector Machine。支持向量機,其含義是通過支持向量運算的分類器。其中“機”的意思是機器,可以理解為分類器。
    什么是支持向量呢?在求解的過程中,會發現只根據部分數據就可以確定分類器,這些數據稱為支持向量。
    見下圖,在一個二維環境中,其中點R,S,G點和其它靠近中間黑線的點可以看作為支持向量,它們可以決定分類器,也就是黑線的具體參數。
    Figure SVM 1

  • 分類器:就是分類函數。

  • 線性分類:可以理解為在2維空間中,可以通過一條直線來分類。在p維空間中,可以通過一個p-1維的超平面來分類。

  • 向量:有多個屬性的變量。在多維空間中的一個點就是一個向量。比如 \(x = (x_1, x_2, ..., x_n)\)。下面的\(w\)也是向量。

  • 約束條件(subject to) : 在求一個函數的最優值時需要滿足的約束條件。

  • 向量相乘: \(xw^T = \textstyle \sum_{i=1}^n w_ix_i\)

  • 內積: \(\langle x,y \rangle = \textstyle \sum_{i=1}^n x_iy_i\)

解決的問題:

  • 線性分類
    在訓練數據中,每個數據都有n個的屬性和一個二類類別標志,我們可以認為這些數據在一個n維空間里。我們的目標是找到一個n-1維的超平面(hyperplane),這個超平面可以將數據分成兩部分,每部分數據都屬於同一個類別。
    其實這樣的超平面有很多,我們要找到一個最佳的。因此,增加一個約束條件:這個超平面到每邊最近數據點的距離是最大的。也成為最大間隔超平面(maximum-margin hyperplane)。這個分類器也成為最大間隔分類器(maximum-margin classifier)。
    支持向量機是一個二類分類器。

  • 非線性分類
    SVM的一個優勢是支持非線性分類。它結合使用拉格朗日乘子法和KKT條件,以及核函數可以產生非線性分類器。

  • 分類器1 - 線性分類器
    是一個線性函數,可以用於線性分類。一個優勢是不需要樣本數據。
    classifier 1:

\[f(x) = xw^T + b \]

\(w\)\(b\) 是訓練數據后產生的值。

  • 分類器2 - 非線性分類器
    支持線性分類和非線性分類。需要部分樣本數據(支持向量),也就是\(\alpha_i \ne 0\)的數據。
    \(\because\)
    \(w = \textstyle \sum_{i=1}^n \alpha_iy_ix_i\)
    \(\therefore\)
    classifier 2:

\[f(x) = \textstyle \sum_{i=1}^n \alpha_iy_i K(x_i, x) + b \\ \text{here} \\ \qquad x_i \text{ : training data i} \\ \qquad y_i \text{ : label value of training data i} \\ \qquad \alpha_i \text{ : Lagrange multiplier of training data i} \\ \qquad K(x_1, x_2) = exp(-\frac{\lVert x_1 - x_2 \rVert ^2}{2\sigma^2}) \text{ : kernel function} \\ \]

\(\alpha\), \(\sigma\)\(b\) 是訓練數據后產生的值。
可以通過調節\(\sigma\)來匹配維度的大小,\(\sigma\)越大,維度越低。

核心思想

  • SVM的目的是要找到一個線性分類的最佳超平面 \(f(x) = xw^T + b = 0\)。求 \(w\)\(b\)
  • 首先通過兩個分類的最近點,找到\(f(x)\)的約束條件。
  • 有了約束條件,就可以通過拉格朗日乘子法和KKT條件來求解,這時,問題變成了求拉格朗日乘子\(\alpha_i\)\(b\)
  • 對於異常點的情況,加入松弛變量\(\xi\)來處理。
  • 使用SMO來求拉格朗日乘子\(\alpha_i\)\(b\)。這時,我們會發現有些\(\alpha_i = 0\),這些點就可以不用在分類器中考慮了。
  • 驚喜! 不用求\(w\)了,可以使用拉格朗日乘子\(\alpha_i\)\(b\)作為分類器的參數。
  • 非線性分類的問題:映射到高維度、使用核函數。

詳解

線性分類及其約束條件

SVM的解決問題的思路是找到離超平面的最近點,通過其約束條件求出最優解。
Figure SVM 1
對於訓練數據集T,其數據可以分為兩類C1和C2。
對於函數:\(f(x) = xw^T + b\)
對於C1類的數據 \(xw^T + b \geqslant 1\)。其中至少有一個點\(x_i\)\(f(x_i) = 1\)。這個點稱之為最近點。
對於C2類的數據 \(xw^T + b \leqslant -1\)。其中至少有一個點\(x_i\)\(f(x_i) = -1\)。這個點稱也是最近點。
上面兩個約束條件可以合並為:
\(y_if(x_i) = y_i(x_iw^T + b) \geqslant 1\)
\(y_i\)是點\(x_i\)對應的分類值(-1或者1)。
\(w\)\(b\).
則超平面函數是\(xw^T + b = 0\)
為了求最優的f(x), 期望訓練數據中的每個點到超平面的距離最大。
(解釋1: 這里需要理解一個事情,根據上圖,我們可以給每個點做一條平行於超平面的平行線(超平行面),因此,這個最大化相當於求最近點到超平面距離的最大化。)

總結,現在我們的公式是:
Formula 6.1

\[f(x) = xw^T + b \\ \text{subject to} \\ \qquad y_if(x_i) = y_i(x_iw^T + b) \geqslant 1, i = 1, ..., n \]

幾個訓練腦筋的小問題:

  • Q: y是否可以是其它非{-1, 1}的值?
    A: 將y值定義為{-1, 1}是最簡化的方案。你的分類可以是cat和dog,只要將cat對應到1, dog對應到-1就可以了。你也可以將y值定義為其它數比如: -2, 2或者2, 3之類的,但是這樣就需要修改超平面函數和約束條件,增加了沒必要的繁瑣,實際上和y值定義為{-1, 1}是等價的。

  • Q: 如果兩組數據里的太近或者太遠,是不是可能就找不到\(xw^T + b = 1\)\(xw^T + b = -1\)的這兩個點?
    A: 不會。假設可以找到\(x_iw^T + b = c\)\(x_jw^T + b = -c\). \(c > 0 and c <> 1\)。其超平面函數為\(xw^T + b = 0\).
    上面公式左右同時除以c, 則:
    \(x_iw^T / c + b / c = 1\)
    \(x_jw^T / c + b / c = -1\)
    令:
    \(w' = w/c\)
    \(b' = b/c\)
    有:
    \(x_iw'^T + b' = 1\)
    \(x_jw'^T + b' = -1\)
    可以找到超平面函數:
    \(xw^T + b' = 0\)
    因此,總是可以找到y是{-1, 1}的超平面,如果有的話。

最大幾何間隔(geometrical margin)

\(f(x)\)為函數間隔\(\gamma\)
如果求\(\text{max } yf(x)\),有個問題,就是w和b可以等比例增大,導致\(yf(x)\)的間隔可以無限大。因此需要變成求等價的最大幾何間隔:

\[\bar{\gamma} = \frac{yf(x)}{\lVert w \rVert} \\ \text{subject to} \\ \qquad y_if(x_i) = y_i(x_iw^T + b) \geqslant 1, i = 1, ..., n \]

\(\lVert w \rVert\) : 二階范數,也就是各項目平方和的平方根。 \(\sqrt {\textstyle \sum_{i=1}^n w_i^2}\)

根據上面的解釋,這個問題可以轉變為:

\[\text{max } \frac{1}{\lVert w \rVert} \\ \text{subject to} \\ \qquad y_i(x_iw^T + b) \geqslant 1, i = 1, ..., n \]

再做一次等價轉換:
Formula 6.2

\[\text{min } \frac{1}{2} \lVert w \rVert ^ 2 \\ \text{subject to} \\ \qquad y_i(x_iw^T + b) \geqslant 1, i = 1, ..., n \]

求解問題\(w,b \Leftrightarrow \alpha_i, b\)

我們使用拉格朗日乘子法和KKT條件來求\(w\)\(b\),一個重要原因是使用拉格朗日乘子法后,還可以解決非線性划分問題。
拉格朗日乘子法和KKT條件可以解決下面這個問題:

  1. 求一個最優化問題 \(f(x)\)
    剛好對應我們的問題:\(min \frac{1}{2} \lVert w \rVert ^ 2\)
  2. 如果存在不等式約束\(g_k(x) <= 0, k = 1, …, q\)
    對應 \(\text{subject to } \qquad 1 - y_i(x_iw^T + b) <= 0, i = 1, ..., n\)
  3. F(x)必須是凸函數。這個也滿足。

SVM的問題滿足使用拉格朗日乘子法的條件。因此問題變成:
Formula 6.3

\[\underset{\alpha}{max} \text{ } W(\alpha) = \mathcal{L}(w,b,\alpha) = \frac{1}{2} \lVert w \rVert ^ 2 - \textstyle \sum_{i=1}^n \alpha_i(y_i(x_iw^T + b) - 1) \\ \text{subject to} \\ \qquad \alpha_i >= 0, i = 1, ..., n \\ \qquad \textstyle \sum_{i=1}^n \alpha_iy_i = 0 \\ \qquad 1 - y_i(x_iw^T + b) <= 0, i = 1, ..., n \\ \qquad w = \textstyle \sum_{i=1}^n \alpha_iy_ix_i \\ \text{here} \\ \qquad \alpha_i \text{ : Lagrange multiplier of training data i} \\ \]

消除\(w\)之后變為:
Formula 6.4

\[\underset{\alpha}{max} \text{ } W(\alpha) = \mathcal{L}(w,b,\alpha) = \textstyle \sum_{i=1}^n \alpha_i - \frac{1}{2} \textstyle \sum_{i,j=1}^n \alpha_i\alpha_jy_iy_jx_i^Tx_j \\ \text{subject to} \\ \qquad \alpha_i >= 0, i = 1, ..., n \\ \qquad \textstyle \sum_{i=1}^n \alpha_iy_i = 0 \\ \qquad \alpha_i(1 - y_i(\textstyle \sum_{j=1}^n \alpha_jy_j \langle x_j,x_i \rangle + b)) = 0, i = 1, ..., n \]

\(\langle x_j,x_i \rangle\)\(x_j\)\(x_i\)的內積,相當於\(x_ix_j^T\)
可見使用拉格朗日乘子法和KKT條件后,求\(w,b\)的問題變成了求拉格朗日乘子\(\alpha_i\)\(b\)的問題。
到后面更有趣,變成了不求\(w\)了,因為\(\alpha_i\)可以直接使用到分類器中去,並且可以使用\(\alpha_i\)支持非線性的情況(\(xw^T + b\)是線性函數,支持不了非線性的情況哦)。

以上的具體證明請看:
解密SVM系列(二):SVM的理論基礎
關於拉格朗日乘子法和KKT條件,請看:
深入理解拉格朗日乘子法(Lagrange Multiplier)和KKT條件

處理異常點(outliers)

outliers image
如上圖:點w是一個異常點,導致無法找到一個合適的超平面,為了解決這個問題,我們引入松弛變量(slack variable)\(\xi\)
修改之間的約束條件為:\(x_iw^T + b >= 1 – \xi_i \qquad \text{for all i = 1, …, n}\)
則運用拉格朗日乘子法之后的公式變為:
Formula 6.5

\[\underset{\alpha}{max} \text{ } W(\alpha) = \mathcal{L}(w,b,\alpha) = \textstyle \sum_{i=1}^n \alpha_i - \frac{1}{2} \textstyle \sum_{i,j=1}^n \alpha_i\alpha_jy_iy_jx_jx_i^T \\ \text{subject to} \\ \qquad 0 \leqslant \alpha_i \leqslant C, i = 1, ..., n \\ \qquad \textstyle \sum_{i=1}^n \alpha_iy_i = 0 \\ \qquad \alpha_i(1 - y_i(\textstyle \sum_{j=1}^n \alpha_jy_j \langle x_j,x_i \rangle + b)) = 0, i = 1, ..., n \]

輸入參數:

  • 參數\(C\),越大表明影響越嚴重。\(C\)應該一個大於0值。其實\(C\)也不能太小,太小了就約束\(\alpha_i\)了,比如200。
  • 參數\(\xi\),對所有樣本數據起效的松弛變量,比如:0.0001。
    具體證明請看:
    解密SVM系列(二):SVM的理論基礎

求解\(\alpha\) - 使用SMO方法

1996年,John Platt發布了一個稱為SMO的強大算法,用於訓練SVM。SMO表示序列最小優化(Sequential Minimal Optimization)。
SMO方法:
概要:SMO方法的中心思想是每次取一對\(\alpha_i\)\(\alpha_j\),調整這兩個值。
參數: 訓練數據/分類數據/\(C\)/\(\xi\)/最大迭代數
過程:

初始化\(\alpha\)為0;
在每次迭代中 (小於等於最大迭代數),
- 找到第一個不滿足KKT條件的訓練數據,對應的\(\alpha_i\)
- 在其它不滿足KKT條件的訓練數據中,找到誤差最大的x,對應的index的\(\alpha_j\)
- \(\alpha_i\)\(\alpha_j\)組成了一對,根據約束條件調整\(\alpha_i\), \(\alpha_j\)

不滿足KKT條件的公式:
Formula 6.6

\[\text{(1) } y_i(u_i - y_i) \leqslant \xi \text{ and } \alpha_i < C \\ \text{(2) } y_i(u_i - y_i) \geqslant \xi \text{ and } \alpha_i > 0 \\ here \\ \qquad u_i = \textstyle \sum_{j=1}^n \alpha_jy_j K(x_j, x_i) + b \\ \qquad K(x_1, x_2) = \langle x_1, x_2 \rangle \\ \qquad \xi \text{ : slack variable} \]

調整公式:
Formula 6.7

\[\alpha_2^{new} = \alpha_2^{old} - \frac{y_2(E_1 - E_2)}{\eta} \\ \alpha_1^{new} = \alpha_1^{old} + y_1y_2(\alpha_2^{old} - \alpha_2^{new}) \\ b_1 = b^{old} - E_1 -y_1(\alpha_1^{new} - \alpha_1^{old})K(x_1, x_1) - y_2(\alpha_2^{new} - \alpha_2^{old})K(x_1, x_2) \\ b_2 = b^{old} - E_2 -y_1(\alpha_1^{new} - \alpha_1^{old})K(x_1, x_2) - y_2(\alpha_2^{new} - \alpha_2^{old})K(x_2, x_2) \\ b = \begin{cases} b_1 & \text{if } 0 \leqslant \alpha_1^{new} \leqslant C \\ b_2 & \text{if } 0 \leqslant \alpha_2^{new} \leqslant C \\ \frac{b_1 + b_2}{2} & \text{otherwise} \end{cases} \\ here \\ \qquad E_i = u_i - y_i \\ \qquad \eta = 2K(x_1, x_2) - K(x_1, x_1) - K(x_2, x_2) \\ \qquad u_i = \textstyle \sum_{j=1}^n \alpha_jy_j K(x_j, x_i) + b \\ \qquad K(x_1, x_2) = \langle x_1, x_2 \rangle \]

具體證明請參照:
解密SVM系列(三):SMO算法原理與實戰求解

最后一步:解決非線性分類

根據機器學習的理論,非線性問題可以通過映射到高維度后,變成一個線性問題。
比如:二維下的一個點\(<x1, x2>\), 可以映射到一個5維空間,這個空間的5個維度分別是:\(x1, x2, x1x2, x1^2, x2^2\)
映射到高維度,有兩個問題:一個是如何映射?另外一個問題是計算變得更復雜了。
幸運的是我們可以使用核函數(Kernel function)來解決這個問題。
核函數(kernel function)也稱為核技巧(kernel trick)。
核函數的思想是:

仔細觀察Formula 6.6 和 Formula 6.7,就會發現關於向量\(x\)的計算,總是在計算兩個向量的內積\(K(x_1, x_2) = \langle x_1, x_2 \rangle\)
因此,在高維空間里,公式的變化只有計算低維空間下的內積\(\langle x_1, x_2 \rangle\)變成了計算高維空間下的內積\(\langle x'_1, x'_2 \rangle\)
核函數提供了一個方法,通過原始空間的向量值計算高維空間的內積,而不用管映射的方式。
我們可以用核函數代替\(K(x_1, x_2)\)

核函數有很多種, 一般可以使用高斯核(徑向基函數(radial basis function))
Formula 6.8

\[K(x_1, x_2) = exp(-\frac{\lVert x_1 - x_2 \rVert ^2}{2\sigma^2}) \]

可以通過調節\(\sigma\)來匹配維度的大小,\(\sigma\)越大,維度越低,比如10。
可以參照:
解密SVM系列(四):SVM非線性分類原理實驗
支持向量機通俗導論(理解SVM的三層境界)

如何解決多類分類問題

支持向量機是一個二類分類器。基於SVM如何構建多類分類器,建議閱讀C. W. Huset等人發表的一篇論文"A Comparison of Methods for Multiclass Support Vector Machines"。需要對代碼做一些修改。

參照


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM