一般来说,在机器学习中,我们想把相似的东西放在相似的地方。这条规则适用于所有的机器学习,无论是有监督的、无监督的、分类的、回归的。问题是,我们如何确定什么是相似的?为了阐明这个问题,我们将从学习内核的基本基础——点积开始。
两个向量的点积很神奇。我们可以肯定地说,它在某种意义上衡量相似性。通常,在机器学习文献中,点积表示为:
表示向量x和x '之间的点积。注意,为了简洁起见,我省略了矢量符号的箭头。这个符号是矢量分量乘积的和的简写:
巧合的是,向量的范数是与自身点积的平方根,表示为:
这当然不是全部。我们还知道余弦规则,它规定点积等于向量夹角的余弦乘以它们的范数(这很容易用简单的三角函数证明):
讨论角度和范数的好处是我们现在可以形象化这个点积是什么意思。让我们把这两个向量以及它们之间角α画出来:
如果我们用点积来衡量相似性。什么时候会达到大值?这意味着向量是相似的。很明显,当余弦等于1时,也就是角为0°或弧度时,会发生这种情况。如果向量各自的范数是相同的,那么很明显我们讨论的是相同的向量!不错。让我们把到目前为止学到的东西详细记下来:
点积是向量之间相似性的度量。
现在,你们应该明白为什么点积是有用的了。
当然,作为相似性度量的点积在一个问题中可能有用,也可能完全没用,这取决于你要解决的问题。因此,我们需要在输入空间上进行某种转换,使点积在度量相似性时变得有用。我们用ϕ表示这种转变。现在,我们可以定义内核的含义,即映射空间中的点积:
所以核函数的定义很简单,就是在映射空间中度量相似性。问题是,数学家喜欢具体化。不应该对它们所处理的底层函数和空间进行隐式假设,因此函数分析的内核背后有很多理论,这需要另一篇文章或几篇相关文章进行详细论述,这里就不展开了。简而言之,我们需要明确说明我们想要什么样的函数ϕ:
我们想要一个函数从定义域X映射到一个点积定义良好的空间,这意味着它是一个很好的相似性度量。
内核可以用作任何算法的概括,这些算法可以根据点积(或者那个问题的规范)来定义。 使用内核作为其主干的的算法示例是支持向量机和高斯过程,但也有一些内核与神经网络一起使用。
另一个原因,我们实际上需要内核和输入空间的映射函数ϕ是可能没有一个良好定义的点积。让我们简短地研究一个文档分析案例,在这个案例中,我们只想根据两个文档的主题得出它们之间的相似性,然后对它们进行分组。在这种情况下,这两个文档之间的点积到底是什么?一种选择是使用文档字符的ASCII代码并将它们连接到一个巨大的向量中——当然,这不是您在实践中会做的事情,但我们可以考虑下这种做法。另一种是我们现在把文档定义为向量。但是在长度上仍然存在问题,即不同的文档有不同的长度。但我们可以通过填充较短的带有EOS字符到一定长度的文档来解决这个问题,然后我们可以计算这个高维空间中的点积。但是,还有一个关于这个点积的相关性或者说这个点积到底是什么意思的问题。很明显,字符的微小变化会改变点积。即使我们用它的同义词交换一个单词,它也会改变点积。在比较两个文档的主题时,希望避免这种情况。
那么内核如何在这里发挥作用呢? 理想情况下,你需要找到一个映射函数φ,它将在你输入的空间映射到一个特征空间,其中点积具有你想要的含义。在文档比较的情况下,对于语义相似的文档,点积很高。换句话说,这种映射应该使分类器的工作更容易,因为数据变得更容易分离。
现在,我们可以查看典型的异或示例来理解这个概念。异或函数是一个二进制函数,它看起来像这样:
蓝色的点被划分为0,红色的点被划分为1。我们可以假设这是一个噪声异或,因为集群有一个很大的传播。我们马上注意到一件事,数据不是线性可分的。也就是说,我们不能在红蓝点之间画一条线,把它们分开。
在这种情况下我们能做什么?我们可以应用一个特定的映射函数,使我们的工作变得容易得多。具体地说,让我们构造一个映射函数,它将对通过红点集群的直线周围的输入空间进行单向反射。我们要把这条直线下的所有点都反射到这条直线上。我们的映射函数将得到以下结果:
在映射之后,我们的数据变得很好地线性可分离,因此如果我们有一个模型,在理想情况下,它可以分离超平面(例如感知器),这是理想情况之一。 显然,线性可分性是一件非常好的事情。 但是为了构建有效的模型,我们不一定需要线性可分性,这意味着并非所有的映射函数都需要导致线性可分的数据才能构建有效的模型。
人们经常混淆应用内核和应用映射函数的概念。核函数的输出是一个标量,是两点的相似性或差异性度量。映射函数的输出是一个向量,我们在此基础上计算相似性。内核的特别之处在于,我们有时可以计算原始空间中映射的点积,而不需要显式地映射输入。这允许我们处理无限维映射!
在文章的后,我想以推荐Smola和Schoelkopf合著的《用内核学习》一书作为结束语。本书对内核机及其理论背景进行了全面的论述,值得一看!