支持向量機(Support Vector Machine, SVM)
考慮logistic回歸,對於$y=1$的數據,我們希望其$h_\theta(x) \approx 1$,相應的$\theta^Tx \gg 0$; 對於$y=0$的數據,我們希望$h_\theta(x) \approx 0$,相應的$\theta^Tx \ll 0$。每個數據點的代價為: $$-\left[y\log(h_\theta(x))+(1-y)\log(1-h\theta(x))\right]$$當$y=1$時其代價$cost_1(z)=-\log(\frac{1}{1+e^{-z}})$;當$y=0$時其代價$cost_0(z)=-\log(1-\frac{1}{1+e^{-z}})$,分別如圖1左右所示。
圖1 當$y=1$和$y=0$單個數據點的代價隨$z$的變化
logistic回歸的假設為$$\min\limits_\theta \frac{1}{m}\left[\sum\limits_{i=1}^{m}y^{(i)}(-\log(h_\theta(x^{(i)}))) + (1-y^{(i)})(-\log(1-h_\theta(x^{(i)})))\right] + \frac{\lambda}{2m}\sum\limits_{j=1}^{n}\theta_{j}^2$$通過去掉$\frac{1}{m}$並且將$A+\lambda B$的形式變為$CA+B$的形式,可以得到SVM的假設為$$\min\limits_\theta C\left[\sum\limits_{i=1}^{m}y^{(i)}cost_1(\theta^Tx^{(i)}) + (1-y^{(i)})cost_0(\theta^Tx^{(i)})\right] + \frac{1}{2}\sum\limits_{j=1}^{n}\theta_{j}^2$$
最大間隔(Large Margin Intuition)
對於$y=1$的數據,我們希望$\theta^Tx \ge 1$而不僅僅是$\ge 0$; 對於$y=0$的數據,我們希望$h_\theta(x) \leq -1$而不僅僅是$< 0$。當C很大時,由於$CA+B$要取最小值,因此$A\approx 0$,從而SVM最大化間隔問題變為\begin{align*}&\min\limits_\theta\frac{1}{2}\sum\limits_{j=1}^{n}\theta_j^{2}\\ &s.t.\quad\begin{cases}\theta^{T}x^{(i)}\geq 1 \quad y^{(i)}=1\\\theta^{T}x^{(i)}\leq -1 \quad y^{(i)}=0\end{cases}\end{align*}
圖2 支持向量機最優超平面和最大Margin(兩條虛線之間的距離),支撐向量指的是位於兩條虛線上的點(在高維空間中,每個點可以看作是從原點出發的向量,所以這些點也稱為向量)
參數C表示對錯誤的容忍程度,C值越大表示越不能容忍錯誤分類,容易出現過擬合現象(如圖3所示).
圖3 參數C對分類的影響,C越大越不能容忍錯誤分類;反之能夠接受少量錯誤分類.
Kernel
對於低維空間中線性不可分的情況,可以通過增加高階多項式項將其映射到高維空間,使得在高維空間中通過一個超平面可分(如圖4所示)。Kernel解決如何選擇合適的高維特征問題,對於任意低維數據點x,定義它與低維空間中預先選定的標記點$l^{(i)}$(landmarks)之間的相似性為$$f_i=similarity(x, l^{(i)})=exp\left(-\frac{||x-l^{(i)}||^2}{2\sigma^2}\right)$$這樣當有k個landmarks時,我們將得到k個新的特征$f_i$,這樣就將低維空間的點x投射為高維(k維)空間中一個點。如果x距離$l^{(i)}$非常近,即$x\approx l^{(i)}$, 則相似性$f_i\approx 1$; 否則如果x距離$l^{(i)}$非常遠,則相似性$f_i\approx 0$。接下來一個問題是如何選擇landmarks,一種做法是選擇所有的m個樣本點作為landmarks,這樣對於具有n個特征的數據點$x^{(i)}$,通過計算$f_i$,將得到一個具有m維空間的數據點$f^{(i)}$。
圖4 通過kernel函數將低維線性不可分數據投射到高維空間從而使得線性可分.
SVM with kernels
假設(Hypothesis):給定數據點$x$,計算新的特征$f$。當$\theta^Tf \geq 0$時,預測$y=1$;反之,預測$y=0$。
訓練(Training):$$\min\limits_\theta C\left[\sum\limits_{i=1}^{m}y^{(i)}cost_1(\theta^Tf^{(i)}) + (1-y^{(i)})cost_0(\theta^Tf^{(i)})\right] + \frac{1}{2}\sum\limits_{j=1}^{n}\theta_{j}^2$$
參數C($\approx\frac{1}{\lambda}$)的影響:
- large C: low bias, high variance
- small C: high bias, low variance
參數$\sigma^2$的影響:
- large $\sigma^2$:high bias, low variance ($f_i$ vary more smoothly)
- small $\sigma^2$:low bias, high variance ($f_i$ vary less smoothly)
支持向量機實踐
實際應用中不會要求自己實現SVM,更多是調用線程的庫例如liblinear,libsvm等來求解。需要指定參數C和kernel函數。
Linear kernel: 不指定kernel,即“No kernel”,也稱為“linear kernel”(用於特征n較大,同時example數m較小時).
Gaussian kernel: $f_i=exp\left(-\frac{||x-l^{(i)}||^2}{2\sigma^2}\right)$,其中$l^{(i)}=x^{(i)}$,需要指定參數$\sigma^2$(用於n較小,m較大時)。注意在使用Gaussian kernel之前需要對數據進行feature scaling.
其他常見的kernel包括
- Polynomal kernel:$k(x, l) = (\alpha x^Tl+c)^{d}$,其中可調節參數包括坡度$\alpha$,常量$c$和多項式度$d$
- string kernel: 對字符串直接進行變換,不需要將字符串數值化,具體公式見wikipedia:string kernel
- chi-square kernel:$k(x, y)=1-\sum\limits_{k=1}^{n}\frac{(x_k-y_k)^2}{\frac{1}{2}(x_k+y_k)}$
- histogram intersection kernel:$k(x, y) = \sum\limits_{k=1}^{n}\min(x_k, y_k)$
多元分類:采用one-vs-all的方法,對於k個分類,需要訓練k個svm.
logistic回歸和SVM
當n較大時($n\geq m$, n=10000, m = 1000),使用logistic回歸或者SVM(with linear kernel)
當n較小,m中等時(n=10-1000, m = 10-100000),使用SVM(with Gaussian kernel)
當n較小, m較大時(n=1-1000, m = 500000),增加新的特征,然后適用logistic回歸或者SVM(with linear kernel)
神經網絡在各類n, m情況下都工作的很好,缺陷是訓練速度比較慢
參考文獻
[1] Andrew Ng Coursera 公開課第七周
[2] Kernel Functions for Machine Learning Applications. http://crsouza.com/2010/03/kernel-functions-for-machine-learning-applications/#chisquare
[3] Wikipedia: string kernel. https://en.wikipedia.org/wiki/String_kernel
[4] Hofmann T, Schölkopf B, Smola A J. Kernel methods in machine learning[J]. The annals of statistics, 2008: 1171-1220.