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

長安不亂發表於2020-08-17

SVM,稱為支援向量機,曾經一度是應用最廣泛的模型,它有很好的數學基礎和理論基礎,但是它的數學基礎卻比以前講過的那些學習模型複雜很多,我一直認為它是最難推導,比神經網路的BP演算法還要難懂,要想完全懂這個演算法,要有很深的數學基礎和優化理論,本文也只是大概討論一下。本文中所有的程式碼都在我的github

硬間隔SVM推導

如果現在我們需要對一堆資料進行二分類處理,並且這些資料都是線性可分的(一條直線就能將資料區分開),那麼你會如何對之進行劃分?如圖1。

機器學習:支援向量機(SVM)
圖1. 線性可分圖
我們只需要在倆類資料的中間找出一條直線即可,如果資料是三維的,那麼我們需要找出中間的切分面,能將倆類資料劃分開的直線有很多,在圖1中就有三條,那麼你如何判斷哪一條才是最適合的呢?直觀來看,肯定是中間的藍色線,因為黃線太靠近藍點,綠線太靠近紅色,這樣的線對樣本擾動的容忍性低,在測試集中很容易就會出錯,而藍色線是受影響最小的,因為它距離倆類樣本最遠,這樣才具有泛化能力,那麼我們需要找出的線就是距離倆類樣本最遠,其實就是最中間的線,從圖1中可以看出平面上有很多點,問題在於哪些點才能衡量出線到倆類資料的距離呢?那肯定是距離線最近的那些點,我們把最近樣本點到劃分邊界的距離稱為間隔。我們的目標就是達到最大間隔的那個劃分邊界。下面先來求間隔。

間隔

\(W^TX + b = 0\)來表示劃分邊界,我們先計算點到這個劃分邊界的距離,因為資料可能是高維的,所以不能用點到直線的距離,應該計算點到面的距離。圖2就是計算其中有一個\(P\)到面的距離。

機器學習:支援向量機(SVM)
圖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\)就不會出現第一種情況了。

現在這個問題就變成了求最大值的問題,在機器學習中就是優化問題,在優化最值問題中,一般都求最小值,因為如果你求最大值的話,你沒有上界,你無法判斷出結果如何,但是在求最小值中,我們可以將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 \]
機器學習:支援向量機(SVM)
圖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 \]

我們可以畫出圖形,就是

機器學習:支援向量機(SVM)
圖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)$,在圖中表示就是
機器學習:支援向量機(SVM)
圖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中過虛線的那三個點就是支援向量,這也是和邏輯迴歸最大的不同,邏輯迴歸關注的是所有的樣本點。那麼問題來了,支援向量多還是少的時候,比較好呢?支援向量越多,訓練得到的模型越複雜,就會有過擬合的風險,但是這也不是絕對的。

機器學習:支援向量機(SVM)
圖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所示。

機器學習:支援向量機(SVM)
圖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還很脆弱,它只能被用線上性可分的資料,並且還不能有噪聲點,這樣的模型是無法使用到現實資料中,因為現實資料的複雜性,會出現很多噪聲點和離群點,

機器學習:支援向量機(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,合頁損失。簡單畫一下它的影像就是

機器學習:支援向量機(SVM)
圖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是允許有一點點錯誤的資料存在,但是如果資料完全不是線性可分的呢,那麼上面的方法都無法解決,那該如何?

核函式

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

機器學習:支援向量機(SVM)
圖10. 異或問題
圖中有四個點,原點為一類,叉點為一類,這些資料就不是線性可分,那麼上面的SVM不能應用到這類資料中,這樣的話,我們辛辛苦苦推導了那麼久的SVM,原來這麼雞肋,因為現實中還有更復雜的資料,SVM難道都不行嗎?我們先來看這個異或問題該如何解決,SVM所處理的資料肯定是線性可分的,這一點無法改變,那我們能不能改變其他方面,比如將這些線性不可分的點變成線性可分的點,可以試一試,畢竟實踐出真知,我們將二維變成三維,再加上一個特徵,這個特徵值為$(x_1 - x_2)^2$,那麼其中的叉點變成了(0,1,1)和(1,0,1),圓點變成了(0,0,0)和(1,1,0),畫出這個三維影像就是
機器學習:支援向量機(SVM)
圖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) = $$ 其中$<>$代表內積,$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) = ,那麼稱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

相關文章