核函数(kernel functions)是机器学习里的一个常用技巧。它接收两个样本的特征向量,给出一个标量;这个标量可以理解成把两个特征向量通过一个「隐藏的映射」变换到一个高维空间之后,再做内积的结果。用 x1,x2 表示两个特征向量,K 表示核函数,ϕ 表示从特征空间到高维空间的隐藏映射,则有:
K(x1,x2)=⟨ϕ(x1),ϕ(x2)⟩
映射 ϕ 往往不容易写出显式的表达式,它的像空间也往往不只是「高维」,而是「无穷维」。
径向基函数(radial basis functions, RBF)是一类常用的核函数,其特点是函数值只与两个特征向量的距离 ||x1−x2|| 有关:
K(x1,x2)=k(||x1−x2||)
RBF 核函数中最常用的是高斯核函数,其形式为:
K(x1,x2)=exp(−γ||x1−x2||22)
其中 γ>0 是一个可调的参数。
我是在 2011 年的机器学习课上接触到 RBF 核函数的。从此以后,我一直有一个疑问:RBF 核函数只与距离有关,看起来并不像一个内积呀!它背后到底隐藏着一个怎样的映射,能使映射后向量的内积只与它们在特征空间的距离有关呢?
这个疑问直到我前两天看到下面这个讲解 maximum mean discrepancy 的视频时,才从 22:35 处的配图中寻到了一丝端倪:
Two-Sample Tests, Integral Probability Metrics, and GAN Objective - Dougal J. Sutherlandwww.youtube.com/watch?v=Xpd6DL02C7Q
这篇文章就来讲解一下 RBF 核函数背后的映射到底是什么样的,并为设计这种形式的映射寻找一种动机。我会介绍两种映射,第一种映射(波包映射)非常直观,第二种映射(复螺旋映射)方便通过采样用有限维映射来近似。第二种映射的近似形式,是我在 2014 年见到的,但由于没有第一种映射作铺垫,感觉颇似「神来之笔」,而现在终于理解了它的来龙去脉。
第一种映射其实非常浅显,但我在网上居然没有找到与它有关的讲解。许多资料给出了另一种形如泰勒展开的映射形式(如维基百科),但它远不如本文介绍的波包映射直观。
核函数的目的是模仿内积,而内积的一个作用是衡量样本之间的相似度。把两个样本看作空间中的两个点,怎么衡量它们的相似度呢?
图 1:两个样本点
一种合理的动机是,两个点靠得越近,它们的相似度就应该越大。为此,我们用一个(旋转对称的)波包来代表一个点;两个点靠得越近,它们对应的波包重合得就越多。
图 2:用波包代表样本
把波包看成一个函数,其定义域是样本的特征空间 Rn,值域为实数域 R 。两个波包的重合程度,就正好可以用函数的「内积」来刻画,即两个波包相乘后积分。不难看出,这个积分的值只与两个样本点的距离有关,所以它就是一种 RBF 核函数 K,而从样本点到波包的映射,就是核函数背后隐藏的映射 ϕ 。映射 ϕ 的像空间是从 Rn 到 R 的函数空间,所以是无穷维的,而且是不可数无穷维。
这个不可数无穷维空间应该怎么形象地理解呢?有两个方面比较重要:
1. 在样本空间中相近的两个点,经过 ϕ 映射后内积比较大,在重合时达到最大值;在样本空间中相距较远的两个点,经过 ϕ 映射后内积趋于零。这可以理解成,所有的样本点都被映射成无穷维空间中同一个超球面上的点,相近的点映射到了夹角较小的方向,而相距较远的点则被映射到了几乎正交的方向。这符合高维空间的特性——在高维空间中随机取两个方向,它们一般都是接近正交的。
2. 在样本的特征空间中,内积与原点的位置是有关的。把一个样本 x1 与原点的距离扩大一倍,即移动至 2x1,则它与另一个样本 x2 的内积也会扩大一倍。在很多时候,这并不是我们想要的性质,因为 2x1 与 x2 并不见得就比 x1 与 x2 更相似。而经过 ϕ 映射后,两个样本的内积就只取决于它们在原特征空间中的距离,特征空间变成了平移不变的,其中的原点就不再具有特殊性了。这其实正是我们想要的性质,但正因为它与原特征空间中的内积性质截然不同,所以才让我怀疑 RBF 核函数怎么能理解成内积。
下面来看一下高斯核函数的实例。为方便起见,样本的特征空间就设为一维,样本的坐标 x1,x2 不再使用粗体书写。把样本 x1,x2 映射为均值在 x1,x2、标准差为 σ 的高斯波包:
f1(x)=exp[−(x−x1)22σ2],f2(x)=exp[−(x−x2)22σ2]
则两个样本的核函数值,即两个波包相乘后再积分,就等于:
K(x1,x2)=⟨ϕ(x1),ϕ(x2)⟩=⟨f1,f2⟩=∫−∞+∞f1(x)f2(x)dx=∫−∞+∞exp[−(x−x1)22σ2]⋅exp[−(x−x2)22σ2]dx=∫−∞+∞exp[−2x2−2(x1+x2)x+(x12+x22)2σ2]dx=∫−∞+∞exp{−1σ2[(x−x1+x22)2+(x1−x22)2]}dx=∫−∞+∞exp(−x2σ2)dx⋅exp[−(x1−x2)24σ2]=πσ⋅exp[−(x1−x2)24σ2]
忽略系数 πσ,我们发现这就是 γ=14σ2 的高斯核函数。
在上面的例子中,波包和核函数都是高斯形式(但方差差了一倍)。在一般情况下,波包和核函数的形式不一定相同。比如,如果把波包取成矩形的,则核函数就会是三角形的。一般地,核函数是波包的自相关函数。高斯函数的自相关函数,恰好仍是高斯形式。
图 3:矩形波包及其自相关函数
在机器学习中,有时候我们会想要把样本特征经过核函数中隐藏映射处理后的结果显式地表示出来。比如,可以用这些结果做为新的特征,送到神经网络里去做分类,如[1]。映射的结果往往是无穷维的,这就需要用有限维映射去近似。
上一节揭示了 RBF 核函数背后的映射,是把样本特征映射成一个波包函数。要用有限维映射去近似这个波包函数,可以在它上面取有限个采样点。但这个采样比较困难:要让近似足够精确,就要在波包的峰值附近多采一些样,但每个样本对应的波包都处于不同的位置,很难让每个波包都获得足够多的采样点。于是我们就有了设计第二种映射的动机:能不能把波包都弄到同一个位置呢?我们有大杀器——傅里叶变换!
傅里叶变换有「保内积」性:两个函数经过傅里叶变换后再求内积,跟它们直接求内积的结果相等。仍以一维情况为例,设 f1(x),f2(x) 是两个函数,它们的傅里叶变换分别为 F1(ω),F2(ω),则有:
⟨f1,f2⟩=⟨F1,F2⟩
这里有两点需要注意:
傅里叶变换要选取幺正的形式。若以角频率为频域的自变量,则正、逆变换都要带有系数 12π,即:F(ω)=12π∫−∞+∞f(x)e−iωxdx,f(x)=12π∫−∞+∞F(ω)eiωxdω。
傅里叶变换往往涉及复数,所以求内积时别忘了在某一个函数(不妨取第二个函数)上加共轭:
∫−∞+∞f1(x)f2(x)¯dx=∫−∞+∞F1(ω)F2(ω)¯dω
由傅里叶变换的保内积性可知,核函数 K(x1,x2) 也等于 ⟨F1,F2⟩ ,所以「波包的傅里叶变换」也可以作为 RBF 核函数背后的隐藏映射。
波包的傅里叶变换长什么样呢?这又需要用到傅里叶变换的另一条性质:在一个域中的位移,对应于另一个域中的相移。设位于原点处的波包 f(x) 的傅里叶变换为 F(ω),则平移后的波包 f(x−a) 的傅里叶变换就是 e−iaωF(ω) 。注意,不管波包 f(x−a) 处于什么位置,它的傅里叶变换 e−iaωF(ω) 都是一个位于频域原点处的波包,只是相移因子不同!
仍以高斯核函数为例。在第一节中,我们用高斯波包 f(x)=exp(−x22σ2) 作为隐藏映射。高斯波包的傅里叶变换还是一个高斯波包(一般函数的傅里叶变换则不一定保持相同的形式):
F(ω)=σ⋅exp(−12σ2ω2)
平移后的高斯波包 f(x−a) 的傅里叶变换则是:
e−iaωF(ω)=e−iaω⋅σ⋅exp(−12σ2ω2)
取 σ=1,a=5,画出 e−iaωF(ω) 的图像如下。注意这是一个复值函数,所以图中有一个坐标轴表示自变量、两个坐标轴分别表示函数值的实部与虚部。图像呈螺旋状,所以我把「波包的傅里叶变换」这个映射称为「复螺旋映射」。螺旋的旋向及密度由平移量 a 决定,a 的绝对值越大,螺旋越密;螺旋粗细的变化(即包络,图中彩色轮廓)遵循 F(ω) 本身的形状。
图 4:复螺旋 1
若取 σ=1,a=−10,则复螺旋 e−iaωF(ω) 的图像如下。螺旋的方向反了过来,并且密度加倍了。
图 5:复螺旋 2
两个复螺旋的内积怎么直观地理解呢?如果两个复螺旋的 a 比较接近,比如旋向相同、密度相近,则它们在原点附近会有较长的一段区间基本同相,在这段区间上共轭相乘再积分会对内积做出较大的贡献。在离原点较远的区域,两个复螺旋的相位基本是乱的,并且螺旋也变得比较细了,对内积就没有什么贡献了。如果两个复螺旋的 a 差距较大,则它们在原点附近基本同相的区间就会很短,也就只能得到较小的内积。
设有两个样本 x1,x2,它们经复螺旋映射后的结果分别为 F1(ω)=e−ix1ωF(ω)、F2(ω)=e−ix2ωF(ω)。我们要用采样的方法,把这两个复螺旋近似成两个有限维向量,以近似计算如下内积:
∫−∞+∞F1(ω)F2(ω)¯dω=∫−∞+∞e−ix1ωF(ω)e−ix2ωF(ω)¯dω
两个复螺旋都在频域的原点附近值比较大,一种容易想到的采样方法是,在原点附近的一个有限区间内均匀采样。但这个区间的长度并不好取:取短了,则区间外的遗漏就比较多;取长了,则区间内靠近边缘的部分对内积的贡献又不大,显得浪费。
文献[2]提出了一种聪明的办法。它把内积化成了如下的形式:
∫−∞+∞F1(ω)F2(ω)¯dω=∫−∞+∞|F(ω)|2e−ix1ωe−ix2ω¯dω
并把右边看成是在 |F(ω)|2 这个概率密度下,对 e−ix1ωe−ix2ω¯ 求期望。|F(ω)|2 本身并不一定是归一化的,不过把它归一化只相当于给内积乘上一个系数,无伤大雅。在这种理解下,我们就可以按 |F(ω)|2 这个概率密度函数去采样 ω,并用这些 ω 处 e−ix1ω 和 e−ix2ω 的值组成向量,作为 F1、F2 的有限维近似。换句话说,对于一个样本 x,我们可以设计如下一个有限维的近似隐藏映射:
ϕ(x)=[e−ixω1,…,e−ixωm]
其中 ω1,…,ωm 是从概率密度 |F(ω)|2 中随机采样得到的,采样越多,近似越精确。注意这些采样点自然会在原点附近聚集得更密!
用上述方法得到的 ϕ(x) 是一个复值向量,使用起来仍嫌不便。注意到由于波包本身是个实值函数,波包的内积也是实的,所以复螺旋的内积其实也是实的。于是我们可以对复螺旋的内积取实部:
∫−∞+∞F1(ω)F2(ω)¯dω=∫−∞+∞|F(ω)|2Re[e−ix1ωe−ix2ω¯]dω=∫−∞+∞|F(ω)|2Re[e−i(x1−x2)ω]dω=∫−∞+∞|F(ω)|2cos[(x1−x2)ω]dω=∫−∞+∞|F(ω)|2[cos(x1ω)cos(x2ω)+sin(x1ω)sin(x2ω)]dω
由此可以得到一个实的、有限维的近似隐藏映射:
ϕ(x)=[cos(xω1),sin(xω1),…,cos(xωm),sin(xωm)]
上面的讨论都默认了 x 和 ω 是一维的。在多维情况下它们都是向量,隐藏映射为:
ϕ(x)=[cos(x⋅ω1),sin(x⋅ω1),…,cos(x⋅ωm),sin(x⋅ωm)]
其中 ω1,…,ωm 是从多维概率密度 |F(ω)|2 中采样得到的随机向量。
这个隐藏映射用神经网络实现起来特别方便。只需要把原本的特征 x 送进一个全连接层(其权重由 ω1,…,ωm 排成),再分别经过 cos、sin 两个激活函数即可。
最后说一下,计算概率密度 |F(ω)|2,并不需要知道波包的表达式。这是因为,傅里叶变换的模方就等于自相关函数的傅里叶变换,即:概率密度 |F(ω)|2 就是核函数本身(把 x1−x2 看作自变量)的傅里叶变换。
^Yun Wang and Florian Metze, "Recurrent support vector machines for audio-based multimedia event detection", ICMR 2016. https://maigoakisame.github.io/papers/icmr16.pdf
^Ali Rahimi and Benjamin Recht, "Random features for large-scale kernel machines", NIPS 2007. https://people.eecs.berkeley.edu/~brecht/papers/07.rah.rec.nips.pdf
斯核函数背后隐藏的映射 ϕ\phi ,是把每个样本点映射成一个高斯波包,就像这样:
波包本身是一个函数,是从样本本来的特征空间(图中画的是一维,实际上可以是 Rn\mathbb{R}^n)到实数 R\mathbb{R} 的映射,它们构成一个(不可数)无穷维的函数空间。ϕ\phi 是把样本对应成波包的映射,所以也是无穷维的。