機器學習:支持向量機(SVM)

SVM,稱爲支持向量機,曾經一度是應用最普遍的模型,它有很好的數學基礎和理論基礎,可是它的數學基礎卻比之前講過的那些學習模型複雜不少,我一直認爲它是最難推導,比神經網絡的BP算法還要難懂,要想徹底懂這個算法,要有很深的數學基礎和優化理論,本文也只是大概討論一下。本文中全部的代碼都在個人githubgit

硬間隔SVM推導

若是如今咱們須要對一堆數據進行二分類處理,而且這些數據都是線性可分的(一條直線就能將數據區分開),那麼你會如何對之進行劃分?如圖1。github


圖1. 線性可分圖
咱們只須要在倆類數據的中間找出一條直線便可,若是數據是三維的,那麼咱們須要找出中間的切分面,能將倆類數據劃分開的直線有不少,在圖1中就有三條,那麼你如何判斷哪一條纔是最適合的呢?直觀來看,確定是中間的藍色線,由於黃線太靠近藍點,綠線太靠近紅色,這樣的線對樣本擾動的容忍性低,在測試集中很容易就會出錯,而藍色線是受影響最小的,由於它距離倆類樣本最遠,這樣才具備泛化能力,那麼咱們須要找出的線就是距離倆類樣本最遠,其實就是最中間的線,從圖1中能夠看出平面上有不少點,問題在於哪些點才能衡量出線到倆類數據的距離呢?那確定是距離線最近的那些點,咱們把最近樣本點到劃分邊界的距離稱爲間隔。咱們的目標就是達到最大間隔的那個劃分邊界。下面先來求間隔。

間隔

\(W^TX + b = 0\)來表示劃分邊界,咱們先計算點到這個劃分邊界的距離,由於數據多是高維的,因此不能用點到直線的距離,應該計算點到面的距離。圖2就是計算其中有一個\(P\)到面的距離。算法


圖2. 點到平面圖
$Q$是平面上任意一點,其中$W^T$是平面的法向量,這個咱們推導出來,假設平面上任意倆點$x_1,x_2$, $$ W^T(x_1 - x_2) = W^Tx_1 - W^Tx_2 = (-b) - (-b) = 0 $$ 所以$W^T$與平面垂直。設$P$到平面上距離爲$d$,從圖中咱們能夠很容易的看出, $$ \begin{align} d & = |PQ|cos\theta \notag \\ & = |P - Q|cos \notag \\ & = |P - Q| \frac{|W^T(P-Q)|}{|W||P - Q|} \notag \\ & = \frac{1}{|W|}|W^TP - W^TQ| \notag \\ \end{align} $$ 由於$Q$是平面上任意一點,因此$W^TQ + b = 0$,點$P$到平面上的距離公式變成 $$ d = \frac{1}{|W|}|W^TP + b| $$

假設數據集\(D = \{(x_1,y_1),(x_2,y_2),\dots,(x_n,y_n)\}\),點到劃分邊界的距離就是\(d = \frac{1}{|W|}|W^Tx_i + b|\),以前咱們說最近樣本點到劃分邊界的距離稱爲間隔,那麼間隔用公式表示就是網絡

\[margin = \min\limits_{i=1,2,\dots,n}(\frac{1}{|W|}|W^Tx_i + b|) \]

這個公式也被稱爲幾何間隔,是咱們的目標。機器學習

由於\(\frac{1}{|W|}\)\(min\)沒有關係,能夠直接提到前面去,函數

\[margin = \frac{1}{|W|}\min\limits_{i=1,2,\dots,n}(|W^Tx_i + b|) \]

如今單獨來看這個公式,咱們能夠將絕對值符號替換掉不?絕對值裏面的數必定是正數,若是全部的數據都會正確分類,沒有那種錯誤的數據,那麼\(W^Tx_i + b\)在負類中的結果是負數,\(W^Tx_i + b\)在正類中的結果是正數,咱們通常將負類表示爲-1,正類表示爲1,那麼就有辦法了,直接將之乘以各自的類別,學習

\[|W^Tx_i + b| = y_i(W^Tx_i + b) \]

咱們再來看看這個式子的含義,數據若是帶入\(y_i(W^Tx_i + b)\),計算出來的確定不是0,由於結果0表明這個點就在這個劃分邊界上,確定是一個數,而且帶入的點離劃分邊界越遠,計算出來的結果就越大,咱們就有更大的把握將之分類正確,那麼\(y_i(W^Tx_i + b)\)其實就是數據分類的置信度,咱們也將之稱爲函數間隔,這裏的置信度不是機率而是一個確切的值,沒有統一的量綱,會出現問題,咱們若是將劃分邊界的\(W\)\(b\)等比例放縮,好比將\(x + y + z + 1 = 0\)變成\(2x + 2y + 2z + 2 = 0\),這樣放縮事後的平面與原來的平面其實仍是同一個平面,平面沒變,點的位置也沒變,那麼幾何間隔不變,可是函數間隔就發生了變化,擴大2倍,那麼咱們就須要將劃分邊界的\(W\)\(b\)的比例定下來,這個比例就是隨便定哪一種,由於它不影響幾何間隔的大小,既然比例能夠隨便定了,那麼我就定成最小點到平面距離爲1的比例,也就是\(y_i(W^Tx_i + b) = 1\),那麼間隔大小就是測試

\[margin = \frac{1}{|W|} \]

咱們的目標就是達到最大間隔的那個劃分邊界,別忘了還有條件,數據可以被徹底正確劃分,用公式表示就是,優化

\[\max\limits_{W,b}(margin) = \max\limits_{W,b}\frac{1}{|W|} \\ s.t. y_i(W^Tx_i + b) \geq 1 \]

對於函數間隔設置爲1,除了以前的代數角度,還能夠從另外一個角度來看,平面的變化就是\(W\)\(b\)的變化,咱們須要找出最好的劃分邊界,那麼就須要不斷地變化\(W\)\(b\)來表示不一樣的劃分邊界,\(W\)\(b\)有倆種,一種是等比例,另外一種是不等比例,等比例變化以後仍是原來的平面,這明顯不是咱們想要的,咱們想要的是不一樣的平面,那麼就須要不等比例,那麼咱們就將函數間隔縮放成1,每次調整參數的時候,都會按比例把函數間隔縮放成1,這樣變化\(W\)\(b\)就不會出現第一種狀況了。spa

如今這個問題就變成了求最大值的問題,在機器學習中就是優化問題,在優化最值問題中,通常都求最小值,由於若是你求最大值的話,你沒有上界,你沒法判斷出結果如何,可是在求最小值中,咱們能夠將0當成下界,因此能夠將之轉化爲最小值問題,就變成了\(\min\limits_{W,b}|W|\)。這裏就須要比較向量的大小,專業化就是度量向量大小,在數學中可使用範式,最經常使用的歐氏距離就是2範式,咱們也將之變成2範式,而且爲了簡化以後的計算,在前面加上\(\frac{1}{2}\),就變成了

\[\min\limits_{W,b}\frac{1}{2}|W|^2 \\ s.t. y_i(W^Tx_i + b) \geq 1,i=1,2,\dots,n \]

咱們能夠利用QP解法來直接求這個最小值,可是一旦要引入核函數,那麼這種解法就很複雜了,沒有效率,所以須要利用優化來求解。

對偶

上面的求最值問題在機器學習中被稱爲優化問題,從導數的時候,咱們就學過求函數的最值,是利用導數爲0,不過那時候是沒有約束條件的,後來上大學,高數中出現求等式約束條件下多元函數的極值,這個時候咱們來看怎麼求,有了約束條件,那麼取值就有範圍,只能在這個等式中的值,咱們能夠經過圖來直觀的感覺,這裏咱們使用的是等高線圖來表示值的大小,而且用公式表示約束就是

\[minf(x) \\ s.t. h(x) = 0 \]


圖3. 等式約束條件下的等高線圖
圖3中藍色線就是值的等高線,是函數$f(x)$的值,黃線就是等式約束條件,等式約束條件就是$h(x)$,在約束條件下,值是先變小,小到必定程度以後開始慢慢變大,當黃線到達極小值的時候,必然會有等高線與之相切,在極值點處$x^{\ast}$,黃線的梯度與等高線垂直,而等高線自身的梯度也是與等高線垂直,那麼黃線的梯度與等高線的梯度共線,天然就有了 $$ \bigtriangledown f(x^{\ast}) = \lambda \bigtriangledown h(x^{\ast}) $$ 而且這個極值點處$x^{\ast}$在等式約束條件$h(x)$中也是存在的,所以也要知足 $$ h(x^{\ast}) = 0 $$ 上面倆個等式就是求極值點所須要的倆個條件,有了它們就能求,爲了能將它們都包含在無約束的優化問題中,就設計出了這樣一個函數。 $$ L(x,\lambda) = f(x) + \lambda h(x) \\ s.t. \lambda \geq 0 $$ 這個就是拉格朗日函數,通常拉格朗日函數都是須要對$x$和$\lambda$求偏導的,咱們求出偏導就發現這倆個偏導和上面的倆個條件是同樣的。 $$ \frac{\partial L}{\partial x} = \bigtriangledown f(x) + \lambda \bigtriangledown h(x) = 0 \\ \frac{\partial L}{\partial \lambda} = h(x) = 0 $$

可是在實際優化問題中不少都是不等式約束,若是隻有一個不等式的話,那麼仍是使用拉格朗日便可。可是不少時候都有不少不等式,就好比咱們上面的那個優化問題,它有\(n\)個不等式,這裏咱們先看有倆個不等式約束條件的狀況,

\[min f(x) \\ s.t. h_1(x) \leqslant 0,h_2(x) \leqslant 0 \]

咱們能夠畫出圖形,就是


圖4. 不等式約束條件下的等高線圖
其中的黃線就是不等式約束$h_2(x)$,綠線就是$h_1(x)$,從圖中能夠看到函數$f(x)$在極值點處的梯度始終在倆條不等式約束梯度的中間,這在向量空間就是表示$\bigtriangledown f(x^{\ast})$能夠由$-\bigtriangledown h_1(x^{\ast})$和$-\bigtriangledown h_2(x^{\ast})$線性表示出來,而且線性表示的係數一定是非負的,公式能夠表示 $$ \bigtriangledown f(x^{\ast}) = -\mu_1\bigtriangledown h_1(x^{\ast})-\mu_2\bigtriangledown h_2(x^{\ast}) \\ \mu_1 \geq 0, \mu_2 \geq 0 $$ 這個倆個分別是梯度爲0條件和可行條件,固然,在約束條件中,還有一種狀況,就是線性表示與其中一些不等式梯度無關,好比再加上一個不等式約束爲$h_3(x)$,在圖中表示就是

圖5. 特殊狀況下不等式約束條件下的等高線圖

從圖中能夠看出灰線所表示的約束與線性表示無關,由於它的最小值不在\(x^{\ast}\),可是咱們的條件仍是要寫成

\[\bigtriangledown f(x^{\ast}) = -\mu_1\bigtriangledown h_1(x^{\ast})-\mu_2\bigtriangledown h_2(x^{\ast})-\mu_3\bigtriangledown h_3(x^{\ast}) \\ \mu_1 \geq 0, \mu_2 \geq 0, \mu_3 \geq 0 \]

那麼其中的\(\mu_3\bigtriangledown h_3(x^{\ast})\)該如何消去呢,那麼再增長一個互補鬆弛條件就是

\[\mu_1h_1(x^{\ast})+\mu_2h_2(x^{\ast})+\mu_3 h_3(x^{\ast}) = 0 \]

由於在極值點處,\(h_1(x^{\ast})\)\(h_2(x^{\ast})\)都是爲0的,可是\(h_3(x^{\ast})\)不是0,用圖中線段的話,\(h_3(x^{\ast}) < 0\),那麼\(\mu_3 = 0\),這樣就能彌補上面條件的缺陷了。這三個條件也被稱爲KKT條件,KKT條件就是存在局部極小值點的必要條件,整理起來就是

\[\mu_1 \geq 0, \mu_2 \geq 0, \mu_3 \geq 0 \\ \bigtriangledown f(x^{\ast}) + \mu_1\bigtriangledown h_1(x^{\ast})+\mu_2\bigtriangledown h_2(x^{\ast})+\mu_3\bigtriangledown h_3(x^{\ast}) =0 \\ \mu_1h_1(x^{\ast})+\mu_2h_2(x^{\ast})+\mu_3 h_3(x^{\ast}) = 0 \]

KKT條件是強對偶關係的充要條件,不少優化原問題很難求解,就須要找出原問題的對偶問題來求解。順便說一下,slater條件是強對偶關係的充分非必要條件。而凸二次規劃問題是必定知足slater條件,咱們的SVM就是一個凸二次規劃問題,由於它的目標函數\(f(x)\)是凸函數,而且約束都是放射函數,因此它必定是知足強對偶關係的,可是下面推導咱們依舊慢慢推導。

上面不管什麼約束,目標函數\(f(x)\)和約束函數\(h(x)\)都是變成一個式子的,所以咱們先將之轉變爲拉格朗日函數,變成無約束問題。將約束條件轉變爲通常形式

\[1-y_i(W^Tx_i + b) \leq 0 \]

以後變成拉格朗日函數

\[L(x,\lambda) = \frac{1}{2}|W|^2 + \sum\limits_{i=1}^{n}\lambda_i(1-y_i(W^Tx_i + b)) \\ s.t. \lambda_i \geq 0 \]

那麼咱們能不能用拉格朗日函數來表示原問題呢?固然也是能夠的,原問題是優化問題,能夠轉變爲極大極小問題,

\[\min\limits_{W,b}\frac{1}{2}|W|^2 = \min\limits_{W,b}\max\limits_{\lambda}L(x,\lambda) \]

咱們能夠分狀況來討論,當\(1-y_i(W^Tx_i + b) > 0\)的時候,\(L(x,\lambda)\)沒有最大值,或者說最大值是\(+\infty\),當\(1-y_i(W^Tx_i + b) \leq 0\)的時候,\(L(x,\lambda)\)有最大值,最大值就是\(\frac{1}{2}|W|^2\),那麼上面的極小極大能夠變成

\[\min\limits_{W,b}\max\limits_{\lambda}L(x,\lambda) = \min\limits_{W,b}(+\infty, \frac{1}{2}|W|^2) = \min\limits_{W,b}\frac{1}{2}|W|^2 \]

其中\(\lambda_i\)用於表達約束,上式中\(\max\limits_{\lambda}L(x,\lambda)\)沒法求,更沒法使用偏導來求,由於式子\(L(x,\lambda)\)中的\(W\)\(b\)沒有固定住。那麼這樣不行的話,就使用對偶問題來求,通常式都是知足弱對偶關係的,也就是

\[\min\limits_{W,b}\max\limits_{\lambda}L(x,\lambda) \leq \max\limits_{\lambda}\min\limits_{W,b}L(x,\lambda) \]

弱對偶關係很簡單,可是咱們想要的是強對偶關係,那麼就須要用到上面所說的KKT條件,那麼咱們求解KKT條件,先來看自帶的約束條件和KKT乘子條件就是

\[1-y_i(W^Tx_i + b) \leq 0 \\ \lambda_i \geq 0 \]

第二個條件就是梯度爲0條件,那麼須要對\(W\)\(b\)進行求導

\[\frac{\partial L}{\partial W} = W - \sum\limits_{i=1}^{n}\lambda_iy_ix_i = 0 \\ \frac{\partial L}{\partial b} = \sum\limits_{i=1}^{n}\lambda_iy_i = 0 \]

第三個條件就是互補鬆弛條件,對於任意的i,都有

\[\lambda_i(1-y_i(W^Tx_i + b)) = 0 \]

知足了這三條要求,咱們就能夠轉化爲對偶問題了,獲得了

\[\max\limits_{\lambda}\min\limits_{W,b}L(x,\lambda) \]

那麼先對其中的\(W\)\(b\)求偏導,其中也就是KKT中的第二個條件,

\[\frac{\partial L}{\partial W} = W - \sum\limits_{i=1}^{n}\lambda_iy_ix_i = 0 \\ \frac{\partial L}{\partial b} = \sum\limits_{i=1}^{n}\lambda_iy_i = 0 \]

那麼能夠獲得

\[W = \sum\limits_{i=1}^{n}\lambda_iy_ix_i \\ \sum\limits_{i=1}^{n}\lambda_iy_i = 0 \]

將之帶入到原方程中去,

\[\begin{align} L(x,\lambda) & = \frac{1}{2}W^TW + \sum\limits_{i=1}^{n}\lambda_i(1-y_i(W^Tx_i + b)) \notag \\ & = \frac{1}{2}\sum\limits_{i=1}^{n}\lambda_iy_ix_i^T\sum\limits_{j=1}^{n}\lambda_jy_jx_j + \sum\limits_{i=1}^{n}\lambda_i-\sum\limits_{i=1}^{n}\lambda_iy_iW^Tx_i -\sum\limits_{i=1}^{n}\lambda_iy_i b \notag \\ & = \frac{1}{2}\sum\limits_{i=1}^{n}\lambda_iy_ix_i^T\sum\limits_{j=1}^{n}\lambda_jy_jx_j + \sum\limits_{i=1}^{n}\lambda_i-\sum\limits_{i=1}^{n}\lambda_iy_i(\sum\limits_{j=1}^{n}\lambda_jy_jx_j^T)x_i -\sum\limits_{i=1}^{n}\lambda_iy_i b \notag \\ & = -\frac{1}{2}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\lambda_iy_ix_i^T\lambda_jy_jx_j + \sum\limits_{i=1}^{n}\lambda_i \notag \\ \end{align} \]

那麼咱們能夠求得

\[\min\limits_{W,b}L(x,\lambda) = -\frac{1}{2}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\lambda_iy_ix_i^T\lambda_jy_jx_j + \sum\limits_{i=1}^{n}\lambda_i \notag \]

最終的式子就是

\[\max\limits_{\lambda}\min\limits_{W,b}L(x,\lambda) = \max\limits_{\lambda}-\frac{1}{2}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\lambda_iy_ix_i^T\lambda_jy_jx_j + \sum\limits_{i=1}^{n}\lambda_i \notag \\ s.t. \lambda_i \geq 0,\sum\limits_{i=1}^{n}\lambda_iy_i = 0 \\ \]

劃分邊界中的\(W^{\ast} = \sum\limits_{i=1}^{n}\lambda_iy_ix_i\),而咱們假設最近樣本點就是\((x_k,y_k)\),還能夠求出\(b^{\ast} = y_k - \sum\limits_{i=1}^{n}\lambda_iy_ix_i^Tx_k\)

超平面就是\(f(x) = sign(W^{T\ast}x+b^{\ast})\),還缺乏的KKT條件就是

\[\lambda_i \geq 0 \\ 1-y_i(W^Tx_i + b) \leq 0 \\ \lambda_i(1-y_i(W^Tx_i + b)) = 0 \]

此時會過來看SVM,叫作支持向量機,其中的支持向量,其實就是最近樣本點,爲何這樣說呢?咱們看第四個條件,也就是\(\lambda_i(1-y_i(W^Tx_i + b)) = 0\),只有當\(y_i(W^Tx_i + b) = 1\)的時候,\(\lambda_i\)纔不會爲0,若是\(y_i(W^Tx_i + b) > 1\),那麼\(\lambda_i\)爲0,\(\lambda_i\)爲0的話就對超平面起不到任何的做用,你能夠看\(W\)\(b\)的解。因此SVM關注的只有那些最近樣本點,以下圖6中過虛線的那三個點就是支持向量,這也是和邏輯迴歸最大的不一樣,邏輯迴歸關注的是全部的樣本點。那麼問題來了,支持向量多仍是少的時候,比較好呢?支持向量越多,訓練獲得的模型越複雜,就會有過擬合的風險,可是這也不是絕對的。


圖6. SVM支持向量

SMO

對於上面的那個最終式子的求解,這種極值問題,以前邏輯迴歸中使用的梯度降低法,可是這種要求的是多個值,使用的就是座標降低,每次沿着座標的方向更新一次,就是每一個值依次更新,好比在咱們這個問題中,咱們要更新\(\lambda_1\)的話,咱們就須要固定其餘的\(\lambda_i\)的值,而後求導進行更新,可是不能忘了咱們的問題是有約束條件的,其中\(\sum\limits_{i=1}^{n}\lambda_iy_i = 0\)就說明若是固定其餘的話,\(\lambda_1\)就徹底等於一個固定的值了,\(\lambda_1 = -\sum\limits_{i=2}^{n}\lambda_iy_i\),不可能再更新啥的。每次更新一個值行不通的話,咱們就每次固定住其餘值,而後更新倆個值\(\lambda_1\)\(\lambda_2\),這樣的話,就不會出現上面的狀況了,這就是序列最小優化算法SMO的基本思想,其中最小就是最小有倆個。

那麼如何更新這倆個值呢?先來看如何更新最開始的\(\lambda_1\)\(\lambda_2\),咱們拿出最終式,將這個求最大值的式子先轉化爲最小值。

\[\max\limits_{\lambda}-\frac{1}{2}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\lambda_iy_ix_i^T\lambda_jy_jx_j + \sum\limits_{i=1}^{n}\lambda_i = \min\limits_{\lambda}\frac{1}{2}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\lambda_iy_ix_i^T\lambda_jy_jx_j - \sum\limits_{i=1}^{n}\lambda_i \]

咱們設置方程\(K(\lambda_1,\lambda_2) = \frac{1}{2}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\lambda_iy_ix_i^T\lambda_jy_jx_j - \sum\limits_{i=1}^{n}\lambda_i\),而後將這個分解開,其實就是將關於\(\lambda_1\)\(\lambda_2\)的式子提取出來,由於只有他們倆是未知的,其餘都被固定了,能夠當作實數。

\[\begin{align} K(\lambda_1,\lambda_2) & = \frac{1}{2}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\lambda_iy_ix_i^T\lambda_jy_jx_j - \sum\limits_{i=1}^{n}\lambda_i \notag \\ & = \frac{1}{2}\lambda_1y_1x_1^T\lambda_1y_1x_1+ \lambda_1y_1x_1^T\lambda_2y_2x_2 + \frac{1}{2}\lambda_2y_2x_2^T\lambda_2y_2x_2 - (\lambda_1 + \lambda_2)+\lambda_1y_1\sum\limits_{i=3}^{n}\lambda_iy_ix_ix_1 + \lambda_2y_2\sum\limits_{i=3}^{n}\lambda_iy_ix_ix_2 + C \notag \\ \end{align} \]

式子中的C就是表明了\(\sum\limits_{i=3}^{n}\lambda_i\),其中\(y_i\)就是標籤,只有1和-1這倆種值,因此\(y_i^2 = 1\),咱們將倆個\(x_i\)\(x_j\)相乘標記爲\(k_{ij}\),而且\(v_1 = \sum\limits_{i=3}^{n}\lambda_iy_ix_1x_i, v_2 = \sum\limits_{i=3}^{n}\lambda_iy_ix_2x_i\),那麼上面的式子就能夠化簡成

\[\begin{align} K(\lambda_1,\lambda_2) & = \frac{1}{2}\lambda_1y_1x_1^T\lambda_1y_1x_1+ \lambda_1y_1x_1^T\lambda_2y_2x_2 + \frac{1}{2}\lambda_2y_2x_2^T\lambda_2y_2x_2 - (\lambda_1 + \lambda_2)+\lambda_1y_1\sum\limits_{i=3}^{n}\lambda_iy_ix_ix_1 + \lambda_2y_2\sum\limits_{i=3}^{n}\lambda_iy_ix_ix_2 + C \notag \\ & = \frac{1}{2}\lambda_1^2k_{11}+ \lambda_1\lambda_2y_1y_2k_{12} + \frac{1}{2}\lambda_2^2k_{22} - (\lambda_1 + \lambda_2)+\lambda_1y_1v_1 + \lambda_2y_2v_2 + C \notag \\ \end{align} \]

由於\(\sum\limits_{i=1}^{n}\lambda_iy_i = 0\),除了\(\lambda_1\)\(\lambda_2\),其餘的都是固定的,那麼\(\lambda_1y_1 + \lambda_2y_2 = \delta\),因此能夠表示\(\lambda_1 = y_1(\delta- \lambda_2y_2)\),所以能夠帶入式中,式子如今只有一個變量\(\lambda_2\),

\[K(\lambda_2) = \frac{1}{2}(\delta- \lambda_2y_2)^2k_{11}+ (\delta- \lambda_2y_2)\lambda_2y_2k_{12} + \frac{1}{2}\lambda_2^2k_{22} - ( y_1(\delta- \lambda_2y_2) + \lambda_2)+(\delta- \lambda_2y_2)v_1 + \lambda_2y_2v_2 + C \]

能夠對\(\lambda\)進行求導,這個求導化簡能夠在紙上寫一下,式子不少很長,我怕打錯了,直接寫出化簡的最終式子。

\[\frac{\partial K}{\partial \lambda_2} = 0 獲得\\ (k_{11} + k_{22} - 2k_{12})\lambda_2 = y_2(y_2 - y_1 + \delta k_{11} - \delta k_{12} + v_1 - v_2) \]

而且其中的\(\delta = \lambda_1^{old}y_1 + \lambda_2^{old}y_2\),帶入其中進行化簡,爲了區分開,將式子左邊的\(\lambda_2\)變成\(\lambda_2^{new}\),設置其中的\(g(x) = \sum\limits_{i=1}^{n}\lambda_iy_ik(x_i,x)+b\),這個\(g(x)\)就表明了預測結果,從上面的\(W\)的求解式能夠看出\(g(x) = W^Tx+b\),咱們可使用\(g(x)\)來替換式子中的\(v_i\),那麼\(v_1 = g(x_1) - y_1\lambda_1k_{11} - y_2\lambda_2k_{12}-b\),最終式子化簡變成了

\[\lambda_2^{new} = \lambda_2^{old} + \frac{y_2((g(x_1) - y_1) - (g(x_2) - y_2))}{k_{11} + k_{22} - 2k_{12}} \]

在這個式中,咱們須要考慮倆個範圍,第一個就是\(\lambda_i\)的可行域,第二個就是\(k_{11} + k_{22} - 2k_{12}\)的大小。

以前咱們提過\(\lambda_1y_1 + \lambda_2y_2 = \delta\),而且\(\lambda_1\)是一個實數,自己就是有範圍的,咱們設置爲\(0 \leq \lambda_i \leq C\),而且\(\lambda_i\)也是須要知足\(\lambda_1y_1 + \lambda_2y_2 = \delta\),當\(y_1 = y_2\),那麼\(\lambda_1 + \lambda_2 = \delta\),這邊是1仍是-1都是沒有影響,當\(y_1 \ne y_2\),那麼\(\lambda_1 - \lambda_2 = \delta\),咱們畫出這倆個式子的圖像,以下圖7所示。


圖7. 可行域範圍
在左圖中,也就是當$y_1 \ne y_2$,$\lambda_1 - \lambda_2 = \delta$的時候,能夠看到有倆種狀況,第一種狀況就是$\delta < 0$,這時$\delta_2 \in [-\delta,C]$,第二種狀況就是$\delta > 0$,這時$\delta_2 \in [0,C-\delta]$,那麼最小值$low = max(0,-\delta)$,最大值$high = min(C,C-\delta)$。在右圖中,當$y_1 = y_2$,$\lambda_1 + \lambda_2 = \delta$的時候,也是倆種狀況,第一種狀況就是$\delta > C$,這時$\delta_2 \in [\delta - C,C]$,第二種狀況就是$0 < \delta < C$,這時$\delta_2 \in [0,\delta]$,最小值$low = max(0,\delta)$,最大值$high = min(C,\delta-C)$。因此$low$和$high$是分倆種狀況的,這裏咱們統一用$low$和$high$表示,在代碼中比較$y_1$和$y-2$便可,這就是它的定義域,所以 $$ \lambda_2^{new} = \begin{cases} hight & \lambda_2^{new} > high,\\ \lambda_2^{new} & low \leq \lambda_2^{new} \leq high,\\ low & \lambda_2^{new} < low,\\ \end{cases} $$ 以後咱們還須要考慮$k_{11}+k_{22}-2k_{12}$的取值範圍,當它$k_{11}+k_{22}-2k_{12} > 0$,那麼最小值就在可行域中取到,可是若是$k_{11}+k_{22}-2k_{12} \leq 0$,那麼最小值就在邊界$low$和$high$處取到了。

此時\(\lambda_2\)就被計算出來了,下面就是計算\(\lambda_1\),仍是經過約束條件\(\lambda_1^{old}y_1 + \lambda_2^{old}y_2 = \lambda_1^{new}y_1 + \lambda_2^{new}y_2\)進行計算,下面就是推導過程。

\[\begin{align} \lambda_1^{new}y_1 + \lambda_2^{new}y_2 & = \lambda_1^{old}y_1 + \lambda_2^{old}y_2 \notag \\ \lambda_1^{new}y_1 & = \lambda_1^{old}y_1 + \lambda_2^{old}y_2 - \lambda_2^{new}y_2 \notag \\ \lambda_1^{new} & = \lambda_1^{old} + (\lambda_2^{old} - \lambda_2^{new})y_1y_2 \notag \\ \end{align} \]

在式子\(g(x) = \sum\limits_{i=1}^{n}\lambda_iy_ik(x_i,x)+b\)中也出現了b,那麼咱們還能夠更新b,由於SMO的本質就是不斷地移動劃分邊界來看誰最好,因此也是須要更新b的。

\[\begin{align} b_1^{new} & = y_1 - W^Tx_1 \notag \\ & = y_1 - \sum\limits_{i=1}^{n}\lambda_iy_ik_{i1} \notag \\ & = y_1 - \lambda_1^{new}y_1k_{11} - \lambda_2^{new}y_2k_{21} - \sum\limits_{i=3}^{n}\lambda_iy_ik_{i1} \notag \\ \end{align} \]

咱們須要化簡上式中的\(y_1 - \sum\limits_{i=3}^{n}\lambda_iy_ik_{i1}\),咱們來看預測差值,也就是

\[\begin{align} E_1 & = g(x_1) - y_1 \notag \\ & = \sum\limits_{i=1}^{n}\lambda_iy_ik(x_i,x_1)+b^{old} - y_1 \notag \\ & = \lambda_1^{old}y_1k_{11} + \lambda_2^{old}y_2k_{21} + \sum\limits_{i=3}^{n}\lambda_iy_ik_{i1} - y_1 +b^{old} \notag \\ \end{align} \]

從上式中能夠得知\(y_1 - \sum\limits_{i=3}^{n}\lambda_iy_ik_{i1} = -E_1 + \lambda_1^{old}y_1k_{11} + \lambda_2^{old}y_2k_{21} +b^{old}\),所以b中的更新能夠進行替換。

\[\begin{align} b_1^{new} & = -E_1 + \lambda_1^{old}y_1k_{11} + \lambda_2^{old}y_2k_{21} +b^{old} - \lambda_1^{new}y_1k_{11} - \lambda_2^{new}y_2k_{21} \notag \\ & = -E_1 - y_1k_{11}(\lambda_1^{new} - \lambda_1^{old}) + y_2k_{21}(\lambda_2^{new} - \lambda_2^{old}) +b^{old} \notag \\ \end{align} \]

那麼全部解的推導式子都有了,更新只要根據式子進行更新就行。

上面的式子就能更新,選出倆個\(\lambda_i\),以後根據公式求得\(\lambda_i\),而後進行可行域的判斷,是否超出了上下界,以後更新b。以後在初始選取倆個\(\lambda_i\)方面出現了不少方法,第一個\(\lambda_i\)大多數都是利用KKT條件,也就是選取不知足KKT條件,那爲何要選擇呢?這是由於SMO其實就是調整劃分邊界的過程,其中確定有不知足\(y_i(W^Tx_i+b) \geq 1\)的存在,若是一個\(\lambda_i\)違背KKT條件程度越大,它就表現得越靠近劃分邊界,最開始的最大值就會越小,它對最開始的最大化函數的減幅也是最大的,因此要先優化它。在代碼中

# 檢查是否知足KKT條件
if ((labelMat[i]*error < -toler) and (alphas[i] < C)) \
               or ((labelMat[i]*error > toler) and (alphas[i] > 0)):

其中labelMat[i]就是數據類別,error就是偏差,表現得就是\(error = W^Tx_i + b - y_i\),toler就是本身設置的容錯率,alphas[i]就是\(\lambda_i\),先看第一個條件,其中的labelMat[i]*error < -toler代表了

\[y_i(W^Tx_i + b - y_i) < -toler \\ y_i(W^Tx_i + b) - 1 + toler < 0 \\ 那麼可得y_i(W^Tx_i + b)<1 \]

其中若是有軟間隔的話,下面會講,\(y_i(W^Tx_i + b)<1\)的數據都會被調整到支持向量上,這時\(\lambda_i = C\),可是\(\lambda_i < C\),這樣的數據就不知足KKT條件了。第二個條件就是labelMat[i]*error > toler,那麼

\[y_i(W^Tx_i + b - y_i) > toler \\ y_i(W^Tx_i + b) - 1 - toler > 0 \\ 那麼可得y_i(W^Tx_i + b)>1 \]

\(y_i(W^Tx_i + b)>1\)表明了它不是支持向量,是那些比較遠的數據,這類數據若是想要知足KKT條件的話,\(\lambda_i = 0\),可是條件是\(\lambda_i > 0\),那麼天然不知足KKT條件了。

對於第二個\(\lambda_i\)的選擇,也有不少種方法,其中表明的就是選取與第一個差別最大的數據,能使目標函數有足夠大的變化。

那麼整理一下整個過程:

  1. 先選取一個\(\lambda_i\),計算它的偏差,查看是否知足KKT條件(是否被優化);
  2. 知足條件,使用方法選擇另一個\(\lambda_j\),再計算它的偏差;
  3. 約束\(\lambda_i\)\(\lambda_j\)的可行域範圍;
  4. 下面就是求新的\(\lambda_i\)的值了,根據是\(\lambda_i\)新和舊的公式,先計算那個分母,查看它的值;
  5. 根據公式計算出新的值,優化幅度不大的話,能夠結束,進行下一輪;
  6. 計算出另一個aj的新值;
  7. 計算出b的值;
  8. 若是已經沒有被優化的次數超過了限制次數,說明不用優化了;

軟間隔SVM

到目前爲止,咱們的SVM還很脆弱,它只能被用在線性可分的數據,而且還不能有噪聲點,這樣的模型是沒法使用到現實數據中,由於現實數據的複雜性,會出現不少噪聲點和離羣點,


圖8. 有噪聲點的狀況

從圖8中看出,SVM的要求很嚴格,即便你分類正確了,也要達到必定的置信度,小於這個置信度,你依然會有損失的存在。咱們須要處理這些在虛線內部的點,也就是讓SVM放寬條件,容許模型犯一點小錯誤,讓目標函數加上損失。

\[min\frac{1}{2}|W|^2 + loss \]

關鍵是什麼樣的損失函數可以知足SVM?SVM模型只是由支持向量點決定的,對於普通的點,那是沒有任何關係的,因此損失函數也要考慮到這一點,咱們能夠先來列出要求

  1. 若是\(y_i(W^Tx_i + b) \geq 1\)\(loss = 0\)
  2. 若是\(y_i(W^Tx_i + b) < 1\)\(loss = 1 - y_i(W^Tx_i + b)\)
    這樣的話,咱們將之組合起來,變成

\[loss = max\{0, 1-y_i(W^Tx_i + b)\} \]

這樣就能保持SVM解的稀疏性,咱們將之稱爲hingle loss,合頁損失。簡單畫一下它的圖像就是


圖9. hingle loss
這樣咱們就能夠將損失帶入到目標函數中,變成 $$ \min\limits_{W,b}\frac{1}{2}|W|^2 + C\sum\limits_{i=1}^nmax\{0, 1-y_i(W^Tx_i + b)\} \\ s.t. y_i(W^Tx_i + b) \geq 1,i=1,2,\dots,n $$ 這樣是能夠繼續簡化的,就是將 $$ \xi_i = 1-y_i(W^Tx_i + b), \xi_i \geq 0 $$ 目標函數就變成了 $$ \min\limits_{W,b}\frac{1}{2}|W|^2 + C\sum\limits_{i=1}^n\xi_i \\ s.t. y_i(W^Tx_i + b) \geq 1 - \xi_i,i=1,2,\dots,n \\ \xi_i \geq 0 $$ 上面這個就是軟間隔SVM的目標函數,它的求解與上面的硬間隔SVM是同樣的。軟間隔SVM是容許有一點點錯誤的數據存在,可是若是數據徹底不是線性可分的呢,那麼上面的方法都沒法解決,那該如何?

核函數

咱們來看一個經典的異或問題,


圖10. 異或問題
圖中有四個點,原點爲一類,叉點爲一類,這些數據就不是線性可分,那麼上面的SVM不能應用到這類數據中,這樣的話,咱們辛辛苦苦推導了那麼久的SVM,原來這麼雞肋,由於現實中還有更復雜的數據,SVM難道都不行嗎?咱們先來看這個異或問題該如何解決,SVM所處理的數據確定是線性可分的,這一點沒法改變,那咱們能不能改變其餘方面,好比將這些線性不可分的點變成線性可分的點,能夠試一試,畢竟實踐出真知,咱們將二維變成三維,再加上一個特徵,這個特徵值爲$(x_1 - x_2)^2$,那麼其中的叉點變成了(0,1,1)和(1,0,1),圓點變成了(0,0,0)和(1,1,0),畫出這個三維圖像就是

圖10. 異或問題
咱們能夠看到三維以後,數據就變得線性可分了,這也是cover定理,高維比低維更易線性可分,那麼咱們能夠直接在SVM中將數據更成高維,讓它變得線性可分,這種利用高維線性可分的方法也被稱爲核方法,咱們將$\phi(x)$稱爲數據變成高維的方法,那麼全部的數據$x$都要變成$\phi(x)$,咱們上面求出SVM的最終解就變成了 $$ \max\limits_{\lambda}-\frac{1}{2}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\lambda_iy_ix_i^T\lambda_jy_jx_j + \sum\limits_{i=1}^{n}\lambda_i \to \max\limits_{\lambda}-\frac{1}{2}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\lambda_iy_i\phi(x_i)^T\lambda_jy_j\phi(x_j) + \sum\limits_{i=1}^{n}\lambda_i \notag $$ 在不少實際的應用中,$\phi(x)$函數須要將數據變成很高的維度甚至無限維,這樣的話,$\phi(x)$的計算就會變得很複雜,一旦複雜,就很難計算,式中須要先計算$\phi(x_i)^T$,再計算$\phi(x_j)$,最後還要計算倆個式子的伺機$\phi(x_i)^T\phi(x_j)$。一看就知道很複雜,那麼我能不能直接計算出$\phi(x_i)^T\phi(x_j)$的值呢,不用計算其中的$\phi(x_i)^T$和$\phi(x_j)$,固然也是能夠的,這種直接計算的技巧被稱爲核技巧,那麼咱們定義出 $$ K(x_i,x_j) = \phi(x_i)^T\phi(x_j) = <\phi(x_i), \phi(x_j)> $$ 其中$<>$表明內積,$K(x_i,x_j)$就被稱爲核函數,在不少文獻中也會嚴格的稱它爲正定核函數,而通常核函數的定義就是 $$ K: \chi \times \chi \to R \\ \forall x,z \in \chi,稱K(x,z)爲核函數 $$ 能夠看出通常核函數只要是能將數據映射到實數域中就能夠了,並不要求是某個函數的內積。而正定核函數是要求內積的,定義就是 $$ K: \chi \times \chi \to R, \forall x,z \in \chi,有K(x,z), \\ 若是\exists \phi: \chi \to R, 而且\phi \in 希爾伯特空間, \\ K(x,z) = <\phi(x), \phi(z)>,那麼稱K(x,z)爲正定核函數. $$ 那麼咱們怎麼證實一個函數是正定核函數呢?不能用定義來證實啊,也沒法證實,那麼就有了下面的條件 $$ K: \chi \times \chi \to R, \forall x,z \in \chi,有K(x,z), \\ 若是K(x,z)知足對稱性和正定性,那麼K(x,z)就是正定核函數。 $$ 其中的對稱性就是$K(x,z) = K(z,x)$,而正定性就是任意取N個元素,都是屬於$\chi$,對應的gram matrix是半正定的,而其中的gram matrix就是$G = [K(x_i,x_j)]$,下面就是數學知識了,先來看希爾伯特空間,可能一上來就說希爾伯特空間比較懵,咱們先來看最簡單的線性空間,線性空間只定義了數乘與加法,可是咱們想研究向量的長度怎麼辦,就加入範式,還想研究向量的角度怎麼辦,就加入內積,變成了內積空間,若是咱們還想研究收斂性,就要定義完備性,而完備的內積空間就是希爾伯特空間,完備性就是空間函數的極限仍是在希爾伯特空間中,內積也是有對稱性、正定性和線性,其中的對稱性也是上面那種,$ = $,正定性就是$ \geq 0$,而且等於0的狀況只有f = 0,線性就是$ = r_1 + r_2 $。

這裏咱們例舉出幾個常見的核函數,對於這方面,個人瞭解也不是很深,

  1. 線性核,\(K(x_i,x_j) = x_i^Tx_j\),其實就是沒核,仍是之前樣子。
  2. 多項式核,\(K(x_i,x_j) = (x_ix_j + R)^d\),R表明一個設定的數,d就是次方,當d=1的時候,就是線性核。
  3. 高斯核,也稱爲RBF核,\(K(x_i,x_j) = e^{-\frac{|x_i - x_j|^2}{2\sigma^2}}\),這是最經常使用的核函數。
  4. 拉普拉斯核,\(K(x_i,x_j) = e^{-\frac{|x_i - x_j|}{\sigma}}\)
  5. sigmoid核,\(K(x_i,x_j) = tanh(\beta x_i^Tx_j + \theta)\)

下面咱們看一下最多見的RBF核函數是如何將數據變成無限維的,其中用到了泰勒公式

\[e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \dots = \sum\limits_{n=0}^{N}\frac{x^n}{n!} \]

推導以下:

\[\begin{align} K(x_i,x_j) & = e^{-\frac{|x_i - x_j|^2}{2\sigma^2}} \notag \\ & = e^{-\frac{x_i^2}{2\sigma^2}} e^{-\frac{x_j^2}{2\sigma^2}} e^{\frac{x_ix_j}{\sigma^2}} \notag \\ & = e^{-\frac{x_i^2}{2\sigma^2}} e^{-\frac{x_j^2}{2\sigma^2}} \sum\limits_{n=0}^{N}\frac{(\frac{x_ix_j}{\sigma^2})^n}{n!} \notag \\ & = \sum\limits_{n=0}^{N} \frac{1}{n!\sigma^{2n}} e^{-\frac{x_i^2}{2\sigma^2}}x_i^n e^{-\frac{x_j^2}{2\sigma^2}}x_j^n \notag \\ & = \sum\limits_{n=0}^{N}(\frac{1}{n!\sigma^{2n}} e^{-\frac{x_i^2}{2\sigma^2}}x_i^n)( \frac{1}{n!\sigma^{2n}}e^{-\frac{x_j^2}{2\sigma^2}}x_j^n) \notag \\ & = \phi(x_i)^T\phi(x_j) \end{align} \]

從上面能夠看出RBF核函數已經將\(x_i\)\(x_j\)變成了無限維的

\[x_i = e^{-\frac{x_i^2}{2\sigma^2}}(1,\frac{x_i}{\sigma^2},\frac{x_i^2}{2\sigma^{2\times 2}},\dots) \]

核函數不僅是在SVM中應用到,其餘機器學習模型中也會用到核函數這一律念,畢竟它的思想都是通用,就是高維比低維更加線性可分。

總結

支持向量機在個人研究中用的不多,主要我一直認爲它只用於二分類中,而且我一直對核函數並無深刻的瞭解過,對於SVM最新的發展研究也沒有關注過,之前用過一次,就用到個人集成模型中做爲個人基學習器,而且也用到了SVM的增量學習,其實我看的是一箇中文文獻中的SVM增量學習,算法也是很是簡單,主要仍是看後來的數據是否是支持向量,可是後來那個模型失敗了,就沒搞過SVM。本文中全部的代碼都在個人github