>>>SVM之核函數
上一篇SVM之對偶問題中討論到,SVM最終形式化為以下優化問題\[\begin{align}\left\{ \begin{matrix}\underset{\alpha }{\mathop{\max }}\,\sum\limits_{i}{{{\alpha }_{i}}}-\frac{1}{2}\sum\limits_{i,j}{{{\alpha }_{i}}{{\alpha }_{j}}{{y}^{i}}{{y}^{j}}<{{x}^{i}},{{x}^{j}}>} \\s.t.\left\{ \begin{matrix}{{\alpha }_{i}}\ge 0 \\\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}}=0 \\\end{matrix} \right. \\\end{matrix} \right.\end{align}\]
而且最終的判別式可以寫成\[\begin{align}{{w}^{T}}x+b=\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}<{{x}^{i}},x>}+b\end{align}\]
之前已對(1)的求解做了簡單提及,需要注意的是,優化問題(1)雖然可以直接求解,但是要基於訓練數據線性可分的基礎,如果數據本身線性不可分呢?
解決方法之一就是將數據,或者更加正式的稱為特征,向高維映射,以期待映射后數據在更高維的空間中數據可分,這樣就可以在新的高維空間中繼續使用之前的方法。
簡單起見,考慮一維不可分的數據
顯然,原始的一維數據是線性不可分的,現在取映射$\phi (x)=(x,{{x}^{2}})$ 將原始的一維數據映射到二維,數據變的線性可分了。這種向高維映射的方法一定程度上解決的線性不可分問題,但同時也帶來了相當的計算復雜度。
SVM現在將在新的二維空間運行,原來問題中的$x$ 將用$\phi (x)$ 取代,優化問題中向量內積$<{{x}^{i}},{{x}^{j}}>$ 也將被$<\phi ({{x}^{i}}),\phi ({{x}^{j}})>$ 取代,判別函數中向量內積$<{{x}^{i}},x>$也將被$<\phi ({{x}^{i}}),\phi (x)>$取代,換句話說,我們需要將原來所有一維訓練樣本首先一個個計算,映射到新的二維空間,然后在二維空間中計算新樣本之間的內積。這與原來直接在一維空間中直接計算一維向量內積相比,雖然並不會復雜多少,然而隨着樣本維度和映射后維度的增加,計算復雜的的提升是非常顯著的,甚至變得不可計算。(這不是危言損聽,比如高斯核將樣本映射的無限維空間,那么怎么計算呢?)
已經說過,上面的過程是由兩個步驟組成的。首先是映射,其次是計算映射后的內積。但其實我們真正需要的知道的只是映射后的內積,我們不需要$\phi (x)$ 、$\phi ({{x}^{i}})$ 、$\phi ({{x}^{j}})$ ,我們真正需要的是$<\phi ({{x}^{i}}),\phi ({{x}^{j}})>$和$<\phi ({{x}^{i}}),\phi (x)>$,這對優化問題(1)和判別函數(2)來說已經足夠了。然而,怎么繞過映射本身而直接求解映射后向量內積呢?核函數就是用來做這樣的事情。
核函數定義為 \[\begin{align}K(x,y)=<\phi (y),\phi (y)>\end{align}\]
以上核函數的定義應該來講是“意義化”的,而不是“計算化”的,定義中出現$\phi (x)$ 、$\phi (y)$ 並不表明需要顯式計算映射本身,而是來說明核函數的意義是映射后向量的內積,而核函數“計算化”的定義是需要我們自己設計給出的。
還是上面一維到二維的例子,考慮兩個一維樣本$x$和$y$ 映射到二維樣本$\phi (x)=(x,{{x}^{2}})$ 和$\phi (y)=(y,{{y}^{2}})$,則\[\begin{align*}<\phi (x),\phi (y)> & ={{(x,{{x}^{2}})}^{T}}(y,{{y}^{2}}) \\& =xy+{{(xy)}^{2}} \\\end{align*}\]
那么,我們就可以定義對應的核函數為\[K(x,y)=xy+{{(xy)}^{2}}\],這和映射到二維后再計算內積的結果是一樣的,但是現在直接計算$K(x,y)=xy+{{(xy)}^{2}}$使得我們不需要關心映射本身,而且計算是在原來的一維空間進行的。當樣本維度增加時,這樣方法帶來的計算優勢是不言而喻的。這就是核函數的主要作用,它隱藏映射本身而直接在低維空間計算高維空間向量的內積,顯著降低計算復雜度。這簡直就像加了特技,duang一下就完成了高維空間內積的計算,所以有些文獻將核函數稱為kernel trick,是trick,是特技!
那么,當我們需要將樣本向高維空間映射以期望將數據變得線性可分時,怎樣找到這種映射對應的核函數呢?上面一維到二維的示例過於簡單,可以很方便的找到對應的核函數,當樣本維度較高時,設計一個核函數並非易事。幸運的是,牛人們已經幫我們設計好了許多核函數,所以我們現在不需要根據映射去設計對應的精確的核函數,而是反過來選取設計好的核函數來盡可能滿足我們的映射,保證映射后數據盡可能的線性可分。
常見的核函數有高斯核、多項式核、感知器核等。
高斯核:$K(x,y)=\exp (-\frac{{{\left\| x-y \right\|}^{2}}}{2{{\sigma }^{2}}})$
多項式核:$K(x,y)={{(<x,y>+c)}^{d}}$
感知器核:$K(x,y)=\tanh ({{\rho }_{1}}<x,y>+{{\rho }_{2}})$
這些核函數都對應不同的映射,擁有不同的性質。比如高斯核對應一個到無限維空間的映射,而且高斯核的意義比較明確:對原空間內相近的兩個向量$x$、$y$計算 結果的數值較大,反之較小,參數$\sigma $ 控制這核函數值隨${{\left\| x-y \right\|}^{2}}$變化的速度;多項式核對應一個到$C_{n+d}^{d}$ 維的映射。僅從這兩個其他核函數的映射維度來看,核函數在降低計算復雜度上是很顯著的,比如對多項式核,可以取$n$ (原樣本維度)和$d$ 為不同值,看看映射后維度有多高。其他關於核函數本身的性質可以去查看專門的文獻。作為一般應用,以上幾個核函數可能在很多情況下已經夠用了,而且高斯核應用最廣。
已經選取好核函數之后,需要做到就是將原來的優化問題和判別函數中的向量內積用核函數替代,這樣優化問題變為:\[\begin{align}\left\{ \begin{matrix}\underset{\alpha }{\mathop{\max }}\,\sum\limits_{i}{{{\alpha }_{i}}}-\frac{1}{2}\sum\limits_{i,j}{{{\alpha }_{i}}{{\alpha }_{j}}{{y}^{i}}{{y}^{j}}K(x{{,}^{i}}{{x}^{j}})} \\s.t.\left\{ \begin{matrix}{{\alpha }_{i}}\ge 0 \\\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}}=0 \\\end{matrix} \right. \\\end{matrix} \right.\end{align}\]
判別函數變為:\[\begin{align}{{w}^{T}}x+b=\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}K({{x}^{i}},x)}+b\end{align}\]
現在我們去求解優化問題(4)后用判別式(5)對新樣本分類。
需要注意,核函數不是SVM的專利,只是在SVM中的一個應用,其他所有存在向量內積的場景,如果需要都可以引人核函數。
核函數隱藏着一個到高維的映射,可能使得數據在高維變得線性可分,但並不保證映射后一定是線性可分的。那怎樣徹底處理線性不可分的問題呢?其實可以換個思路,我們並不要求數據一定得線性可分,不過如果有些樣本錯分了,我們給它一個懲罰代價,並將懲罰代價引人優化目標,這樣的話,雖然分類器不能保證對訓練數據線性可分,但它會根據我們給出的懲罰因子找到代價最小的分類器。這個問題將在下一篇文章SVM之解決線性不可分中介紹。