18.1. 高斯过程简介
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 SageMaker Studio Lab 中打开 Notebook

在许多情况下,机器学习等同于从数据中估计参数。这些参数通常数量众多且相对难以解释——例如神经网络的权重。相比之下,高斯过程提供了一种直接推断函数高层属性的机制,这些函数可能拟合我们的数据。例如,我们可能对这些函数是快速变化的、周期性的、涉及条件独立性还是平移不变性有所了解。高斯过程使我们能够通过直接指定一个可能拟合我们数据的函数值上的高斯分布,从而轻松地将这些属性纳入我们的模型中。

让我们通过一些例子来感受一下高斯过程是如何运作的。

假设我们观察到以下数据集,即由输入 \(x\) 索引的回归目标(输出)\(y\)。例如,目标可以是二氧化碳浓度的变化,而输入可以是记录这些目标的时间。这些数据有什么特征?它看起来变化得多快?我们的数据点是按规律间隔收集的,还是有缺失的输入?你会如何想象填充缺失区域,或者预测到 \(x=25\) 的情况?

../_images/gp-observed-data.svg

图 18.1.1 观测到的数据。

为了用高斯过程拟合数据,我们首先指定一个先验分布,描述我们认为哪些类型的函数是合理的。这里我们展示了来自一个高斯过程的几个样本函数。这个先验看起来合理吗?注意,这里我们不是在寻找拟合我们数据集的函数,而是在指定解的合理的高层属性,例如它们随输入变化的快慢。注意,我们将在下一节关于先验和推断的notebook中看到复现本notebook中所有图表的代码。

../_images/gp-sample-prior-functions.svg

图 18.1.2 我们可能希望用模型表示的先验函数样本。

一旦我们以数据为条件,我们就可以使用这个先验来推断可能拟合数据的函数的后验分布。这里我们展示了样本后验函数。

../_images/gp-sample-posterior-functions.svg

图 18.1.3 一旦我们观察到数据后的样本后验函数。

我们看到这些函数中的每一个都与我们的数据完全一致,完美地穿过每一个观测点。为了使用这些后验样本进行预测,我们可以对后验中所有可能的样本函数的值进行平均,从而创建下面以粗蓝色表示的曲线。请注意,我们实际上不必为了计算这个期望而进行无限次抽样;正如我们稍后将看到的,我们可以以封闭形式计算这个期望。

../_images/gp-posterior-samples.svg

图 18.1.4 后验样本,以及可用于点预测的后验均值(蓝色)。

我们可能还想要一个不确定性的表示,这样我们就能知道对我们的预测应该有多大的信心。直观地说,在样本后验函数变异性更大的地方,我们应该有更大的不确定性,因为这告诉我们真实函数可能取的值有更多可能性。这种不确定性被称为 *认知不确定性* (epistemic uncertainty),它是与信息缺乏相关的 *可约减的不确定性*。随着我们获取更多数据,这种不确定性会消失,因为与我们观察到的一致的解会越来越少。就像后验均值一样,我们可以以封闭形式计算后验方差(这些函数在后验中的变异性)。我们用阴影显示了均值两侧的两倍后验标准差,创建了一个 *可信区间*,对于任何输入 \(x\),该区间有 95% 的概率包含函数的真值。

../_images/gp-posterior-samples-95.svg

图 18.1.5 后验样本,包括 95% 可信集。

如果我们移除后验样本,只可视化数据、后验均值和 95% 可信集,图像看起来会更清晰一些。注意不确定性是如何随着远离数据而增长的,这是认知不确定性的一个特性。

../_images/gp-point-predictions.svg

图 18.1.6 点预测和可信集。

我们用来拟合数据的高斯过程的属性,受到所谓的 *协方差函数*(也称为 *核函数*)的强烈控制。我们使用的协方差函数被称为 *RBF(径向基函数)核*,其形式为

(18.1.1)\[k_{\textrm{RBF}}(x,x') = \textrm{Cov}(f(x),f(x')) = a^2 \exp\left(-\frac{1}{2\ell^2}||x-x'||^2\right)\]

这个核的 *超参数* 是可解释的。*振幅* 参数 \(a\) 控制函数变化的垂直尺度,而 *长度尺度* 参数 \(\ell\) 控制函数的变化率(摆动性)。更大的 \(a\) 意味着更大的函数值,更大的 \(\ell\) 意味着变化更慢的函数。让我们看看当我们改变 \(a\)\(\ell\) 时,我们的样本先验和后验函数会发生什么变化。

*长度尺度* 对高斯过程的预测和不确定性有特别显著的影响。当 \(||x-x'|| = \ell\) 时,一对函数值之间的协方差是 \(a^2\exp(-0.5)\)。在比 \(\ell\) 更大的距离上,函数值变得几乎不相关。这意味着如果我们想在点 \(x_*\) 处进行预测,那么输入为 \(x\) 且满足 \(||x-x'||>\ell\) 的函数值对我们的预测不会有强烈影响。

让我们看看改变长度尺度如何影响样本先验和后验函数以及可信集。上面的拟合使用了 \(2\) 的长度尺度。现在让我们考虑 \(\ell = 0.1, 0.5, 2, 5, 10\)。相对于我们正在考虑的输入域范围 \(25\)\(0.1\) 的长度尺度非常小。例如,在这样的长度尺度下,函数在 \(x=5\)\(x=10\) 处的值基本上没有相关性。另一方面,对于 \(10\) 的长度尺度,这些输入处的函数值将高度相关。请注意,下图中垂直尺度会发生变化。

priorpoint1 postpoint1

priorpoint5 postpoint5

prior2 post2

prior5 post5

注意,随着长度尺度的增加,函数的“摆动性”减少,我们的不确定性也随之降低。如果长度尺度很小,当我们远离数据时,不确定性会迅速增加,因为数据点对于函数值的信息量变得更少。

现在,让我们改变振幅参数,同时保持长度尺度固定为 \(2\)。注意,对于先验样本,垂直尺度是固定的,而对于后验样本,垂直尺度是变化的,这样你就可以清楚地看到函数尺度的增加以及对数据的拟合。

priorap1 postapoint1

priora2 posta2

priora8 posta8

我们看到振幅参数影响函数的尺度,但不影响变化率。至此,我们也感觉到我们程序的泛化性能将取决于这些超参数的合理值。 \(\ell=2\)\(a=1\) 的值似乎提供了合理的拟合,而其他一些值则没有。幸运的是,有一种稳健且自动的方法来指定这些超参数,即使用所谓的 *边际似然*,我们将在关于推断的notebook中回到这个问题。

那么,高斯过程到底是什么?正如我们开始时所说,高斯过程简单地表明,任何函数值的集合 \(f(x_1),\dots,f(x_n)\),由任何输入集合 \(x_1,\dots,x_n\) 索引,都服从联合多元高斯分布。这个分布的均值向量 \(\mu\) 由一个 *均值函数* 给出,该函数通常被设为常数或零。这个分布的协方差矩阵由在所有输入对 \(x\) 上评估的 *核函数* 给出。

(18.1.2)\[\begin{split}\begin{bmatrix}f(x) \\f(x_1) \\ \vdots \\ f(x_n) \end{bmatrix}\sim \mathcal{N}\left(\mu, \begin{bmatrix}k(x,x) & k(x, x_1) & \dots & k(x,x_n) \\ k(x_1,x) & k(x_1,x_1) & \dots & k(x_1,x_n) \\ \vdots & \vdots & \ddots & \vdots \\ k(x_n, x) & k(x_n, x_1) & \dots & k(x_n,x_n) \end{bmatrix}\right)\end{split}\]

公式 (18.1.2) 指定了一个高斯过程先验。我们可以计算给定我们已观察到的函数值 \(f(x_1), \dots, f(x_n)\) 时,任意 \(x\) 对应的 \(f(x)\) 的条件分布。这个条件分布称为 *后验*,我们用它来进行预测。

特别地,

(18.1.3)\[f(x) | f(x_1), \dots, f(x_n) \sim \mathcal{N}(m,s^2)\]

其中

(18.1.4)\[m = k(x,x_{1:n}) k(x_{1:n},x_{1:n})^{-1} f(x_{1:n})\]
(18.1.5)\[s^2 = k(x,x) - k(x,x_{1:n})k(x_{1:n},x_{1:n})^{-1}k(x,x_{1:n})\]

其中 \(k(x,x_{1:n})\) 是一个 \(1 \times n\) 的向量,通过对 \(i=1,\dots,n\) 计算 \(k(x,x_{i})\) 形成;\(k(x_{1:n},x_{1:n})\) 是一个 \(n \times n\) 的矩阵,通过对 \(i,j = 1,\dots,n\) 计算 \(k(x_i,x_j)\) 形成。\(m\) 是我们可以用作任何 \(x\) 的点预测器,而 \(s^2\) 是我们用于不确定性的:如果我们想创建一个有 95% 概率包含 \(f(x)\) 的区间,我们会使用 \(m \pm 2s\)。上述所有图中的预测均值和不确定性都是使用这些方程创建的。观测数据点由 \(f(x_1), \dots, f(x_n)\) 给出,并选择了一组精细的 \(x\) 点来进行预测。

假设我们观察到一个数据点 \(f(x_1)\),并且我们想要确定在某个 \(x\)\(f(x)\) 的值。因为 \(f(x)\) 是由高斯过程描述的,我们知道 \((f(x), f(x_1))\) 上的联合分布是高斯的。

(18.1.6)\[\begin{split}\begin{bmatrix} f(x) \\ f(x_1) \\ \end{bmatrix} \sim \mathcal{N}\left(\mu, \begin{bmatrix} k(x,x) & k(x, x_1) \\ k(x_1,x) & k(x_1,x_1) \end{bmatrix} \right)\end{split}\]

非对角线表达式 \(k(x,x_1) = k(x_1,x)\) 告诉我们函数值的相关性有多大——即 \(f(x)\)\(f(x_1)\) 决定的程度。我们已经看到,如果我们使用相对于 \(x\)\(x_1\) 之间距离 \(||x-x_1||\) 较大的长度尺度,那么函数值将高度相关。我们可以在函数空间和 \(f(x_1), f(x)\) 的联合分布中,可视化从 \(f(x_1)\) 确定 \(f(x)\) 的过程。我们首先考虑一个 \(x\),使得 \(k(x,x_1) = 0.9\)\(k(x,x)=1\),这意味着 \(f(x)\) 的值与 \(f(x_1)\) 的值中度相关。在联合分布中,等概率线的轮廓将是相对窄的椭圆。

假设我们观察到 \(f(x_1) = 1.2\)。为了以这个 \(f(x_1)\) 的值为条件,我们可以在密度图上画一条在 \(1.2\) 处的水平线,并看到 \(f(x)\) 的值主要被限制在 \([0.64,1.52]\) 内。我们也在函数空间中绘制了这张图,用橙色显示观察点 \(f(x_1)\),用蓝色显示高斯过程对 \(f(x)\) 的预测分布的一个标准差,围绕均值 \(1.08\)

Contours of constant probability of a bivariate Gaussian density over :math:`f(x_1)` and :math:`f(x)` with :math:`k(x,x_1) = 0.9`. Gaussian process predictive distribution in function space at :math:`f(x)`, with :math:`k(x,x_1) = 0.9`.

现在假设我们有更强的相关性,\(k(x,x_1) = 0.95\)。现在椭圆变得更窄了,\(f(x)\) 的值更强烈地由 \(f(x_1)\) 决定。在 \(1.2\) 处画一条水平线,我们看到 \(f(x)\) 的轮廓支持的值主要在 \([0.83, 1.45]\) 内。同样,我们也在函数空间中显示了这张图,围绕预测均值 \(1.14\) 的一个标准差。

Contours of constant probability of a bivariate Gaussian density over :math:`f(x_1)` and :math:`f(x)` with :math:`k(x,x_1) = 0.95`. Gaussian process predictive distribution in function space at :math:`f(x)`, with :math:`k(x,x_1)` = 0.95.

我们看到,我们的高斯过程的后验均值预测器更接近 \(1.2\),因为现在有更强的相关性。我们也看到我们的不确定性(误差棒)有所减少。尽管这些函数值之间有很强的相关性,但我们的不确定性仍然相当大,因为我们只观察到了一个数据点!

这个过程可以为我们提供任意 \(x\) 处的 \(f(x)\) 的后验分布,无论我们观察了多少个点。假设我们观察到 \(f(x_1), f(x_2)\)。我们现在在函数空间中可视化在特定 \(x=x'\)\(f(x)\) 的后验。 \(f(x)\) 的精确分布由上述方程给出。\(f(x)\) 服从高斯分布,其均值为

(18.1.7)\[m = k(x,x_{1:3}) k(x_{1:3},x_{1:3})^{-1} f(x_{1:3})\]

方差为

(18.1.8)\[s^2 = k(x,x) - k(x,x_{1:3})k(x_{1:3},x_{1:3})^{-1}k(x,x_{1:3})\]

在这个介绍性的notebook中,我们一直在考虑 *无噪声* 的观测。正如我们将看到的,包含观测噪声很容易。如果我们假设数据是由一个潜在的无噪声函数 \(f(x)\) 加上独立同分布的高斯噪声 \(\epsilon(x) \sim \mathcal{N}(0,\sigma^2)\) (方差为 \(\sigma^2\))生成的,那么我们的协方差函数就简单地变成 \(k(x_i,x_j) \to k(x_i,x_j) + \delta_{ij}\sigma^2\),其中当 \(i=j\)\(\delta_{ij} = 1\),否则为 \(0\)

我们已经开始对如何使用高斯过程来指定解的先验和后验,以及核函数如何影响这些解的属性有了一些直观的认识。在接下来的notebook中,我们将精确地展示如何指定一个高斯过程先验,介绍并推导各种核函数,然后通过自动学习核超参数的机制,并形成一个高斯过程后验来进行预测。虽然要习惯“函数上的分布”这样的概念需要时间和实践,但找到高斯过程预测方程的实际机制其实非常简单——这使得通过实践来形成对这些概念的直观理解变得容易。

18.1.1. 小结

在典型的机器学习中,我们用一些自由参数指定一个函数(例如神经网络及其权重),并且我们专注于估计那些可能无法解释的参数。而使用高斯过程,我们直接对函数上的分布进行推理,这使我们能够推断解的高层属性。这些属性由一个协方差函数(核)控制,该函数通常有几个高度可解释的超参数。这些超参数包括 *长度尺度*,它控制函数的(摆动)快慢。另一个超参数是振幅,它控制我们函数变化的垂直尺度。表示许多可以拟合数据的不同函数,并将它们组合成一个预测分布,是贝叶斯方法的一个显著特征。因为在远离数据的地方,可能的解之间存在更大的变异性,所以当远离数据时,我们的不确定性直观地会增加。

高斯过程通过在所有可能的函数值上指定一个多元正态(高斯)分布来表示函数上的分布。我们可以轻松地操作高斯分布,以根据任何其他值集合的值找到一个函数值的分布。换句话说,如果我们观察到一组点,那么我们可以以这些点为条件,推断出函数在任何其他输入处可能的值的分布。我们如何建模这些点之间的相关性是由协方差函数决定的,这也是定义高斯过程泛化属性的关键。虽然习惯高斯过程需要时间,但它们易于使用,应用广泛,并帮助我们理解和开发其他模型类别,如神经网络。

18.1.2. 练习

  1. 认知不确定性与观测不确定性之间有什么区别?

  2. 除了变化率和振幅,我们可能还想考虑函数的哪些其他属性?哪些是具有这些属性的函数的真实世界例子?

  3. 我们所考虑的 RBF 协方差函数表明,观测值之间的协方差(和相关性)随着它们在输入空间(时间、空间位置等)中距离的增加而减小。这是一个合理的假设吗?为什么是或为什么不是?

  4. 两个高斯变量的和是高斯变量吗?两个高斯变量的积是高斯变量吗?如果(a,b)服从联合高斯分布,那么 a|b (给定b的a)是高斯分布吗?a是高斯分布吗?

  5. 重复我们观察到数据点在 \(f(x_1) = 1.2\) 的练习,但现在假设我们额外观察到 \(f(x_2) = 1.4\)。设 \(k(x,x_1) = 0.9\),且 \(k(x,x_2) = 0.8\)。与只观察到 \(f(x_1)\) 时相比,我们对 \(f(x)\) 的值会更确定还是更不确定?现在我们对 \(f(x)\) 的值的均值和 95% 可信集是多少?

  6. 你认为增加我们对观测噪声的估计会增加还是减少我们对真实函数长度尺度的估计?

  7. 当我们远离数据时,假设我们预测分布中的不确定性增加到某一点后停止增加。这可能是为什么?

讨论