在机器学习内,一般说到kernel函数都是在SVM中去介绍,主要原因是SVM必须搭配kernel l函数才能让SVM可以在分类问题中得到非常好的效能,因此kernel trick是SVM学习内非常重要的部份,当然也会衍生出很多问题(后面会提到)。 Kernel trick在机器学习的角色就是希望当不同类别的特征在原始空间中无法被线性分类器区隔开来时,经由非线性投影后的特征能在更高维度的空间中可以更区隔开。 下图是一般看到kernel介绍都会看到的图,我们无法在原始空间(Rd)中适当的找到一个线性分类器将两类区隔开,这时后此需要找到一个非线性投影(φ)将特征进行转换到更高维度的空间,此时在高维度的空间中只需要一个线性分类器/hyperplane就可以完美分类。 而这个更高维度的空间则称为Hilbert space(H)。 但我们又很难直接去设计一个好的非线性投影(φ)公式,因此需要kernel函数来辅助。 Kernel函数定义: 只要对所有的特征,有一个函数可以满足 K(x,y)=⟨φ(x),φ(y)⟩ 这个k(x,y)就是一个kernel函数,⟨a, b⟩表示向量a和b做内积。 但我们怎么知道什么函数可以满足这个条件,所以有个定理(Mercer's theorem)说如果有一个函数(φ)存在,这个k必需满足Mercer's condition,k就是kernel函数。 但说法还是很玄,简化说就是如果所有的特征带到这个kernel function中的和必须大于等于0: K就满足Mercer's condition。 理论上,一个Kernel matrix(K, Gram matrix)是半正定矩阵(positive semi-definite),这个k就是kernel function。 比较常用的kernel函数: D为正整数(通常在call api时,这个部份都会称为degree),σ为非0的实数(通常在call api时,这个部份都会称为gamma) Note: RBF kernel有的api会定义成下: 下面举一个用polynomial kernel function次方项为2次方,截距为0 (d=2, c=0)的例子。 左图为原始空间,很明显的圆圈内是一类,圆圈是一类,此时单纯用线性分类器是无法有效分类的,因此有没有办法找到一个非线性分类器让两类可以分开。 这边用的kernel function比较简单 此时可以经由简单的推导得到投影函数(φ),如下 因此我们可以看到用polynomial kernel function将特征投影到feature space后的情况,此时已经将特征从2维空间转换到3维空间。 在feature kernel space时,很明显只要一个Hyperplane(线性分类)就可以完美分类,如下左图(水蓝色的平面),而其对应到原始空间(下右图)则是中间分类的那个圆圈。 RBF kenel function 投影函数转换 上述用的Polynomial kernel function转换成投影函数(φ)比较简单。 RBF kernel function也可以经由简单的推导得到投影函数(φ),但稍为复杂一点,会用到泰勒级数(Taylor series)。理论参考。 Recall: 泰勒级数是在函数f(x)在一个实数或复数a上可微分函数的power级数如下: RBF kernel function会用到的泰勒级数是在 这边举一个1维度的特征让大家熟悉RBF的拆解,这边熟悉后比较容易转换到高维度的想法去看 后面要来说明高维度的特征怎么拆解,如果你对上面拆解很熟,你应该会意识到RBF转换到更高维度的空间是看你泰勒级数要展到几阶层,假设你特征是2维,你想在3维空间看RBF转换,泰勒级数就展开到0~2阶,投影函数(φ)的每一个element公式如下 N代表第n阶。投影函数(φ)实际写出来如下: 这边举一个2维特征用RBF kernel function拆解出的投影函数(φ): 这边我用图示法,将2维特征投影到3维空间上,也就是泰勒级数取到2阶就好。 Kernel的手法只是将特征投到更高维度的空间,然后在这高维度的空间进行你想做的事情,不一定要直接在高维度空间做分类(此例是在高维度空间分类),也可以在高维度空间进行降维(dimension reduction),关键字kernel PCA, kernel LDA。 Kernel trick很有趣,但刚有提到它有衍生性的问题,这个问题其实很简单 '有这么多种类的kernel,你要用什么kernel函数在你的特征上?你挑到kernel了,kernel参数怎么调整?' 还有人一直在研发不同种的kernel函数,比如合成的kernel,要怎么挑,这个问题很简单,最传统的方式就是用gird search,就是你想的到的kernel函数和参数你都用training data跑一次,看哪组kernel和参数你training data performance最好就用哪一组。大家有发现一个问题吗?如果kernel有100个,参数也都各100个,这样你要try 100*100=10000次。如果你有跑过SVM,你就知道这样会玩多久了。 因此有人会研发更快找到参数的方法,我们以前也玩过,之后有空再来写一篇我们怎么玩的。 |
|