趋近智
高斯过程(GP)提供了一种灵活的非参数方法来对函数进行建模,直接在函数空间上设定先验。协方差函数(或核函数)编码了对函数属性(如平滑性或周期性)的设想。GP回归允许在新的点 x∗ 处预测 f∗,并获得不确定性估计 E[f∗∣y] 和 Var[f∗∣y].
然而,核函数本身(例如流行的径向基函数(RBF)核函数:k(x,x′)=σf2exp(−2l2∥x−x′∥2))包含参数:信号方差 σf2 和长度尺度 l。类似地,GP回归中常用的高斯似然 p(y∣f)=N(y∣f,σn2) 引入了一个噪声方差参数 σn2。这些参数统称为 θ={σf2,l,σn2},称为超参数。我们如何为它们选择合适的值呢?
不同于通常的有监督学习中我们可能使用交叉验证来调整超参数,GP的贝叶斯特性提供了一种更统一的方法:优化边际似然(也称为证据)。
其核心思路是找到超参数值 θ,使得在给定输入 X 和超参数 θ 的情况下,观测到实际数据 y 的概率达到最大。这个概率是通过对训练点上未知的函数值 f 进行积分(或边际化)来获得的:
p(y∣X,θ)=∫p(y∣f,σn2)p(f∣X,θkernel)df这里,θkernel 表示核超参数(例如 l 和 σf2),并且我们明确显示了似然项中的噪声方差 σn2。
由于先验 p(f∣X,θkernel) 和似然 p(y∣f,σn2) 都是高斯分布(假设回归中使用高斯似然),这个积分可以解析求解。其结果是 y 本身的高斯分布:
y∣X,θ∼N(0,Ky)=N(0,Kf+σn2I)其中 Kf 是使用核参数在训练输入 X 处计算得到的 N×N 协方差矩阵,Kij=k(xi,xj∣θkernel,而 I 是单位矩阵。Ky=Kf+σn2I 是观测数据点 y 的协方差矩阵,它结合了函数变异性(来自 Kf)和观测噪声(来自 σn2I)。
为了数值稳定性和计算便利,我们通常使用对数边际似然:
logp(y∣X,θ)=−21yTKy−1y−21log∣Ky∣−2Nlog(2π)让我们分解一下这些重要项:
数据拟合项: −21yTKy−1y 此项衡量模型解释观测数据 y 的效果。它鼓励超参数设置,使得在由协方差 Ky 定义的高斯分布下,观测输出 y 具有较高概率。如果基于 Ky 的预测与实际的 y 相差较大,则此项会变成一个较大的负数(表示惩罚)。
复杂性惩罚项: −21log∣Ky∣ 此项涉及协方差矩阵 Ky 的行列式的对数。行列式 ∣Ky∣ 衡量分布所覆盖的“体积”。导致点之间高度相关(例如,长度尺度非常大)或方差非常大(σf2 或 σn2 很大)的核函数会产生更大的行列式,从而导致此项更大的惩罚。此项起到了自动“奥卡姆剃刀”的作用,惩罚过于复杂的模型(例如,那些过于灵活或假设过多噪声的模型)。
归一化常数: −2Nlog(2π) 此项对于超参数 θ 是常数,在优化过程中可以忽略。
最大化对数边际似然会促成一种权衡:找到能够使模型很好地拟合数据(第一项),同时避免不必要的复杂性(第二项)的超参数。
目标是找到使对数边际似然最大化的超参数 θ∗:
θ∗=argθmaxlogp(y∣X,θ)由于对数边际似然函数通常对超参数 θ(包括核参数如 l,σf2 和噪声方差 σn2)可导,我们可以使用标准的基于梯度的优化算法。常用选项包括:
要使用这些方法,我们需要对数边际似然对每个超参数 θj∈θ 的偏导数。该导数具有相对简洁的解析形式:
∂θj∂logp(y∣X,θ)=21yTKy−1∂θj∂KyKy−1y−21Tr(Ky−1∂θj∂Ky)这里,∂θj∂Ky 是包含核函数(如果 θj=σn2 则加上噪声项)对超参数 θj 的逐元素偏导数的矩阵。对于标准核函数,这些导数通常易于计算。例如,如果 Ky=Kf+σn2I,并且 θj 是像长度尺度 l 这样的核参数,那么 ∂θj∂Ky=∂l∂Kf。如果 θj=σn2,那么 ∂θj∂Ky=I。
现代的GP库(如GPy、GPflow、scikit-learn的 GaussianProcessRegressor、GPytorch)会自动计算这些梯度并为您执行优化。通常您只需定义核结构并提供数据。
# 使用类似 scikit-learn 接口的示例
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C, WhiteKernel
# 定义带有初始超参数的核函数(这些参数将被优化)
# 核函数: k(x, x') = C(常数值) * RBF(长度尺度) + WhiteKernel(噪声水平)
# 我们通常优化对数变换后的参数以获得稳定性
kernel = C(1.0) * RBF(length_scale=1.0) + WhiteKernel(noise_level=1.0)
# 创建 GP 模型
# n_restarts_optimizer 通过从不同点重新开始有助于找到更好的最优解
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10, random_state=42)
# 拟合模型:此步骤执行对数边际似然最大化
# X_train, y_train 是您的训练数据
# gp.fit(X_train, y_train)
# 拟合后,优化的超参数会被保存
# print(f"优化后的核函数: {gp.kernel_}")
# print(f"对数边际似然: {gp.log_marginal_likelihood(gp.kernel_.theta)}")
# 示例输出(示意性):
# 优化后的核函数: 1.5**2 * RBF(length_scale=0.8) + WhiteKernel(noise_level=0.1)
# 对数边际似然: -15.23
尽管功能强大,但优化边际似然并非没有挑战:
n_restarts_optimizer)。让我们看看在一个简单的1D回归问题中,对于RBF核函数,对数边际似然(LML)如何随长度尺度(l)和信号方差(σf2)这两个超参数(为简化起见,噪声 σn2 固定)的变化而变化。
等高线图显示了RBF核函数长度尺度和信号方差不同组合下的对数边际似然(LML)值。优化算法在此曲面上寻找峰值(最高的LML值)。这种可能复杂的形状表明为什么可能需要多次重启才能找到全局最优解。
通过找到使观测数据概率最大化的超参数,边际似然优化提供了一种有原则且通常有效的方法来调整GP模型,将模型选择直接融入贝叶斯推理框架中。这与交叉验证等方法不同,它提供了一种更节省数据的方法,尤其是在数据稀缺时。一旦找到最优超参数 θ∗,它们将被代入GP预测方程,用于在新数据上进行预测。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造