高斯过程基础:均值函数、协方差函数、核函数的选择

聊贝叶斯优化,高斯过程是绕不过的坎。说白了,高斯过程就是一组随机变量的集合,任意有限个都服从联合高斯分布。它像一根有弹性的绳子,既能在数据点处老老实实穿过,又能在没数据的地方保持合理的不确定性。

我刚开始接触这玩意儿时,老把均值函数和协方差函数搞混。后来做了几个项目才捋清楚——均值函数决定趋势,协方差函数决定形状。今天就跟大伙儿掰扯掰扯这几个核心部件怎么选。

均值函数——看似简单,实则暗藏玄机

最常见的做法:设均值为零。这不是偷懒,而是因为协方差函数能包住大部分建模能力。你想想,如果数据有明确趋势(比如随时间线性增长),零均值会让预测在远处偏回零,这时候就得显式定义均值函数了。

我个人习惯用这么几种:

均值函数类型表达式适用场景
常数均值m(x)=c数据围绕某个常数值波动
线性均值m(x)=ax+b有明显全局线性趋势
零均值m(x)=0数据已经去中心化,或协方差够灵活

记得有一次做超参数调优,目标函数在迭代初期明显下降。我用零均值加RBF核,结果远处预测全乱了。后来换成线性均值才把趋势抓回来。所以不要无脑设零,先画个散点图看看趋势。

协方差函数(核函数)——高斯过程的灵魂

协方差函数决定了两个点之间的相关性。距离近的函数值像,距离远的几乎独立。核函数就是协方差函数的具体形式。我常用的核函数有以下几个:

  • RBF(平方指数核):最经典,无限可微,生成的函数曲线非常光滑。但缺点是一旦距离稍远,相关性就掉到几乎为零。
  • Matern核:比RBF更“真实”,可以控制平滑度(ν=1/2 对应指数核,ν=3/2 一次可微,ν=5/2 二次可微)。工业界最爱。
  • 周期核:目标函数有明显周期性时用,比如每日流量预测。
  • 线性核:拟合线性趋势,常和别的核组合。
选核本质是在选先验假设——你猜测目标函数有多光滑?有无周期?各向同性?这些假设会死死绑定在预测结果里。

下面这张图展示了高斯过程的核心组件如何协同工作:

高斯过程核心组件与流程 输入点集 X 均值函数 m(x) 协方差函数 k(x,x') 协方差矩阵 K 先验分布 p(f|X) 观测点 (X, y) 后验分布 p(f|X,y) 关键流程 ① 通过核函数构建K ② 结合均值生成先验 ③ 观测数据更新为后验 ④ 后验用于预测与采集

核函数选择——实战避坑指南

选核不是拍脑袋,得跟问题匹配。我给你列几个我踩过的坑:

我曾经用RBF核去拟合带锯齿状跳变的目标函数。结果呢?远处预测平滑得像条直线,完全没捕捉到突变。后来换成Matern ν=1/2(即指数核),才把不连续性给体现出来。

选核的几个原则:

  • 先看数据平滑度——如果函数可能不可微,别用RBF,用Matern ν≤3/2。
  • 看是否有周期——投河数据、服务器请求量,加个周期核能省不少事。
  • 各向同性还是各向异性——如果每个维度尺度不同,用ARD(自动相关性确定)核,让每个维度学自己的长度尺度。
  • 别忘了噪声——观测总有噪声,加一个白噪声核(WhiteKernel)能避免过拟合。

代码示例——用GPy定义核函数

我平时用GPy或scikit-learn。下面用GPy展示怎么搭一个Matern核加线性均值:

import GPy
import numpy as np

# 生成一些模拟数据
X = np.linspace(0, 10, 20).reshape(-1, 1)
y = np.sin(X).flatten() + 0.1 * np.random.randn(20)

# 定义均值函数(线性)
mean_func = GPy.mappings.Linear(input_dim=1, output_dim=1)

# 定义核函数(Matern32 + 白噪声)
kernel = GPy.kern.Matern32(input_dim=1, variance=1., lengthscale=1.) \
         + GPy.kern.White(input_dim=1, variance=0.1)

# 创建高斯过程模型
m = GPy.models.GPRegression(X, y.reshape(-1,1), kernel, mean_function=mean_func)
m.optimize()

# 打印学到的参数
print(m)

你跑完会看到variance和lengthscale被自动优化了。这就是贝叶斯优化的基础——用数据反推超参数。

小经验:优化kernel参数时,多跑几次优化,避免陷入局部最优。我习惯用随机重启3~5次取最优。

总结一下核心要点

组件选型建议个人踩坑记
均值函数有趋势用线性/常数,否则零均值漏设线性均值导致远处预测飘零
核函数光滑用RBF,中低光滑用Matern,周期用周期核Matern ν=1/2 救了锯齿函数的命
噪声项永远加白噪声核不加时模型把噪声当信号学,过拟合
长度尺度多维用ARD让各维自己学固定长度尺度在超参数敏感问题上很吃亏

高斯过程其实没你想的那么玄。抓住均值、协方差、核这三个把手,后面采集函数、优化流程都能顺下来。下节课咱们就进实战——怎么用高斯过程做贝叶斯优化。嗯,先把今天这些消化掉。