在接觸反演、算法等方面的知識后,經常聽到“核”這個字,它不像對原始變量的線性變換,也不像類似於機器學習中激活函數那樣的非線性變換,對原始數據進行變換,就可以將復雜的問題簡單化。接下來,就讓我們了解了解“核”這個東西。
參考鏈接:
注,kernel function 與kernel function指的是同一個東西,可以這樣理解:核方法只是一種處理問題的技巧,低維空間線性不可分可以在高維空間線性可分,但是高維空間的計算復雜度又很大,那么我們就把高維空間的計算通過低維空間的計算外加一些線性變換來完成。
還有,都說核方法與映射無關,怎么理解呢?核方法是一種技巧,不管怎么映射,我們都是用低維空間的計算來解決高維空間計算復雜的問題。
1. 問題描述
給定兩個向量(x_i)和(x_j),我們的目標是要計算他們的內積\(I\) = <\(x_i\), \(x_j\)>。現在假設我們通過某種非線性變換:\(\Phi : x \rightarrow \phi(x)\)把他們映射到某一個高維空間中去,那么映射后的向量就變成:\(\phi(x_i)\)和\(\phi(x_j)\),映射后的內積就變成:\(I’\) = <\(\phi(x_j)\),\(\phi(x_j)\)>。
現在該如何計算映射后的內積呢?
傳統方法是先計算映射后的向量\(\phi(x_i)\)和\(\phi(x_j)\),然后再計算它倆的內積。但是這樣做計算很復雜,因為映射到高維空間后的數據維度很高。比如,假設\(x_i\)和\(x_j\)在映射之后都是一個( \(1 \times 10000\))維的向量,那么他們的內積計算就需要做10000次加法操作和10000次乘法操作,顯然復雜度很高。
於是,數學家們就想出一個辦法:能不能在原始空間找到一個函數\(K(x_i,x_j)\)使得\(K(x_i,x_j) = <\phi(x_j),\phi(x_j)>\)呢? 如果這個函數存在,那么我們只需要在低維空間里計算函數\(K(x_i,x_j)\)的值即可,而不需要先把數據映射到高維空間,再通過復雜的計算求解映射后的內積了。慶幸的是,這樣的函數是存在的。這樣一來計算的復雜度就大大降低了,這種簡化計算的方法被稱為核技巧(The Kernel Trick),而函數(K)就是核函數(Kernel Function)。
2. 與SVM的關系
之前的一篇介紹支持向量機的文章里我們說過:支持向量機為了解決數據在低維度不容易線性分割的情況下,會通過某非線性變換 \(\phi(x)\),將輸入空間映射到高維特征空間。於是,就得到如下求解公式:
觀察上面的公式你會發現里面有一個內積運算
於是,為了降低計算復雜度,解決映射后可能產生的維度爆炸問題,我們在求解的時候引入了核技巧。核技巧並不僅僅應用在SVM中,在其他需要處理高維映射計算的問題中也有很多應用。
3. 常用的核函數
主要有以下幾種:
-
線性核,其實就是沒有映射
\[\kappa \left ( x_{1},x_{2} \right ) = \left \langle x{1},x{2} \right \rangle \] -
高斯核函數,使用最為廣泛,它能夠把原始特征映射到無窮維。
\[\kappa \left ( x_{1},x_{2} \right ) = \exp \left ( -\frac{\left | x_{1}-x_{2} \right |^{2}}{2\sigma ^{2}} \right ) \] -
多項式核函數,它能把數據映射到\(C_{n+d}^{n}\)維。
\[\kappa \left ( x_{1},x_{2} \right ) = \left ( \left \langle x_{1},x_{2} \right \rangle +R\right )^{d} \]
由此可見:選擇什么樣的核函數將會決定你把數據映射到什么樣的維度。
4. 核函數的滿足條件
Mercer 定理:任何半正定的函數都可以作為核函數。所謂半正定的函數\(f(x_i,x_j)\),是指擁有訓練數據集合\(x_1,x_2,…x_n\),我們定義一個矩陣的元素\(a_{ij} = f(x_i,x_j)\),這個矩陣是\(n \times n\)的,如果這個矩陣是半正定的,那么\(f(x_i,x_j\))就稱為半正定的函數。
這個mercer定理不是核函數必要條件,只是一個充分條件,即還有不滿足mercer定理的函數也可以是核函數。
5. 核函數的計算
在上面了解了核函數是什么后,我們已經知道了核函數與內積之間的關系,接下來,從理論上看一看。

從圖中可以看出,在original space的數據,其帶有兩種標簽,如果要將這兩種數據分開,必須通過一個橢圓來分開,也就是說,它不是線性可分的;
那么,有什么辦法呢?
如圖所示,對original space的數據進行feature mapping,從而把數據從\((x_1,x_2)\)的二維空間映射到\((z_1,z_2,z_3)\)的三維空間中,很明顯,在三維空間的數據能夠很容易的通過一個超平面將數據進行分類,也就是說,該數據在更加高維的空間變得線性可分了。
但是,這和內積有啥關系呢?
比如,在\((x_1,x_2)\)的二維空間中,
也就是說,\(x\)和\(x'\)表示\((x_1,x_2)\)二維空間中的兩個點,\(\phi(\cdot)\)表示從二維空間到三維空間的映射函數,則\(x\)和\(x'\)對應的三維空間的點分別為\(\phi(x)\)和\(\phi(x')\)。

接下來,我們從計算上看看線性可分與線性不可分的區別?
如上圖所示,對於可以線性可分的數據,數據的類別之間可以由一個超平面分隔開,從圖中可以看出來,超平面有很多個滿足將數據的兩種類別分隔開的條件,因此,我們可以取兩種類別數據的質點,對應圖中的\(c_-\)和\(c_+\),這兩點連線\(\overrightarrow{c_-c_+}\)(對應圖中紅線),那么最優的超平面就可以取為以\(\overrightarrow{c_-c_+}\)為法向量、過\(\overrightarrow{c_-c_+}\)的中點\(c=\frac{1}{2}(c_-+c_+)\)的那個平面,即\(H(x)=\overrightarrow{c_-c_+}(\phi(x)-c)=w^T(\phi(x)-c)\)。
但是,對於線性不可分的情況,就沒有這么好了,我們可以通過機器學習中的激活函數(非線性表示)來學習二分類的邊界,學個橢圓不是問題,但是,如果要通過線性可分這樣的內積方式獲得,顯然是不現實的。
內積的具體應用如何?
\(\phi(x)\)和\(\phi(x')\)是低維空間的點\(x\)和\(x'\)映射到高維空間的表示,兩點之間的距離為
對於其中的\(<\phi(x),\phi(x')>\)項,可做如下方式展開:
這樣,我們就可以得到高維空間兩個點的距離、夾角信息,從而可以計算出超平面。
內積在核函數中的應用?
根據上面的分析可知,理論超平面為\(H(x)=\overrightarrow{c_-c_+}(\phi(x)-c)=w^T(\phi(x)-c)\)
轉換成內積形式:
其中的\(\kappa(x,x_i)\)表示核函數,即高維空間中兩個點的內積。
所謂核函數,就是在原空間上兩個點內積的一個函數得到的。
舉例如下,
\((x_1,x_2) \rightarrow (z_1,z_2,z_3)=(x_1^2,\sqrt{2}{x_1x_2},x_2^2)\)
從上述公式可以看出,核函數是一個用原有特征空間上點內積的方式通過運算轉換成高維空間點內積,而不必完全有高維空間上的點進行計算,從而到達降低運算復雜度的作用。
6. 常用核函數的理解
以高斯核函數為例,
我們假設\(\sigma = 1\),則
這不,已經有了定義的那種形式,對於\(\phi(x)\),由於
所以,可以映射到任何一個維度上。
