前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习有很多关于核函数的说法,核函数的定义和作用是什么?

机器学习有很多关于核函数的说法,核函数的定义和作用是什么?

作者头像
机器学习AI算法工程
发布2018-03-13 16:25:52
2K0
发布2018-03-13 16:25:52
举报

作者:蓦风 链接:https://www.zhihu.com/question/30371867/answer/73508853

机器学习,具体以RBF网络里面的核函数为例,有童鞋说是通过径向基核函数可以把原始数据投影到更高维的空间里去(从而增加数据可分的概率),对于这种说法,实在不是很理解(怎么就投影到高维空间里面去了呢)?

先给个定义:核函数K(kernel function)就是指K(x, y) = <f(x), f(y)>,其中x和y是n维的输入值,f(·) 是从n维到m维的映射(通常而言,m>>n)。<x, y>是x和y的内积(inner product),严格来说应该叫欧式空间的标准内积,也就是很多人常说的点积(dot product)。

光看这一段还是不明白kernel是什么,用来干什么的...对吧?不要急。一个好的知识分享者是不会把一篇空洞的定义扔下就不管的,TA会告诉你这个概念的intuition,然后给你举个小小的栗子,最后告诉你几个应用场景。Andrew Ng的Machine Learning为什么会成为一门现象级的MOOC?原因之一就是因为他除了是个学术上的大神,也同样是个极有质素的知识分享者。所以我要学习他。

好了,intuitively(这也模仿得太生硬了吧...),要计算<f(x), f(y)>,我们要先分别计算f(x)和f(y),然后再求它们的内积。上面的定义里也说了,经过映射后的x和y,维数大大增加,计算内积的成本可能会非常之大,而且在高位空间费力牛劲儿地计算内积,内积又是一个scalar,相当于说又把我们的计算从高维空间拉回到一维空间!所以我们特别想要一个“简便运算法”,帮助我们不需要奔向高维空间就能在家门口计算得到想要的内积。这时候该轮到我们的猪脚——kernel登场了,它能帮我们做到这一点。

举个小小栗子。

令 x = (x1, x2, x3, x4); y = (y1, y2, y3, y4);

令 f(x) = (x1x1, x1x2, x1x3, x1x4, x2x1, x2x2, x2x3, x2x4, x3x1, x3x2, x3x3, x3x4, x4x1, x4x2, x4x3, x4x4); f(y)亦然;

令核函数 K(x, y) = (<x, y>)^2.

接下来,让我们带几个简单的数字进去看看是个什么效果:x = (1, 2, 3, 4); y = (5, 6, 7, 8). 那么: f(x) = ( 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16) ;

f(y) = (25, 30, 35, 40, 30, 36, 42, 48, 35, 42, 49, 56, 40, 48, 56, 64) ;

<f(x), f(y)> = 25+60+105+160+60+144+252+384+105+252+441+672+160+384+672+1024 = 4900.

好累,对不对?可谁让f(·)把四维空间的数据映射到十六维空间里呢? 如果我们用核函数呢? K(x, y) = (5+12+21+32)^2 = 70^2 = 4900. 就是这样! 所以现在你看出来了吧,kernel其实就是帮我们省去在高维空间里进行繁琐计算的“简便运算法”。甚至,它能解决无限维空间无法计算的问题!因为有时f(·)会把n维空间映射到无限维空间去,对此我们常常束手无策,除非是用kernel,尤其是RBF kernel(K(x,y) = exp(-||x-y||^2) )。

在有kernel之前,做machine learning的典型的流程应该是:data --> features --> learning algorithm,但kernel给我们提供了一个alternative,那就是,我们不必定义从data到feature的映射函数,而是可以直接kernel(data) --> learning algorithm,也可以是data --> features --> kernel(features) --> learning algorithm。

所以虽然我们看到kernel常被应用在SVM(SVM中的kernel应该是后一种用法,后文再说),但其实要用到内积的learning algorithm都可以使用kernel。“用到内积的learning algorithm”其实并不少见,不信你可以想一想最普通不过的linear classifier/regressor有没有一个步骤是计算特征向量(feature vectors)的内积呢?

不过作为曾经也困惑的过的过来人,我试图直观的去解释一下问题。

1.Kernel是什么? Kernel是一个函数,一个二元函数,一个从的二元函数。至于什么是二元函数,这个就不用解释了吧,你懂的。。。

2.关于Kernel的一些

首先如kernel直接翻译过来一样就是核心,而kernel就是machine learning中最核心的部分的东西。它有效的描述了点和点之间的关系,或者说是距离,当然这里的距离严格的说应该是广义的距离。所以按照其作用kernel原本的名字应该叫“covariance function”. 有人会问,明明字母都不像么,为什么是一样的呢?其实这就好像,一个人叫张三,然后做了公司老板,你可以叫他老板,而且你叫习惯了,因为在公司中就是无可替代的老板,但是他的真名就是张三。可能有人还是不明白,为什么这是一致的。那么下一个直观的问题是,什么是machine learning中最要的部分呢,也就是核心呢?Of course, training & learning! 那什么是training&learning中最重要的呢?对,那就是点与点之间的关系,无论是training点之间的关系还是training与learning点之间的关系都是这整个过程的必不可少的信息。好的,那我们再来看看covariance function 的意义吧。wiki上说,在概率论与统计学中,covariance是一种两个变量如何相关变化的度量,而covariance function 是自然就是描述对应协方差的函数喽!OK,现在看着应该很像了吧,不是像,应该说是一样的嘛。 3. Kernel心中的kernel 之前说了,Kernel是描述点和点之间关系的,或者说是距离。距离是一个非常的有趣的词语。北京到上海的距离是1463 公里, 而你到我距离却只有那心动的一瞬间。好了,不文艺了,事实上距离是一个有歧义的词语,因为在不同的情况下距离有着不同的描述方法,比如常用的欧氏距离(Euclidean Distance) 和曼哈顿距离(Manhattan Distance),当然还有更复杂的,比如切比雪夫距离 ( Chebyshev Distance ),闵可夫斯基距离(Minkowski Distance),马氏距离(Mahalanobis Distance),汉明距离(Hamming distance),这里就不多说了,其实我也不知道具体这些东东具体是做什么的,不过有人知道,比如“机器学习中的各种距离

http://blog.csdn.net/lifeitengup/article/details/8450545

好了,问题又来了,距离有那么多定义,可是万一弱水三千就没有我需要的一瓢怎么办呢?没关系,数学如此博大精深,自然有办法的,那就是去定义嘛。深奥的functional data analysis (泛函分析)告诉我们,从距离空间出发,我们可以一步步往前走可以得到赋范向量空间,内积空间,然后是优美的希尔伯特空间。对就是你了,希尔伯特空间,这里面有好多概念,这里就不多说了,主要就是一个范数,一个内积。那什么是范数呢,范数就是我们之前强调的距离,或者说广义的距离。而什么又是内积呢?没错,内积就是这个距离的定义的方式。这就是为什么说由内积可以诱导出范数的原因了。因此,如果我们用到相关希尔伯特空间的知识的话,这个“自定义”距离的问题就不在话下喽。OK,现在我们回到这个kernel的问题,既然kernel是用来描述点与点之间的关系或者说距离的话,那么一种可行的有效的方法就是用内积去刻画,也就是说,根本不同的内积定义,我们就可以构造出不同的核函数。当然由于这是内积定义的,那么自然学过一点泛函的小朋友都知道,这里的kernel也就会有正定和对称的性质啦,回头想想我们的发出点,这两个性质是不是也理所应当的是kernel所应该具备的呢?Definitely! 然而,现实的问题是,内积虽然可以有各种定义方式,但是局限性还是蛮大的,玩来玩去一共就那么几种,如果我们可以得到更加一般化的结论怎么办呢?没错,只能动一动内积里面的东西啦,也就是。这样一来的好处就是,无论x,y 本身是如何的,维数也好,形式也罢,我们都可以调整这个来保证一般的常见的内积定义,而其中这里的呢,自然可以看做了一个映射,从一个从映射到一个一般的希尔伯特空间的映射,而此时内积仍旧是定义在希尔伯特空间的内积。这也就是好多小伙伴正在说到的所谓高维到低维还是不知是从低维到高维的feature mapping。(事实上,就我所知比较多用的应该是从低维到高维的投射吧,因为这会让一些低维空间上不明显的feature在高维空间容易显示出来)。当然这一切都可以有个大神叫Mercer 给出的定理去解释,Mercer定理说,任何满足对称性和正定性的二元函数都能找到Hilbert space 和函数 使得 . 不过实际问题中,feature space 下计算feature 的复杂度极高,所以说定义一个合格kernel可以大大降低这个计算feature 的复杂度。从而这边又可以引出kernel第二个别名,kernel trick。

另外也有小伙伴提到Reproducing Kernel Hilbert Space (RKHS),这个嘛,事实上也就是一种在希尔伯特这个大的游泳池里面一种复杂而漂亮的游泳方式啦,如果你各方面条件合适,事实上你也可以直接创造一种优美的游泳方式,是不是很炫酷,想试试?呵呵,真的似乎好难。。。一旦涉及泛函,事实上没有一定的功底,基本就是举步维艰。 4. Kernel有什么用?

这个就海了去了。。。这就是machine learning中的一大块,kernel learning嘛,其中最为典型的要数Support Vector Machine (SVM), Gaussian Process (GP),还有Principal Component Analysis (PCA)。看到这里有木有觉得非常熟悉,叱咤风云的SVM和PCA,不过这里怎么还有个似乎显得那么冷门的Gaussian process呢,这是什么东东呢,详见Carl Edward Rasmussen

https://mitpress.mit.edu/authors/carl-edward-rasmussen

and Christopher K. I. Williams

https://mitpress.mit.edu/authors/christopher-k-i-williams

大神写的书Gaussian Processes for Machine Learning。简单的说呢,这也是一种非常有效的supervised leaning的方法,至于什么是supervised leaning呢,简单理解就是有一个学习明确的学习方向的learning。这边还需要强调一下的是,这些learning的方法都是有classification和regression的,大多数小伙伴都知道SVM吧,不过大多数中的大多数或许只知道SVM可以做classification,所以也多在说kernel对SVM的作用。我弱弱的想说一句是regression和classification大家都有,只是在大多数情况下,SVM在classification方面比较有优势而GP会在regression上有较好的结果,仅此而已。不过总的来说还是一句话,kernel不论对regression还是classification都是意义重大的,谁叫人家叫kernel呢!至于具体的作用么,本人做的是GP的regression,我可以确认是在GP的regression中,kernel主要是对应数据的pattern的,直接想想就是如果数据是一维,那么这个所谓的pattern就是这个图形走势啦,图形长的想什么函数,就对应着是什么具体的经典kernel,有光滑的无限可微的Squared Exponential (SE),有具有完全周期性的(Periodic),还有一些奇奇怪怪的kernel,比如Rational Quadratic (RQ), Matern(MA) 等等。这里有更详细的解释:http://crsouza.com/2010/03/kernel-functions-for-machine-learning-applications/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据挖掘DT数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档