高斯过程:从随机过程中来,到机器学习中去
机器学习中的概率分布与随机过程
高斯过程、高斯分布,很多时候容易让人傻傻分不清楚,很多相关文章也上来就开始甩概念,然后抛出一张很炫酷的如下所示的拟合图,好像就默认读者已经有了随机过程等概念的前置知识了,然而现实往往并不是这样。
因此,在这篇文章的开始,我觉得有必要梳理一下,在机器学习的场景下,如何引入 label 的概率分布以及随机过程的概念。
首先,给出一个看起来有点绕的描述:
- 从概率论与数理统计的角度来看,高斯过程是一个随机过程,其刻画了一组依赖于参数的随机变量的全体,也就是说,对于任意随机变量,高斯过程都能给出一个与之对应的概率分布;
- 而从机器学习的视角来看,它是一个非参的概率模型,也就是说,高斯模型基于过往已知的样本及其对应 label,构建起对未知样本的 label 取值的概率分布。
接下来,再一点点地予以阐述。
引入概率分布描述 Label
当我们不考虑概率分布时,机器学习,尤其是监督学习,其实就是要拟合一个函数$f$,使得在数据集$\mathcal{D}$上,对所有的样本$\mathbf{x}_i$及其对应的 label $y_i$,有:
$$ \min \sum_{i}\left\Vert f\left(\mathbf{x}_i\right)-y_i\right\Vert $$
但有些时候,我们不希望对$\mathbf{x}$和$y$之间的关系做一个确定性的建模,而是希望引入一个概率分布来描述$\mathbf{x}$和$y$的关系,这么做的目的主要在于:
- 使得建模对噪声有更好的鲁棒性。
- 对带有随机性的关系进行建模。
- 在小数据量下,用一个相对简单的先验对复杂关系进行建模。
那我们不妨先从最简单的高斯分布来讲起,对于一个样本集合$\mathcal{X}$,对于其中任意样本$\mathbf{x}\in\mathcal{X}, \mathbf{x}\in \mathbb{R}^{n}$,都有一个对应的 label $y$。通常情况下,我们可能会选择直接用一个函数$f$来拟合$\mathbf{x}$到$y$之间的映射,例如线性回归
$$ f\left(x\right)=\mathbf{w}\mathbf{x}+\mathbf{b} $$
如果我们引入一个概率分布来描述$\mathbf{x}$和$y$的关系,那其实就是认为 label 的取值服从某个与$\mathbf{x}$相关的概率分布:
$$ y\thicksim \mathcal{F}\left(\mathbf{x}\right) $$
也就是说,我们将 label $y$ 看作一个随机变量,且该随机变量的所服从的分布是和样本$\mathbf{x}$有关的,那么我们自然就可以用一个与$\mathbf{x}$相关的函数来对 label 的分布进行刻画,在这里我们就直接用高斯分布为例:
$$ y\thicksim\mathcal{N}\left(\mu\left(\mathbf{x}\right), \sigma^2\left(\mathbf{x}\right)\right) $$
其中$\mu$和$\sigma^2$又被称为均值函数和方差函数。
随机过程描述概率分布
引入概率分布到机器学习模型拟合的过程应该还是比较直观的,实际上就是根据样本$\mathbf{x}$构建一个高斯分布,最裸的方法就是构建一个线性回归:
$$ f\left(\mathbf{x}\right)=\mathbf{w}\mathbf{x}+\mathbf{b} $$
那么就有
$$ y\thicksim\mathcal{N}\left(\mathbf{w}\mathbf{x}+\mathbf{b}, \sigma^2\right) $$
其中$\sigma$是一个人为定义的超参数。
这是一种非常简单粗暴的定义方式,直接以确定性回归的结果作为均值,并以一个固定值作为标准差。在这种定义方式下,所有 label $y$的概率分布可以看作是$\mathcal{N}\left(0 ,\sigma^2\right)$经过平移得到,这是有些反直觉的。因为一个很 intuitive 的想法就是,label $y$的概率分布的标准差不应该由人先验地进行定义,而是应当和实际的数据分布有关,但在只考虑一个样本的情况下我们好像无法处理这一问题。
这个时候就可以引入随机过程的概念,随机过程刻画了一组依赖于参数的随机变量的全体,这一概念看似好像和上面说的是一回事儿,就是对每个样本为 label 拟合一个概率分布。但注意我们前面的措辞是,刻画了一组随机变量的全体,也就是说,随机过程不仅仅刻画了单个随机变量的概率分布特征,实际上还刻画了在这一过程中所有随机变量的联合概率分布特征。
那么,在有了对所有随机变量地联合概率分布特征这一先验信息的前提下,我们自然也可以通过已知的随机变量的取值,得出一个未知的随机变量的后验概率。也就是说,通过随机过程可以刻画出所有已知确定取值的随机变量$y\in Y_{known}$和未知确定取值的随机变量$y^\prime$之间的多元联合概率分布$p\left(y^\prime, Y_{known}\right)$,再来计算$y^\prime$在已知$Y_{known}$情况下的条件概率分布$p\left(y^\prime|Y_{known}\right)$。
如上所述,随机过程可以看作是一个由$\mathbb{R}^{n},\mathbb{R}^{m\times \left(n+1\right)}$到一个概率分布的映射。也就是$y\thicksim\mathcal{P}\left(\mathbf{x}, \Omega\right)$,其中$\Omega$是已知确定取值的随机变量的集合,$\forall \omega\in\Omega, \omega=\left[\mathbf{x}_i:y_i\right]$。由于随机过程规定了所有随机变量所服从的联合概率分布,那么通过已知的随机变量的实际取值和他们所对应的概率分布,计算出条件概率$p(y|\Omega)$,其实就可以得到一个$\mathbf{x}$到$y$所服从的概率分布的均值和方差的映射。
非参概率模型与随机过程
看到这里,是不是就能回过来一点味儿了?
我们说高斯过程从机器学习的视角来看是一个非参概率模型。
- 这里的非参意味着,给定一个输入$\mathbf{x}$,模型的输出不是由一个参数化的函数彻底确定的,而是根据输入$\mathbf{x}$与当前已知的数据集$\Omega$之间的关系计算出的,不同的$\Omega$会使得模型为同一个$\mathbf{x}$给出不同的返回值。
- 概率模型则是说这个模型返回的是一个概率分布。
那和我们上面所说的随机过程的定义相匹配一下,我们已经有了一系列已知确定值的随机变量$y$,每个$y$都可以由一个已知的参数$\mathbf{x}$确定表示,现在我们要基于这些已知确定值的随机变量,估计由参数$\mathbf{x}^\prime$所确定的新随机变量$y^\prime$所服从的概率分布。
什么是高斯过程?
在这一部分中,我将以机器学习的视角来对高斯过程进行介绍。
现在,假设我们已经有了一些输入数据$X$,并且已经知道了其对应的输出值$\mathbf{y}$,我们希望为一些未知输出值的输入数据$X^\prime$预测其输出值所服从的概率分布。
一句话定义:
所有随机变量服从多元联合高斯分布的随机过程,记作$\mathcal{GP}$.
基本假设
在谈基本假设的时候,我们暂且先短暂的回到概率论的视角上来
高斯过程假设一组参数化的随机变量的全体,服从一个多元联合高斯分布。这句话其实隐含了三个假设:
- 任意一个随机变量都服从高斯分布
- 任意两个随机变量之间都服从多元联合高斯分布,也就是说,协方差矩阵不一定是对角阵
- 对于随机变量数量为无穷大的情况,任选任意个随机变量,它们也服从多元联合高斯分布,且选取后变量的多元联合高斯分布
- 均值向量为原多元联合高斯分布的均值向量中的对应位数
- 协方差矩阵为原多元联合高斯分布的协方差矩阵的对应子式
模型
符号定义
基于高斯过程的基本假设,我们从机器学习的角度先给出以下几个符号定义:
- 已观测样本集合$X\in \mathbb{R}^{m\times n}$,其中$m$为已观测样本数量,$n$为样本参数维度,每个样本为$\mathbf{x}$
- $X$中样本对应的随机变量为$\hat{\mathbf{y}}$,观测结果$\mathbf{y}\in \mathbb{R}^{m}$
- 待预测样本集合$X^\prime\in \mathbb{R}^{q\times n}$,其中$q$为待预测样本数量,$n$为样本参数维度,每个样本为$\mathbf{x}^\prime$
- $X^\prime$样本对应的随机变量为$\hat{\mathbf{y}}^{\prime}$
- $\left(\cdot,\cdot\right)$为向量的内积运算,定义了一个欧式空间内的两个向量到一个实数的映射$\mathbb{R}^n,\mathbb{R}^n\mapsto \mathbb{R}$,内积运算并不一定是向量的点积,可以是满足以下四条性质的任意运算:
- $\left(\alpha,\beta\right) = \left(\beta, \alpha\right)$
- $\left(k\alpha, \beta\right) = k\left(\alpha, \beta\right)$
- $\left(\alpha+\beta, \gamma\right) = \left(\alpha,\gamma\right)+\left(\beta,\gamma\right)$
- $\left(\alpha,\alpha\right)\geq0$, 当且仅当$\alpha=\mathbf{0}$时,$\left(\alpha,\alpha\right)=0$
- $K\left(U\right)$是向量组$U$的 Gram 矩阵,$K\left(U\right)=\left[\left(\mathbf{u}_i,\mathbf{u}_j\right)\right]_{s\times s}\in \mathbb{R}^{s\times s}$,其中$s$为$U$中向量个数
- $K\left(U,V\right)$是向量组$U$和$V$的 Gram 矩阵$K\left(U,V\right)=\left[\left(\mathbf{u}_i,\mathbf{v}_j\right)\right]_{s\times t}\in \mathbb{R}^{s\times t}$,其中$s$为$U$中向量个数,$t$为$V$中向量个数
- $\mathcal{N}\left(\mu, \Sigma\right)$表示一个高斯分布,其中$\mu$是均值向量,$\Sigma$是协方差矩阵
- $\left[\begin{aligned}y_1\\y_2\end{aligned}\right]$表示随机变量$y_1$和$y_2$的联合概率分布
- $y_1|y_2$则表示随机变量$y_2$已知情况下,$y_1$的条件概率分布
模型推导
确定一个多元联合高斯分布需要明确两个要素,均值和协方差,那么对于一个已观测样本集合$X\in \mathbb{R}^{m\times n}$,其对应了$m$个随机变量$\hat{\mathbf{y}}$,其对应的多元高斯联合分布为:
$$ \hat{\mathbf{y}}\thicksim\mathcal{N}\left(\mu, \Sigma\right) $$
在高斯过程中,为了简化模型,使数学上的处理和计算更加便利,通常设置$\mu=\mathbf{0}$。对于这一设定,虽然看起来会降低对任意单个样本单独建模的精度,但是考虑贝叶斯视角下条件概率对后验概率分布的影响,核函数技术的引入,样本数据中心化(Mean Centering)的处理等因素,以及实际实践中的效果,零均值这一设定已经被证明是合理且有效的了。
而协方差矩阵的取值在最基本的高斯过程中被设置为$\Sigma=K\left(X\right)$,也即$\hat{\mathbf{y}}$对应的样本$X$的 Gram 矩阵。
所以最终可以得到:
$$ \hat{\mathbf{y}}\thicksim\mathcal{N}\left(\mathbf{0}, K\left(X\right)\right) $$
现在在建模中加入待预测的样本集合$X^\prime\in\mathbb{R}^{q\times n}$,其对应了$q$个随机变量$\hat{\mathbf{y}}^{\prime}$,那么$\hat{\mathbf{y}}$和$\hat{\mathbf{y}}^{\prime}$的联合高斯分布为:
$$ \left[\begin{aligned}\hat{\mathbf{y}}\\\hat{\mathbf{y}}^\prime\end{aligned}\right]\thicksim \mathcal{N}\left(\mathbf{0}, \left[\begin{aligned}& K\left(X\right) & K\left(X, X^\prime\right) \\ & K\left(X^\prime,X\right) & K\left(X^\prime\right)\end{aligned}\right]\right) $$
根据贝叶斯定理,多元联合高斯分布有如下性质: 若随机变量组$\mathbf{a}$和$\mathbf{b}$的联合分布为
$$ \left[\begin{aligned}\mathbf{a}\\\mathbf{b}\end{aligned}\right]\thicksim \mathcal{N}\left(\left[\begin{aligned}\mathbf{\mu}_a\\\mathbf{\mu}_b\end{aligned}\right], \left[\begin{aligned}& A & C \\ & C^{\mathsf{T}} & B\end{aligned}\right]\right) $$
则当$\mathbf{a}$已知时,根据贝叶斯定义可知,条件概率$\mathbf{b}|\mathbf{a}$为:
$$ \mathbf{b}|\mathbf{a}\thicksim \mathcal{N}\left(\mu_b+C^{\mathsf{T}}A^{-1}\left(\mathbf{a}-\mu_a\right), B-C^{\mathsf{T}}A^{-1}C\right) $$
因此,在有了$\hat{\mathbf{y}}$和$\hat{\mathbf{y}}^{\prime}$的联合高斯分布后,若$\hat{\mathbf{y}}$的实际值为$\mathbf{y}$,根据多元联合高斯分布的条件分布性质可知:
$$ \hat{\mathbf{y}}^{\prime}|\hat{\mathbf{y}} \thicksim \mathcal{N}\left(K\left(X^\prime, X\right)K^{-1}\left(X\right)\mathbf{y},\quad K\left(X^\prime\right)-K\left(X^\prime, X\right)K^{-1}\left(X\right)K\left(X,X^\prime\right)\right) $$
也就是说,基于高斯过程最基本的假设,当已知样本$X$的观测值为$\mathbf{y}$时,待预测样本$X^\prime$的后验概率分布为一个高斯分布,该高斯分布:
- 均值为$K\left(X^\prime, X\right)K^{-1}\left(X\right)\mathbf{y}$
- 协方差矩阵为$K\left(X^\prime\right)-K\left(X^\prime, X\right)K^{-1}\left(X\right)K\left(X,X^\prime\right)$
核函数的引入
为何需要核函数?
在高斯过程最基本的设定中,我们设置$K\left(X\right)$为$X$的 Gram 矩阵,$K\left(X\right)$中的每个元素都是$X$中样本的内积,虽然内积运算并不一定是向量点积,但其运算一定是线性的。这也就意味着对协方差的建模一定是一个线性建模,这对于模型的建模能力而言是有着较大的限制的,为什么呢?
协方差的意义其实在于度量两个随机变量之间的相关程度,对于两个参数化表示的随机变量而言,协方差某种程度上可以看作是这两个随机变量的参数表示之间的距离度量,距离度量越近则意味着两个随机变量的相关程度越高。
对于高斯过程而言,找到一个合适的先验距离度量方式,可以更加精准地对所有随机变量的全体进行建模,从而提高对未知样本的预测精准度。然而正如前面所说,内积运算一定是一种线性的运算,但随机变量之间的参数化表达和相关程度之间的关系,往往并不是线性的,这其中可能包含有复杂的非线性变换。因此,仅能进行线性操作的内积运算在这类场景下很难刻画出所有随机变量的联合概率分布特征。
如何引入核函数?
为了突破线性距离度量的限制,研究者提出了引入 Kernel trick,也就是核方法来对随机变量之间的相关程度进行先验的刻画与度量。在引入核方法后,函数$K\left(U\right)$的定义就变成了$K\left(U\right)=\left[\kappa\left(\mathbf{u}_i,\mathbf{u}_j\right)\right]_{s\times s}\in \mathbb{R}^{s\times s}$,而函数$K\left(U,V\right)$的定义也就变成了$K\left(U,V\right)=\left[\kappa\left(\mathbf{u}_i, \mathbf{v}_j\right)\right]_{s\times t}\in \mathbb{R}^{s\times t}$。其中函数$\kappa$就被成为核函数。核函数并不像强调要求内积运算的四个条件,但一般而言需要其满足半正定性,也就是说,对于任意样本集合$X$,$K\left(X\right)$都一定是一个半正定矩阵。
有哪些常见的核函数?
- 线性核(Linear kernel):$\kappa\left(\mathbf{x}_1, \mathbf{x}_2\right)=\left(\mathbf{x}_1, \mathbf{x}_2\right)$。
- 径向基函数核(Radial basis function kernel):$\kappa\left(\mathbf{x}_1, \mathbf{x}_2\right)=\exp\left(-\dfrac{\left\Vert\mathbf{x}_1-\mathbf{x}_2\right\Vert_2^2}{2\sigma^2}\right)$,$\sigma$是需要人为定义的超参数。也被称作高斯核(Gaussian Kernel)。
- 拉普拉斯核(Laplacian kernel):$\kappa\left(\mathbf{x}_1, \mathbf{x}_2\right)=\exp\left(-\dfrac{\left\Vert\mathbf{x}_1-\mathbf{x}_2\right\Vert}{2\sigma^2}\right)$,$\sigma$是需要人为定义的超参数。
- 多项式核(Polynomial kernel):$\kappa\left(\mathbf{x}_1, \mathbf{x}_2\right)=\left(\left(\mathbf{x}_1,\mathbf{x}_2\right)+c\right)^d$,其中$c$与$d$是需要人为定义的超参数。
- Sigmoid 核(Sigmoid kernel):$\kappa\left(\mathbf{x}_1, \mathbf{x}_2\right)=\tanh\left(\beta\left(\mathbf{x}_1,\mathbf{x}_2\right)+\theta\right)$,其中$\beta$和$\theta$是需要人为定义的超参数。
组合核函数
对于任意两个核函数$\kappa_1$、$\kappa_2$,下面的新核也是合法的:
- $\kappa\left(\mathbf{x}_1,\mathbf{x}_2\right)=\gamma_1\kappa_1+\gamma_2\kappa_2$
- $\kappa\left(\mathbf{x}_1,\mathbf{x}_2\right)=f\left(\mathbf{x}_1\right)\kappa_1\left(\mathbf{x}_1,\mathbf{x}_2\right)f\left(\mathbf{x}_2\right)$
- $\kappa\left(\mathbf{x}_1,\mathbf{x}_2\right)=\exp\left(\kappa_1\left(\mathbf{x}_1,\mathbf{x}_2\right)\right)$
- $\kappa\left(\mathbf{x}_1,\mathbf{x}_2\right) = q\left(\kappa_1\left(\mathbf{x}_1,\mathbf{x}_2\right)\right)$
- $\kappa\left(\mathbf{x}_1,\mathbf{x}_2\right) = \mathbf{x}_1A\mathbf{x}_2$
- $\kappa\left(\mathbf{x}_1,\mathbf{x}_2\right) = \kappa_3\left(g\left(\mathbf{x}_1\right), g\left(\mathbf{x}_2\right)\right)$
- $\kappa\left(\mathbf{x}_1,\mathbf{x}_2\right) = \kappa_a\left(\mathbf{x}_{a1},\mathbf{x}_{a2}\right)+\kappa_b\left(\mathbf{x}_{b1},\mathbf{x}_{b2}\right)$
- $\kappa\left(\mathbf{x}_1,\mathbf{x}_2\right) = \kappa_a\left(\mathbf{x}_{a1},\mathbf{x}_{a2}\right)\kappa_b\left(\mathbf{x}_{b1},\mathbf{x}_{b2}\right)$
对于以上公式,其中新变量与函数需要满足的条件是:
- $\gamma_1,\gamma_2$是非负实数,且不同时等于0
- $q\left(\cdot\right)$是一个系数非负的多项式
- $f$是任意函数
- $g\left(\mathbf{x}\right)$是是将$\mathbf{x}$映射到$\mathbb{R}^M$空间的一个函数,$\kappa_3$是$\mathbb{R}^M$中一个合法的核函数
- $A$是一个半正定矩阵
- $\mathbf{x}_a,\mathbf{x}_b$是变量($\mathbf{x}_a,\mathbf{x}_b$不一定不相交),且$\mathbf{x}=\left(\mathbf{x}_a;\mathbf{x}_b\right)$,也就是说$\mathbf{x}$由$\mathbf{x}_a$和$\mathbf{x}_b$中的元素组成。$\kappa_a,\kappa_b$是各自空间合法的核函数。
核函数意味着什么?
对于核函数$\kappa\left(\mathbf{x_1},\mathbf{x_2}\right)$,其可以看作有一个映射函数$\phi$将随机变量的参数化表示$\mathbf{x}_1$和$\mathbf{x}_2$各自映射到另一个线性空间(通常是一个更高维的线性空间,甚至可能是无限维线性空间)中,使得在这个线性空间中,内积运算就可以很好得反映随机变量之间的相关程度。核函数的返回值就是映射后两个向量的内积,也就是$\kappa\left(\mathbf{x_1},\mathbf{x_2}\right)=\left(\phi\left(\mathbf{x}_1\right), \phi\left(\mathbf{x}_2\right)\right)$。
这个映射函数$\phi$可以是非常复杂以至于根本无法以明确的数学形式写出,但核函数的魅力就在于,我们不需要直接去求这样一个复杂的映射,就可以计算出两个参数化表示的随机变量之间的相关程度。
除了在高斯过程中,核函数同样应用在SVM、LDA等分类器中,在这些分类器中应用核函数的目的在于,将原本线性不可分的数据映射到高维线性空间后使其线性可分。