1.先给个定义:核函数K(kernel function)就是指K(x, y) = ,其中x和y是n维的输入值,f(·) 是从n维到m维的映射(通常而言,m>>n)。是x和y的内积(inner product),严格来说应该叫欧式空间的标准内积,也就是很多人常说的点积(dot product)。
2.
3.光看这一段还是不明白kernel是什么,用来干什么的...对吧?不要急。一个好的知识分享者是不会把一篇空洞的定义扔下就不管的,TA会告诉你这个概念的intuition,然后给你举个小小的栗子,最后告诉你几个应用场景。Andrew Ng的Machine Learning为什么会成为一门现象级的MOOC?原因之一就是因为他除了是个学术上的大神,也同样是个极有质素的知识分享者。所以我要学习他。
4.
5.好了,intuitively(这也模仿得太生硬了吧…),要计算,我们要先分别计算f(x)和f(y),然后再求它们的内积。上面的定义里也说了,经过映射后的x和y,维数大大增加,计算内积的成本可能会非常之大,而且在高位空间费力牛劲儿地计算内积,内积又是一个scalar,相当于说又把我们的计算从高维空间拉回到一维空间!所以我们特别想要一个“简便运算法”,帮助我们不需要奔向高维空间就能在家门口计算得到想要的内积。这时候该轮到我们的猪脚——kernel登场了,它能帮我们做到这一点。
6.
7.举个小小栗子。
8.
9.令 x = (x1, x2, x3, x4); y = (y1, y2, y3, y4);
10.
11.令 f(x) = (x1x1, x1x2, x1x3, x1x4, x2x1, x2x2, x2x3, x2x4, x3x1, x3x2, x3x3, x3x4, x4x1, x4x2, x4x3, x4x4); f(y)亦然;
12.
13.令核函数 K(x, y) = ()^2.
14.
15.接下来,让我们带几个简单的数字进去看看是个什么效果:x = (1, 2, 3, 4); y = (5, 6, 7, 8). 那么:
16.
17.f(x) = ( 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16) ;
18.
19.f(y) = (25, 30, 35, 40, 30, 36, 42, 48, 35, 42, 49, 56, 40, 48, 56, 64) ;
20.
21. = 25+60+105+160+60+144+252+384+105+252+441+672+160+384+672+1024
22.
23.= 4900.
24.
25.好累,对不对?可谁让f(·)把四维空间的数据映射到十六维空间里呢?
26.
27.如果我们用核函数呢?
28.
29.K(x, y) = (5+12+21+32)^2 = 70^2 = 4900.
30.
31.就是这样!
32.
33.所以现在你看出来了吧,kernel其实就是帮我们省去在高维空间里进行繁琐计算的“简便运算法”。甚至,它能解决
34. 无限维空间
35.无法计算的问题!因为有时f(·)会把n维空间映射到无限维空间去,对此我们常常束手无策,除非是用kernel,尤其是RBF kernel(K(x,y) = exp(-||x-y||^2) )。
36.
37.在有kernel之前,做machine learning的典型的流程应该是:data --> features --> learning algorithm,但kernel给我们提供了一个alternative,那就是,我们不必定义从data到feature的映射函数,而是可以直接kernel(data) --> learning algorithm,也可以是data --> features --> kernel(features) --> learning algorithm。
38.
39.所以虽然我们看到kernel常被应用在SVM(SVM中的kernel应该是后一种用法,后文再说),但其实要用到内积的learning algorithm都可以使用kernel。“用到内积的learning algorithm”其实并不少见,不信你可以想一想最普通不过的linear classifier/regressor有没有一个步骤是计算特征向量(feature vectors)。
40.
41.<strong>那么kernel在SVM究竟扮演着什么角色?</strong>
42.
43.初学SVM时常常可能对kernel有一个误读,那就是误以为是kernel使得低维空间的点投射到高位空间后实现了线性可分。其实不然。这是把kernel和feature space transformation 混为了一谈
44.。(这个错误其实很蠢,只要你把SVM从头到尾认真推导一遍就不会犯我这个错。)
45.还是简单回顾一下吧。SVM就是 y = w'·φ(x) + b,其中φ(x)是特征向量(feature vectors),并且是φ(x)使得数据从低维投射到高位空间后实现了线性可分。而kernel是在解对偶问题的最优化问题时,能够使φ(x)更方便地计算出来,特别是φ(x)维数很高的时候。
46.
47.--------------正文完,附上几个链接-----------
48.
49.kernel的种类繁多,如果想详细了解,可以看看这个帖子
50.<a class="wrap external" href="//link.zhihu.com/?target=http%3A//crsouza.com/2010/03/kernel-functions-for-machine-learning-applications/" target="_blank">
51.
52.Caltech的机器学习:
53.</a><a class="wrap external" href="//link.zhihu.com/?target=http%3A//work.caltech.edu/telecourse.html" target="_blank">
54.
55.台湾大学林轩田《机器学习基石》:
56.</a><a class="wrap external" href="//link.zhihu.com/?target=https%3A//www.coursera.org/course/ntumlone" target="_blank">
57.
58.PS:本来草稿里存的话是想告诉题主,这样的问题好好去翻教材,或者看Caltech的Abu-Mostafa教授的公开课Learning from Data,或者看台湾大学林轩田的《机器学习基石》,(前者是后者的导师,而且师徒俩讲课都很萌),弄懂kernel这个概念是不成问题的。
59.
60.但当时没有就这样草率地发出来。原因倒不是怕被扣友善度,而是接连地追问了我自己到底弄明白kernel了没有。所以谢谢题主问这个问题,你又驱使我把这个概念完整地思考一遍,并记录下来。