贝叶斯统计与贝叶斯优化:严谨而直观的公式导读

📅 2026/8/3 22:03:55 👁️ 阅读次数 📝 编程学习
贝叶斯统计与贝叶斯优化:严谨而直观的公式导读

贝叶斯统计与贝叶斯优化:严谨而直观的公式导读

摘要

Typora 公式说明: 本文行内公式统一使用 $...$,独立公式统一使用 $$...$$。若行内公式未渲染,请在 Typora 的“偏好设置 → Markdown → Markdown 扩展语法”中启用“内联公式”。

贝叶斯统计是一套利用概率分布表达不确定性、并根据观测数据更新认识的统计推断框架。贝叶斯优化则是在贝叶斯统计、统计决策理论、序贯试验设计和黑盒优化的交叉处形成的一类优化方法,特别适合处理“目标函数未知、不可导、带噪声,而且每次评估代价很高”的问题。

二者之间最核心的关系可以概括为:

贝叶斯统计负责建立和更新对未知目标函数的概率认识;贝叶斯优化利用这种认识及其不确定性,决定下一次最值得进行的实验。

贝叶斯统计的主要问题是“根据已有数据,我们对未知量知道了什么”;贝叶斯优化进一步追问“为了尽快找到最优解,下一次应该采集什么数据”。

本文从概率论基础开始,系统介绍贝叶斯统计的先验、似然、后验、预测分布、共轭先验和计算方法;随后介绍贝叶斯优化中的代理模型、采集函数、探索—利用权衡、约束优化、多目标优化和高维问题;最后结合数据库参数调优、异构 CPU 调度以及 CPU–GPU 协同 DVFS 给出具体建模方法。


本文如何让公式更容易理解

本文不把公式只当作需要记忆的符号串。对核心公式,将尽量按照以下顺序解释:

  1. 自然语言:公式在回答什么问题;
  2. 符号表:每个字母代表什么;
  3. 结构拆解:为什么是相加、相乘、积分或取最值;
  4. 数字例子:代入简单数字,观察结果如何变化;
  5. 极端情况:当样本很多、噪声很大或不确定性为零时,公式应表现成什么样;
  6. 系统对应:在数据库、异构 CPU 或 GPU 调频中,每个量对应什么。

四种最常见的符号动作

数学动作 直观含义 在本文中的典型用途
\(\sum\) 把多个离散情况加起来 期望、总损失、多个查询的总代价
\(\int\) 把连续的所有可能情况加权汇总 边际似然、后验预测
\(\arg\min\) / \(\arg\max\) 返回“在哪个输入处”最小或最大 选择最优配置、选择下一实验点
\(\mathbb E[\cdot]\) 按概率加权的长期平均 期望损失、期望改进

特别需要区分:

\[\min_x f(x) \]

返回的是最小函数值;而

\[\arg\min_x f(x) \]

返回的是让函数达到最小值的输入 \(x\)。数据库调优真正需要的通常是后者,即“哪组参数最好”。

统一符号约定

符号 一般含义
\(x\) 可选择的输入或系统配置
\(f(x)\) 配置 \(x\) 下真实但未知的性能函数
\(y\) 带噪声的实际测量值
\(D\) 已有数据集或实验记录
\(\theta\) 模型中未知的参数
\(\mu\) 均值或预测均值
\(\sigma^2\) 方差,表示波动或不确定性大小
\(\sigma\) 标准差,与原变量量纲相同
\(p(\cdot)\) 概率质量、概率密度或条件分布,具体由上下文决定

目录

  1. 贝叶斯思想的核心
  2. 贝叶斯统计的基本结构
  3. 先验、似然与后验
  4. 贝叶斯预测与决策
  5. 贝叶斯统计中的典型模型
  6. 后验分布的计算方法
  7. 贝叶斯统计与频率学派统计的区别
  8. 什么是贝叶斯优化
  9. 贝叶斯优化的整体流程
  10. 代理模型
  11. 高斯过程
  12. 采集函数
  13. 探索与利用
  14. 贝叶斯统计与贝叶斯优化的关系
  15. 贝叶斯优化的扩展
  16. 数据库系统中的应用
  17. 一个完整的数据库调优示例
  18. 贝叶斯优化与其他方法的比较
  19. 常见误解
  20. 学习路线
  21. 读公式时的自检清单
  22. 总结

1. 贝叶斯思想的核心

贝叶斯方法的核心不是某个单独公式,而是一种处理不确定性的方式:

  1. 在获得数据之前,用概率分布表示已有认识;
  2. 观察新数据;
  3. 根据数据更新概率分布;
  4. 基于更新后的分布进行预测或决策。

这一过程可以表示为:

已有知识或假设↓先验分布↓观察新数据↓通过似然更新↓后验分布↓
预测、判断或决策

贝叶斯方法不会只给出一个“最可能的参数值”,而是尽可能给出未知量的完整概率分布。例如,对数据库查询的平均运行时间进行估计时,贝叶斯方法不会只回答“平均运行时间是 10.2 秒”,还会回答:

  • 平均运行时间大概率落在哪个区间;
  • 这个估计有多大不确定性;
  • 新运行一次查询可能得到什么结果;
  • 当前证据是否足以支持某种系统决策。

2. 贝叶斯统计的基本结构

设未知参数为 \(\theta\),观测数据为 \(D\)。贝叶斯统计的基本公式是:

\[p(\theta \mid D) = \frac{p(D\mid \theta)p(\theta)}{p(D)} \]

其中:

  • \(p(\theta)\):先验分布;
  • \(p(D\mid\theta)\):似然函数;
  • \(p(\theta\mid D)\):后验分布;
  • \(p(D)\):边际似然,也称证据。

由于对于给定数据 \(D\),分母 \(p(D)\)\(\theta\) 无关,因此经常写成:

\[p(\theta\mid D) \propto p(D\mid\theta)p(\theta) \]

即:

\[\boxed{ \text{后验} \propto \text{似然} \times \text{先验} } \]

公式拆解:为什么是“似然乘先验”

可以先给每个候选参数一个“原始可信度”,即先验 \(p(\theta)\)。看到数据后,再用似然 \(p(D\mid\theta)\) 衡量这个参数对数据的解释能力。两者相乘,相当于要求一个参数同时满足:

  • 原本并非极不合理;
  • 能较好解释新数据。

假设只有两个候选模型:

模型 先验概率 产生当前数据的概率 未归一化后验权重
\(M_1\) \(0.8\) \(0.1\) \(0.08\)
\(M_2\) \(0.2\) \(0.9\) \(0.18\)

虽然 \(M_1\) 原本更可信,但当前数据对 \(M_2\) 的支持强得多。归一化后:

\[P(M_1\mid D) = \frac{0.08}{0.08+0.18} \approx0.308 \]

\[P(M_2\mid D) = \frac{0.18}{0.08+0.18} \approx0.692 \]

这展示了贝叶斯更新的关键:先验不是不可改变的信念,新证据足够强时可以推翻先验倾向。

为什么需要归一化

$ p(D\mid\theta)p(\theta) $ 只给出相对权重。后验必须满足:

\[\int p(\theta\mid D)\,d\theta=1 \]

因此分母 \(p(D)\) 的作用,是把所有候选参数的权重缩放成合法概率分布。

这个关系表达了贝叶斯统计的本质:

后验认识由原有认识和新数据共同决定。


3. 先验、似然与后验

3.1 先验分布

先验分布 \(p(\theta)\) 表示在观察当前数据之前,对未知参数 \(\theta\) 的认识。

先验可能来自:

  • 历史实验;
  • 领域知识;
  • 物理规律;
  • 过去工作负载;
  • 相似硬件或相似数据库实例;
  • 弱信息假设。

例如,假设某查询的成功率为 \(\theta\),且根据历史经验认为成功率大约在 0.8 附近,可以设置:

\[\theta \sim \operatorname{Beta}(8,2) \]

这表示在当前实验开始前,已经倾向于认为 \(\theta\) 较高。

如何读 \(\operatorname{Beta}(8,2)\)

Beta 分布定义在 \([0,1]\) 上,适合表示概率、成功率或命中率。它的均值为:

\[\mathbb E[\theta] = \frac{\alpha}{\alpha+\beta} \]

所以:

\[\mathbb E[\theta] = \frac{8}{8+2} =0.8 \]

这就是“成功率大约为 \(0.8\)”的来源。参数 \(8\)\(2\) 不只是决定均值,也决定分布有多集中;\(\operatorname{Beta}(80,20)\) 的均值同样是 \(0.8\),但比 \(\operatorname{Beta}(8,2)\) 更集中,代表更强的先验确信。

先验可以分为:

信息先验

包含较强领域知识。例如,已知 CPU 的稳定功率通常在某个区间。

弱信息先验

只排除极不合理的参数范围,但不强烈偏向某个值。

无信息或近似无信息先验

尽量减少先验对后验的影响。不过严格意义上的“完全无信息先验”通常并不存在,参数化方式不同也可能改变所谓无信息性。

层次先验

先验自身还包含未知参数。例如:

\[\theta_i \sim \mathcal N(\mu,\tau^2) \]

\[\mu \sim \mathcal N(0,10^2) \]

\[\tau \sim \operatorname{HalfNormal}(5) \]

这类结构适合多个相关数据库实例、多个查询模板或多个硬件平台之间共享统计信息。


3.2 似然函数

似然函数描述在给定参数 \(\theta\) 时,观察到数据 \(D\) 的可能性:

\[p(D\mid\theta) \]

例如,假设查询运行时间近似服从正态分布:

\[y_i \sim \mathcal N(\mu,\sigma^2) \]

则对 \(n\) 次独立运行结果:

\[D=\{y_1,\dots,y_n\} \]

似然为:

\[p(D\mid\mu,\sigma^2) = \prod_{i=1}^n \mathcal N(y_i\mid\mu,\sigma^2) \]

需要注意:

似然不是“参数的概率”,而是在不同参数取值下,已有数据有多合理。

正态分布只是这里的建模假设,不是贝叶斯统计的要求。若查询时间明显右偏、含长尾或始终为正,可以考虑对 \(\log T\) 建模、使用对数正态分布、Student-\(t\) 分布或显式异常值模型。严谨的贝叶斯分析必须检查似然是否符合数据生成机制。

概率与似然的方向不同

对固定参数 \(\theta\)\(p(D\mid\theta)\) 是数据 \(D\) 的概率模型;但当数据已经观察到、把 \(\theta\) 当作变量比较时,同一个表达式被称为似然函数:

\[L(\theta;D)=p(D\mid\theta) \]

似然值可以用来比较两个参数谁更能解释数据,但连续参数下不能直接把 \(L(\theta;D)\) 当成 \(P(\theta\mid D)\)。只有乘上先验并归一化后,才能得到后验。

为什么常使用对数似然

独立数据的似然是乘积:

\[L(\theta;D) = \prod_{i=1}^{n}p(y_i\mid\theta) \]

取对数后,乘积变为和:

\[\log L(\theta;D) = \sum_{i=1}^{n}\log p(y_i\mid\theta) \]

这样做有两个优点:

  1. 避免许多小概率相乘造成数值下溢;
  2. 求导和优化更容易。

对数函数单调递增,因此最大化似然和最大化对数似然得到同一个参数点。


3.3 后验分布

后验分布为:

\[p(\theta\mid D) \]

它综合了先验和似然。

当数据量较少时,先验可能产生明显影响;随着数据增多,似然通常会逐渐占主导地位。

例如,设硬币正面概率为 \(\theta\),先验为:

\[\theta\sim\operatorname{Beta}(\alpha,\beta) \]

观察到 \(s\) 次正面和 \(f\) 次反面后,后验为:

\[\theta\mid D \sim \operatorname{Beta}(\alpha+s,\beta+f) \]

这说明贝叶斯更新可以被理解为:

例如,先验为:

\[\theta\sim\operatorname{Beta}(2,2) \]

它的均值为 \(0.5\)。现在观察到 \(8\) 次成功、\(2\) 次失败,则:

\[\theta\mid D \sim \operatorname{Beta}(2+8,2+2) = \operatorname{Beta}(10,4) \]

后验均值变为:

\[\mathbb E[\theta\mid D] = \frac{10}{10+4} \approx0.714 \]

注意它没有直接等于样本成功率 \(8/10=0.8\),因为先验中的信息仍然产生了收缩作用。若继续积累大量数据,先验影响会相对减弱。

\[\text{原有证据}+\text{新证据} \]


3.4 边际似然

边际似然为:

\[p(D) = \int p(D\mid\theta)p(\theta)\,d\theta \]

它有两个作用:

  1. 使后验分布归一化;
  2. 用于比较不同模型。

例如,对两个候选模型 \(M_1,M_2\),可以计算贝叶斯因子:

\[BF_{12} = \frac{p(D\mid M_1)}{p(D\mid M_2)} \]

边际似然会自动在模型拟合能力和复杂度之间做一定权衡:模型越灵活,虽然可能拟合得更好,但其先验概率质量也会分散在更大的函数空间中。

积分在这里做了什么

\[p(D) = \int p(D\mid\theta)p(\theta)\,d\theta \]

不是只考察一个“最佳参数”,而是把模型允许的全部参数都考虑进去:

  • 每个参数对数据的解释能力是 \(p(D\mid\theta)\)
  • 每个参数原本的权重是 \(p(\theta)\)
  • 积分把它们全部加权汇总。

如果一个复杂模型只有极小的参数区域能解释数据,而其他大部分区域都很差,它的边际似然未必高。这就是所谓的贝叶斯 Occam 效应。


4. 贝叶斯预测与决策

4.1 后验预测分布

获得后验后,常常不是只关心参数,而是希望预测新数据 \(y_*\)

后验预测分布为:

\[p(y_*\mid D) = \int p(y_*\mid\theta)p(\theta\mid D)\,d\theta \]

这一步把参数不确定性积分掉,因此预测结果会同时考虑:

  • 数据本身的随机噪声;
  • 参数估计的不确定性。

例如,预测下一次查询运行时间时,不能简单地把平均值作为确定结果,而应该给出一个预测分布。

公式中的积分如何理解

\[p(y_*\mid D) = \int p(y_*\mid\theta)p(\theta\mid D)\,d\theta \]

可以把它理解成下面的过程:

  1. 从后验 \(p(\theta\mid D)\) 中考虑一个可能的参数值;
  2. 在该参数下计算未来观测分布 \(p(y_*\mid\theta)\)
  3. 对所有可能参数的预测按后验可信度加权平均。

因此后验预测同时包括两类不确定性:

\[\boxed{ \text{预测不确定性} = \text{运行本身的随机波动} + \text{参数尚未确定造成的不确定性} } \]

即使已经完全知道查询平均运行时间,单次运行仍可能波动;如果平均运行时间本身还没有估准,预测区间会进一步变宽。


4.2 贝叶斯决策理论

贝叶斯统计本身负责建立后验分布,但实际系统还需要做出行动。

设行动为 \(a\),真实状态为 \(\theta\),损失函数为:

\[L(a,\theta) \]

观察数据后,行动 \(a\) 的后验期望损失为:

\[\rho(a\mid D) = \mathbb E_{\theta\mid D}[L(a,\theta)] \]

贝叶斯决策规则选择:

\[a^* = \arg\min_a \mathbb E_{\theta\mid D}[L(a,\theta)] \]

例如:

  • 选择一个数据库执行计划;
  • 选择 P-core/E-core 数量;
  • 选择 CPU/GPU 频率;
  • 决定是否迁移任务;
  • 决定是否继续做实验。

贝叶斯优化正是把这种“根据后验不确定性选择行动”的思想用于黑盒函数优化。

数字例子:为什么不能只选最可能状态下最好的行动

假设查询有两种状态:

  • compute-bound,后验概率为 \(0.6\)
  • memory-bound,后验概率为 \(0.4\)

两个频率策略的损失如下:

行动 compute-bound 损失 memory-bound 损失
高频 \(a_H\) \(5\) \(12\)
低频 \(a_L\) \(14\) \(4\)

后验期望损失:

\[\rho(a_H\mid D) = 0.6\times5+0.4\times12 =7.8 \]

\[\rho(a_L\mid D) = 0.6\times14+0.4\times4 =10 \]

所以选择高频。这里不是因为 compute-bound 是最可能状态就机械地选择高频,而是比较了所有状态下的概率加权损失。


5. 贝叶斯统计中的典型模型

5.1 Beta–Binomial 模型

适合二元结果,例如成功/失败、命中/未命中。

先验:

\[\theta\sim\operatorname{Beta}(\alpha,\beta) \]

数据:

\[s\mid\theta\sim\operatorname{Binomial}(n,\theta) \]

后验:

\[\theta\mid s \sim \operatorname{Beta}(\alpha+s,\beta+n-s) \]

它是典型的共轭模型。


5.2 Gaussian–Gaussian 模型

假设观测噪声方差已知:

\[y_i\sim\mathcal N(\mu,\sigma^2) \]

先验:

\[\mu\sim\mathcal N(\mu_0,\tau_0^2) \]

后验仍然为正态分布:

\[\mu\mid D \sim \mathcal N(\mu_n,\tau_n^2) \]

其中:

\[\frac{1}{\tau_n^2} = \frac{1}{\tau_0^2} + \frac{n}{\sigma^2} \]

\[\mu_n = \tau_n^2 \left( \frac{\mu_0}{\tau_0^2} + \frac{n\bar y}{\sigma^2} \right) \]

后验均值是先验均值和样本均值的精度加权平均。

公式拆解:什么是“精度加权平均”

精度是方差的倒数:

\[\lambda=\frac{1}{\text{方差}} \]

方差越小,精度越大,代表这份信息越可靠。后验精度公式:

\[\frac{1}{\tau_n^2} = \frac{1}{\tau_0^2} + \frac{n}{\sigma^2} \]

可以直接读成:

\[\boxed{ \text{后验信息量} = \text{先验信息量} + \text{样本提供的信息量} } \]

后验均值也可改写成更直观的形式:

\[\mu_n = w_0\mu_0+w_D\bar y \]

其中:

\[w_0 = \frac{1/\tau_0^2}{1/\tau_0^2+n/\sigma^2}, \qquad w_D = \frac{n/\sigma^2}{1/\tau_0^2+n/\sigma^2} \]

并且:

\[w_0+w_D=1 \]

数字例子

先验认为查询均值为 \(10\) 秒,先验标准差为 \(1\) 秒;当前运行 \(4\) 次,样本均值为 \(11\) 秒,单次噪声标准差为 \(2\) 秒。

先验精度:

\[\frac{1}{1^2}=1 \]

数据精度:

\[\frac{4}{2^2}=1 \]

两者精度相同,所以权重各为 \(0.5\)

\[\mu_n =0.5\times10+0.5\times11 =10.5 \]

若样本数增加到 \(100\),数据精度变为 \(100/4=25\),后验会更靠近样本均值。这说明贝叶斯方法不会让一个有限强度的先验永久压制大量数据。


5.3 贝叶斯线性回归

模型为:

\[y=X\beta+\epsilon \]

\[\epsilon\sim\mathcal N(0,\sigma^2I) \]

对回归系数设置先验:

\[\beta\sim\mathcal N(m_0,S_0) \]

则后验仍为正态分布:

\[\beta\mid D \sim \mathcal N(m_n,S_n) \]

贝叶斯线性回归除了预测均值,还能给出预测不确定性。


5.4 层次贝叶斯模型

当数据具有分组结构时,可使用层次模型。

例如,不同查询模板 \(q\) 有各自的运行时间参数:

\[\mu_q\sim\mathcal N(\mu_{\text{global}},\tau^2) \]

\[y_{q,i}\sim\mathcal N(\mu_q,\sigma_q^2) \]

该模型允许不同查询之间共享信息。样本少的查询会更多地向总体均值收缩,样本多的查询则更多地由自身数据决定。

这种“部分池化”特别适合:

“向总体均值收缩”不是人为篡改数据

假设某个查询只测了两次,均值异常低;另一个查询测了几百次。层次模型会认为前者的极端均值更可能包含偶然噪声,因此更明显地向总体均值收缩;后者证据充分,收缩很弱。

这种机制可以降低小样本估计的方差,并在多个相关任务之间共享统计强度。

  • 多查询模板;
  • 多数据集;
  • 多硬件平台;
  • 多数据库实例;
  • 多租户环境。

5.5 贝叶斯非参数模型

贝叶斯非参数并不是没有参数,而是模型复杂度可以随数据增长。

典型方法包括:

  • 高斯过程;
  • 狄利克雷过程;
  • 高斯过程回归;
  • 高斯过程分类。

经典贝叶斯优化通常使用高斯过程对未知目标函数建模,因此与贝叶斯非参数统计关系密切。


6. 后验分布的计算方法

简单共轭模型可以得到解析后验,但复杂模型通常无法直接积分。

6.1 共轭推断

若先验与似然组合后,后验和先验属于同一分布族,则称为共轭。

优点:

  • 计算简单;
  • 更新快速;
  • 适合在线场景。

缺点:

  • 模型表达能力可能受限;
  • 为了共轭性可能做出过强假设。

6.2 最大后验估计

最大后验估计为:

\[\hat\theta_{\text{MAP}} = \arg\max_\theta p(\theta\mid D) \]

等价于:

\[\hat\theta_{\text{MAP}} = \arg\max_\theta \left[ \log p(D\mid\theta) + \log p(\theta) \right] \]

MAP 给出一个点估计,但没有保留完整后验不确定性。


6.3 MCMC

马尔可夫链蒙特卡洛通过构造一个以后验分布为平稳分布的马尔可夫链,从后验中采样。

常见方法包括:

  • Metropolis–Hastings;
  • Gibbs Sampling;
  • Hamiltonian Monte Carlo;
  • NUTS。

优点:

  • 在计算充分时通常较准确;
  • 能处理复杂后验。

缺点:

  • 计算成本较高;
  • 需要诊断收敛和混合情况;
  • 不适合需要极低延迟的在线控制。

6.4 变分推断

变分推断用一个较简单的分布 \(q(\theta)\) 近似真实后验:

\[q^*(\theta) = \arg\min_q D_{\mathrm{KL}} \left( q(\theta)\parallel p(\theta\mid D) \right) \]

通常转化为最大化证据下界:

\[\operatorname{ELBO} = \mathbb E_q[\log p(D,\theta)] - \mathbb E_q[\log q(\theta)] \]

优点:

  • 比 MCMC 快;
  • 适合大规模数据。

缺点:

  • 可能低估不确定性;
  • 结果依赖近似分布族。

6.5 Laplace 近似

在后验众数附近,用二阶泰勒展开将后验近似为高斯分布。

它计算较快,但当后验强烈偏斜、多峰或重尾时效果可能较差。


7. 贝叶斯统计与频率学派统计的区别

二者并不是简单的“谁对谁错”,而是对概率和未知量有不同解释。

方面 贝叶斯统计 频率学派统计
参数 可以用概率分布表达不确定性 通常视为固定但未知
数据 已观察数据固定 被视为重复抽样中的随机结果
推断对象 后验分布 估计量的抽样分布
区间 可信区间 置信区间
先验 显式使用 通常不使用
决策 可基于后验期望损失 常基于检验或风险函数
小样本 可利用先验信息 依赖抽样分布性质

例如,95% 贝叶斯可信区间可以解释为:

在给定模型、先验和数据后,参数落在该区间内的后验概率为 95%。

而传统 95% 置信区间的严格解释是:

如果无限次重复同样的抽样过程并构造区间,其中约 95% 的区间会覆盖真实参数。


8. 什么是贝叶斯优化

8.1 问题定义

考虑优化问题:

\[x^* = \arg\min_{x\in\mathcal X} f(x) \]

如何逐字阅读

  • \(\mathcal X\):所有允许的配置组成的集合;
  • \(x\in\mathcal X\):只在合法配置中搜索;
  • \(f(x)\):配置 \(x\) 的真实代价,例如时间或能耗;
  • \(\min\):关注最小代价;
  • \(\arg\min\):返回产生最小代价的配置,而不是代价值本身;
  • \(x^*\):最优配置的记号,星号不表示乘法。

例如:

\[f(1)=10, \qquad f(2)=7, \qquad f(3)=9 \]

则:

\[\min_x f(x)=7 \]

但:

\[\arg\min_x f(x)=2 \]

贝叶斯优化适合以下情况:

  • \(f(x)\) 没有解析表达式;
  • \(f(x)\) 不可导或梯度难以获取;
  • \(f(x)\) 可能不连续;
  • 每次评估 \(f(x)\) 成本很高;
  • 观测可能包含噪声;
  • 参数维度通常不太高。

例如:

\[f(x) = \text{数据库在配置 }x\text{ 下执行 TPC-H 的总能耗} \]

每评估一次 \(f(x)\),可能需要:

  1. 修改数据库参数;
  2. 重启或清理缓存;
  3. 运行完整工作负载;
  4. 记录运行时间、能耗和尾延迟;
  5. 重复多次以降低噪声。

因此,不可能密集枚举整个参数空间。


8.2 贝叶斯优化的基本思想

贝叶斯优化不会直接优化未知的真实函数,而是维护一个代理模型:

\[p(f\mid D_t) \]

其中:

\[D_t = \{(x_1,y_1),\dots,(x_t,y_t)\} \]

代理模型对每个候选点给出:

  • 预测均值;
  • 预测方差或其他不确定性描述。

然后使用采集函数 \(a_t(x)\) 评价每个候选点的实验价值:

\[x_{t+1} = \arg\max_{x\in\mathcal X} a_t(x) \]

在新点执行真实实验,得到:

\[y_{t+1} = f(x_{t+1})+\epsilon \]

然后更新代理模型,进入下一轮。


9. 贝叶斯优化的整体流程

flowchart TDA[定义参数空间和目标函数] --> B[选择若干初始实验点]B --> C[执行真实实验并收集结果]C --> D[拟合或更新代理模型]D --> E[计算采集函数]E --> F[选择下一实验点]F --> G[执行昂贵目标函数]G --> H[加入新观测]H --> I{预算是否耗尽}I -- 否 --> DI -- 是 --> J[返回最佳观测点或后验推荐点]

伪代码如下:

data = evaluate(initial_points)while budget_remaining:surrogate.fit(data)x_next = optimize_acquisition(surrogate=surrogate,search_space=space,)y_next = expensive_evaluation(x_next)data.append((x_next, y_next))return best_observed_configuration(data)

10. 代理模型

代理模型要近似未知函数,并尽量提供可靠的不确定性。

10.1 高斯过程

经典贝叶斯优化最常用的代理模型。

优点:

  • 小样本下效果较好;
  • 能自然给出预测均值和方差;
  • 数学结构清晰;
  • 适合连续低维空间。

缺点:

  • 标准训练复杂度约为 \(O(n^3)\)
  • 高维空间效果下降;
  • 对核函数和超参数较敏感。

10.2 随机森林

特别适合:

  • 离散参数;
  • 类别参数;
  • 条件参数;
  • 非光滑目标函数。

SMAC 一类方法经常使用随机森林。


10.3 TPE

Tree-structured Parzen Estimator 不直接建模 \(p(y\mid x)\),而是根据目标值把样本分为较好和较差两组,建模:

\[p(x\mid y) \]

它适合:

  • 混合变量;
  • 树状条件空间;
  • 大量超参数。

10.4 贝叶斯神经网络与深度核

适合更高维、更复杂的函数,但训练和不确定性校准更困难。


10.5 多任务与迁移代理模型

当有多个硬件、数据集或工作负载时,可以构建:

\[f(x,c) \]

其中 \(c\) 是上下文,例如:

  • CPU 型号;
  • 查询模板;
  • 数据规模;
  • 并发度;
  • 缓存状态;
  • 输入数据分布。

这类模型可以把过去平台上的实验知识迁移到新平台。


11. 高斯过程

11.1 从随机变量到随机函数

高斯过程可以看作对函数的概率分布:

\[f(x)\sim GP(m(x),k(x,x')) \]

不要把它误读为“一个数服从高斯分布”

这里随机的对象是一整条函数。可以想象在观测数据前,模型允许很多条可能的性能曲线;看到实验点后,与数据不相容的曲线后验权重降低,剩余曲线在观测附近聚拢。

  • \(m(x)\) 给出这些可能曲线在位置 \(x\) 的平均高度;
  • \(k(x,x')\) 决定两个位置的函数值应当有多相关;
  • 观测点附近曲线通常更集中;
  • 远离观测点的区域仍然分散,因此不确定性更大。

高斯过程中的“高斯”严格表示:任取有限个输入点,其函数值向量联合服从多元高斯分布,而不是要求真实函数曲线必须呈钟形。

其中:

  • \(m(x)\):均值函数;
  • \(k(x,x')\):核函数或协方差函数。

任取有限个输入:

\[x_1,\dots,x_n \]

其函数值联合服从多元高斯分布:

\[\begin{bmatrix} f(x_1)\\ \vdots\\ f(x_n) \end{bmatrix} \sim \mathcal N(\mathbf m,K) \]

其中:

\[\mathbf m_i=m(x_i), \qquad K_{ij}=k(x_i,x_j) \]


11.2 核函数

核函数决定函数的平滑性和相关结构。

RBF 核

\[k(x,x') = \sigma_f^2 \exp \left( -\frac{\|x-x'\|^2}{2\ell^2} \right) \]

其中 \(\ell\) 是长度尺度。

较大的 \(\ell\) 表示函数变化较平缓;较小的 \(\ell\) 表示函数可以快速变化。

数字例子:长度尺度如何改变相似度

为了简化,令 \(\sigma_f^2=1\),两个点距离为 \(|x-x'|=1\)

\(\ell=2\)

\[k(x,x') = \exp\left(-\frac{1}{8}\right) \approx0.882 \]

\(\ell=0.5\)

\[k(x,x') = \exp\left(-\frac{1}{0.5}\right) = \exp(-2) \approx0.135 \]

同样相距 \(1\) 个单位,在大长度尺度下被视为非常相似,在小长度尺度下则被视为相关性很弱。

在混合单位的参数空间中,应先做尺度处理。例如,线程数范围为 \(1\)\(32\),频率范围为 \(1.0\)\(5.0\) GHz,若直接使用欧氏距离,数值范围较大的维度可能不合理地主导距离。

Matérn 核

Matérn 核比 RBF 核允许更粗糙的函数,在系统性能建模中往往更合理,因为数据库性能面不一定非常光滑。

常用的是 Matérn-\(5/2\) 核:

\[k(r) = \sigma_f^2 \left( 1+\frac{\sqrt5r}{\ell} +\frac{5r^2}{3\ell^2} \right) \exp \left( -\frac{\sqrt5r}{\ell} \right) \]

ARD

自动相关确定为每个维度设置独立长度尺度:

\[k(x,x') = \sigma_f^2 \exp \left( -\frac12 \sum_{j=1}^{d} \frac{(x_j-x_j')^2}{\ell_j^2} \right) \]

若某个维度的 \(\ell_j\) 很大,说明函数对该维度不敏感。


11.3 带噪声观测

真实观测通常为:

\[y=f(x)+\epsilon \]

\[\epsilon\sim\mathcal N(0,\sigma_n^2) \]

数据库实验中的噪声可能来自:

  • 操作系统调度;
  • 缓存冷热;
  • 后台进程;
  • NUMA 页放置;
  • 温度和功耗限制;
  • CPU/GPU 动态频率;
  • 并发查询干扰;
  • 存储设备抖动。

因此,不能把所有观测波动都解释为目标函数自身变化。


11.4 高斯过程预测

设训练输入为 \(X=(x_1,\dots,x_n)\),观测向量为 \(\mathbf y\),测试点为 \(x_*\)。令:

\[\mathbf m_X = [m(x_1),\dots,m(x_n)]^\top \]

\[k_* = [k(x_1,x_*),\dots,k(x_n,x_*)]^\top \]

一般形式的预测均值为:

\[\mu(x_*) = m(x_*) + k_*^\top (K+\sigma_n^2I)^{-1} (\mathbf y-\mathbf m_X) \]

预测方差为:

\[\sigma^2(x_*) = k(x_*,x_*) - k_*^\top (K+\sigma_n^2I)^{-1}k_* \]

若使用零均值先验 \(m(x)=0\),或事先对观测进行了中心化,预测均值才简化为:

\[\mu(x_*) = k_*^\top(K+\sigma_n^2I)^{-1}\mathbf y \]

在已观测点附近,预测方差通常较小;远离已观测区域时,预测方差通常较大。

预测均值公式如何理解

下面先使用零均值或已中心化的简化形式:

\[\mu(x_*) = k_*^\top(K+\sigma_n^2I)^{-1}y \]

可粗略理解为“已有观测值的相关性加权组合”:

  • \(k_*\) 表示新点 \(x_*\) 与每个已观测点有多相似;
  • \(K\) 描述已观测点彼此之间的相似性;
  • \((K+\sigma_n^2I)^{-1}\) 修正重复信息和测量噪声;
  • 最后与 \(y\) 相乘,得到预测均值。

它不是普通距离加权平均,因为两个彼此很相似的观测点包含重复信息,矩阵逆会避免重复计算同一份证据。

预测方差公式如何理解

\[\sigma^2(x_*) = k(x_*,x_*) - k_*^\top(K+\sigma_n^2I)^{-1}k_* \]

可以读成:

\[\boxed{ \text{后验不确定性} = \text{观测前不确定性} - \text{已有数据消除的不确定性} } \]

  • 第一项 \(k(x_*,x_*)\) 是先验方差;
  • 第二项是根据已有观测能够消除的方差;
  • 新点越接近已有数据,第二项通常越大;
  • 新点离所有数据越远,第二项越小。

需要区分潜在函数方差与未来带噪观测方差。若要预测下一次实际测量值 \(y_*\),通常还要加回观测噪声:

\[\operatorname{Var}(y_*\mid D) = \operatorname{Var}(f(x_*)\mid D)+\sigma_n^2 \]


12. 采集函数

代理模型用于认识目标函数,采集函数用于决定下一次行动。

严谨性说明: 下面的 PI、EI 和 LCB 先介绍单点、高斯后验下的经典形式。存在观测噪声时,直接把最小观测值当作真实 \(f_{\min}\) 可能产生“偶然低值”偏差,实际实现可使用潜在函数后验、noisy EI、重复测量或对 incumbent 进行后验定义。

12.1 Probability of Improvement

对最小化问题,当前最佳观测值为 \(f_{\min}\)。改进概率为:

\[PI(x) = P(f(x)<f_{\min}-\xi) \]

在高斯预测下:

\[PI(x) = \Phi \left( \frac{f_{\min}-\xi-\mu(x)}{\sigma(x)} \right) \]

其中 \(\xi\) 控制探索程度。

缺点是它只看“改进概率”,不关心改进幅度。

数字例子

当前最好值为 \(f_{\min}=100\),候选配置预测为:

\[\mu(x)=95, \qquad \sigma(x)=5, \qquad \xi=0 \]

标准化后:

\[Z = \frac{100-95}{5} =1 \]

所以:

\[PI(x)=\Phi(1)\approx0.8413 \]

即模型认为该配置有约 \(84.13\%\) 的概率优于当前最佳值。

\(\sigma(x)=0\),该点已经没有模型不确定性,此时 PI 退化为确定判断:预测均值优于阈值则概率为 \(1\),否则为 \(0\)。实际实现中需要单独处理除零问题。


12.2 Expected Improvement

定义改进量:

\[I(x) = \max(f_{\min}-f(x)-\xi,0) \]

期望改进为:

\[EI(x) = \mathbb E[I(x)] \]

若预测为高斯分布,可写成:

\[EI(x) = (f_{\min}-\mu(x)-\xi)\Phi(Z) + \sigma(x)\phi(Z) \]

其中:

\[Z = \frac{f_{\min}-\mu(x)-\xi}{\sigma(x)} \]

EI 同时考虑:

  • 成为更优点的概率;
  • 可能获得的改进幅度。

EI 公式的两部分

\[EI(x) = \underbrace{(f_{\min}-\mu(x)-\xi)\Phi(Z)}_{\text{预测均值带来的改进}} + \underbrace{\sigma(x)\phi(Z)}_{\text{不确定性带来的探索价值}} \]

第一项偏向利用:预测均值越好,贡献通常越大。第二项偏向探索:预测标准差越大,候选点可能隐藏的额外收益越大。

数字例子

继续使用:

\[f_{\min}=100, \qquad \mu(x)=95, \qquad \sigma(x)=5, \qquad Z=1 \]

查标准正态函数:

\[\Phi(1)\approx0.8413, \qquad \phi(1)\approx0.2420 \]

所以:

\[EI(x) = 5\times0.8413+5\times0.2420 \approx5.4165 \]

含义不是“该点一定改进 \(5.4165\)”,而是:在当前后验分布下,对截断为非负的改进量取期望,得到约 \(5.42\) 个目标单位。

为什么使用 \(\max(\cdot,0)\)

若新配置比当前最佳值更差,改进量不应为负收益,而应记为零:

\[I(x)=\max(f_{\min}-f(x)-\xi,0) \]

因此 EI 同时包含“完全没有改进”的概率质量和“产生正改进”的各种可能幅度。


12.3 Lower Confidence Bound

对最小化问题:

\[LCB(x) = \mu(x)-\kappa\sigma(x) \]

选择:

\[x_{t+1} = \arg\min_x LCB(x) \]

其中:

  • \(\mu(x)\) 小,鼓励利用;
  • \(\sigma(x)\) 大,鼓励探索;
  • \(\kappa\) 控制探索强度。

数字例子

候选 A:

\[\mu_A=100, \qquad \sigma_A=1 \]

候选 B:

\[\mu_B=105, \qquad \sigma_B=10 \]

\(\kappa=2\)

\[LCB_A=100-2\times1=98 \]

\[LCB_B=105-2\times10=85 \]

虽然 B 的预测均值更差,但它的下置信界更低,因此会被优先探索。

\(\kappa=0\) 时:

\[LCB(x)=\mu(x) \]

算法只进行利用;\(\kappa\) 越大,越愿意测试高不确定性区域。


12.4 Thompson Sampling

从后验中采样一个函数:

\[\tilde f\sim p(f\mid D) \]

然后选择该采样函数的最优点:

\[x_{t+1} = \arg\min_x\tilde f(x) \]

Thompson Sampling 的特点是把后验不确定性直接转化为随机化决策。


12.5 Knowledge Gradient

Knowledge Gradient 关注一次实验对未来最优决策价值的提升。它计算更复杂,但适合有限预算和决策价值明确的问题。


13. 探索与利用

探索—利用权衡是贝叶斯优化的核心。

13.1 利用

选择当前预测最优的区域:

\[x_{\text{exploit}} = \arg\min_x\mu(x) \]

优点是可能快速改善当前结果,缺点是容易陷入局部区域。

13.2 探索

选择当前模型最不确定的区域:

\[x_{\text{explore}} = \arg\max_x\sigma(x) \]

优点是改善全局认知,缺点是可能浪费实验预算在明显较差区域。

13.3 为什么只做预测不够

假设两个配置的预测如下:

配置 预测能耗 标准差
A 100 J 1 J
B 105 J 15 J

只看均值会选 A。但 B 虽然均值较差,却有较大概率达到远低于 100 J 的能耗,因此可能更值得测试。

贝叶斯优化的优势不只是“预测性能”,而是:

通过不确定性判断一项新实验可能带来多少优化价值或信息价值。


14. 贝叶斯统计与贝叶斯优化的关系

14.1 理论关系

贝叶斯优化可以写成:

\[\boxed{ \text{贝叶斯统计} + \text{统计决策理论} + \text{序贯试验设计} + \text{黑盒优化} } \]

其中:

  • 贝叶斯统计提供概率模型和后验更新;
  • 决策理论提供根据后验选择行动的方法;
  • 序贯试验设计提供边实验边更新的过程;
  • 黑盒优化提供最终寻找最优输入的目标。

14.2 推断目标不同

贝叶斯统计通常希望获得:

\[p(\theta\mid D) \]

或者:

\[p(y_*\mid D) \]

贝叶斯优化希望获得:

\[x^* = \arg\min_x f(x) \]

因此,贝叶斯优化并不一定需要准确恢复整个函数。只要能快速识别最优区域,就可能成功。


14.3 数据采集方式不同

普通贝叶斯统计常常假设数据已经给定:

\[D=\{y_1,\dots,y_n\} \]

贝叶斯优化主动选择下一次数据的输入位置:

\[x_{t+1} = \arg\max_x a_t(x) \]

所以贝叶斯优化是一种主动学习和序贯决策过程。


14.4 输出不同

方法 主要输出
贝叶斯参数估计 参数后验分布
贝叶斯回归 预测分布
贝叶斯模型比较 模型后验概率或贝叶斯因子
贝叶斯决策 最小后验风险行动
贝叶斯优化 最优配置及搜索过程

14.5 二者的循环关系

flowchart LRA[已有实验数据] --> B[贝叶斯统计推断]B --> C[目标函数后验分布]C --> D[采集函数或决策规则]D --> E[选择下一实验点]E --> F[真实系统实验]F --> A

这个循环体现了:

贝叶斯统计产生认知,贝叶斯优化利用认知控制数据采集;新的数据又反过来改进贝叶斯统计模型。


15. 贝叶斯优化的扩展

15.1 约束贝叶斯优化

实际问题往往有约束:

\[\min_x f(x) \]

满足:

\[c_j(x)\le 0,\quad j=1,\dots,m \]

例如:

\[\min_x E(x) \]

满足:

\[T(x)\le T_{\mathrm{SLO}} \]

可以分别对目标函数和约束函数建模,并使用可行概率:

\[P(c_j(x)\le 0) \]

一种简单采集函数为:

\[a_{\text{constrained}}(x) = EI(x) \prod_j P(c_j(x)\le 0) \]

这样,预测虽然很好但违反 SLO 的配置不会被优先测试。

数字例子

假设两个候选点的能耗期望改进和可行概率分别为:

配置 \(EI(x)\) 满足延迟约束的概率 约束采集值
A \(10\) \(0.2\) \(2\)
B \(6\) \(0.9\) \(5.4\)

虽然 A 的潜在能耗改进更大,但大概率违反 SLO;乘上可行概率后,B 更值得实验。

这种乘积形式隐含了目标模型与约束模型的处理假设。若二者显著相关,例如高能耗与低延迟由同一频率机制共同产生,应考虑联合建模或能够表达相关性的多输出模型。


15.2 多目标贝叶斯优化

同时优化多个目标:

\[\min_x \left( T(x),E(x),C(x) \right) \]

例如:

  • 运行时间;
  • 能耗;
  • 峰值功率;
  • 尾延迟;
  • 资源成本。

多目标优化通常不返回单一最优点,而返回 Pareto 前沿。

若配置 \(x_1\) 在所有目标上都不差于 \(x_2\),且至少一个目标更好,则称 \(x_1\) 支配 \(x_2\)

常见采集函数包括期望超体积改进。


15.3 批量贝叶斯优化

当可并行执行多个实验时,需要一次选择一批点:

\[x_{t+1}^{(1)},\dots,x_{t+1}^{(q)} \]

常见方法:

  • q-EI;
  • q-UCB;
  • 局部惩罚;
  • Thompson Sampling 批采样。

批量选择必须避免多个实验点过于相似,否则会浪费并行预算。


15.4 多保真贝叶斯优化

不同实验可以有不同成本和精度,例如:

  • 小数据集快速测试;
  • 降低查询重复次数;
  • 缩短测量窗口;
  • 使用模拟器;
  • 使用低精度功耗模型;
  • 只执行部分查询。

将保真度记为 \(z\)

\[f(x,z) \]

高保真实验更准确但昂贵,低保真实验便宜但有偏差。多保真 BO 的目标是合理分配不同级别实验预算。


15.5 上下文贝叶斯优化

目标函数受上下文 \(c\) 影响:

\[f(x;c) \]

例如上下文包括:

  • 当前查询特征;
  • 数据规模;
  • 并发度;
  • CPU 温度;
  • 缓存命中率;
  • 内存带宽压力。

系统不能选择上下文,只能在给定上下文下选择配置 \(x\)


15.6 安全贝叶斯优化

要求所有探索点尽量满足安全约束,例如:

  • 尾延迟不能超过上限;
  • 温度不能超过阈值;
  • 吞吐量不能低于服务要求;
  • 不允许引发 OOM;
  • 不允许超过功率限制。

安全 BO 不仅寻找最优点,还控制探索风险。


15.7 高维贝叶斯优化

经典 GP-BO 在高维空间中面临困难:

  • 样本稀疏;
  • 核函数距离失去区分能力;
  • 采集函数优化困难;
  • 不相关维度增加噪声。

常见方法包括:

  • 随机嵌入;
  • 稀疏轴对齐子空间;
  • trust region;
  • 加性结构;
  • 变量筛选;
  • 分层和条件搜索空间;
  • 利用领域知识缩小参数范围。

16. 数据库系统中的应用

16.1 数据库参数调优

配置向量可以包括:

\[x= ( \texttt{shared\_buffers}, \texttt{work\_mem}, \texttt{effective\_cache\_size}, \texttt{random\_page\_cost}, \texttt{max\_parallel\_workers} ) \]

目标可以是:

\[f(x) = \sum_{q\in Q} w_q\log T(q,x) \]

使用对数可以降低极端慢查询对总体目标的支配程度。

也可以定义:

\[f(x) = \alpha\cdot \operatorname{MeanLatency}(x) + (1-\alpha)\cdot P_{95}(x) \]


16.2 查询优化器 cost 参数校准

PostgreSQL 等数据库依赖成本参数比较不同执行计划。

可优化:

\[x= ( \texttt{seq\_page\_cost}, \texttt{random\_page\_cost}, \texttt{cpu\_tuple\_cost}, \texttt{cpu\_operator\_cost} ) \]

目标不是让估计成本数值本身最准确,而是让最终选出的执行计划在真实运行中表现更好。

这会导致一个重要特点:

参数到真实运行时间的映射可能不连续,因为参数轻微变化可能触发执行计划切换。

因此,基于梯度的方法不一定适合,而树模型 BO 或带非平稳核的 BO 可能更合适。


16.3 异构 CPU 调度

配置可以表示为:

\[x= (n_P,n_E,f_P,f_E,\text{affinity}) \]

其中:

  • \(n_P\):P-core 数量;
  • \(n_E\):E-core 数量;
  • \(f_P\):P-core 频率;
  • \(f_E\):E-core 频率;
  • affinity:线程亲和性策略。

目标可以是能量延迟积:

\[EDP(x)=E(x)T(x) \]

或者:

\[ED^2P(x)=E(x)T^2(x) \]

还可以设置约束:

\[T(x)\le 1.05T_{\text{fastest}} \]

然后最小化能耗:

\[\min_x E(x) \]


16.4 CPU–GPU 协同调频

配置:

\[x= (f_{\text{CPU}},f_{\text{GPU}},f_{\text{MEM}}) \]

目标:

\[\min_x E(x) \]

约束:

\[T(x)\le T_{\mathrm{SLO}} \]

贝叶斯优化可能发现:

  • CPU-bound 阶段需要较高 CPU 频率;
  • GPU kernel-bound 阶段需要较高 GPU 频率;
  • memory-bound 阶段提高计算频率收益有限;
  • CPU 和 GPU 同时升频可能触发共享功率或散热限制;
  • 不同查询算子阶段具有不同最优频率组合。

如果最优配置随执行阶段变化,则静态 BO 不够,需要上下文 BO、分阶段优化或在线控制。


16.5 压缩方式和执行位置选择

配置可以包含:

\[x= ( \text{codec}, \text{compression level}, \text{P/E-core mapping}, \text{CPU/GPU placement} ) \]

目标可能是:

\[f(x) = \alpha T(x) + \beta E(x) + \gamma S(x) \]

其中 \(S(x)\) 是存储空间。

这属于混合离散—连续搜索空间,随机森林、TPE 或混合核 GP 往往比纯连续 GP 更适合。


17. 一个完整的数据库调优示例

17.1 问题定义

在 Intel 异构 CPU 上为 OLAP 查询选择:

\[x=(n_P,n_E,f_P,f_E) \]

参数范围:

\[n_P\in\{1,\dots,8\} \]

\[n_E\in\{0,\dots,16\} \]

\[f_P\in[1.2,5.0]\text{ GHz} \]

\[f_E\in[1.0,4.0]\text{ GHz} \]

目标是最小化能耗,同时满足性能约束:

\[\min_x E(x) \]

满足:

\[T(x)\le 1.1T_{\mathrm{baseline}} \]


17.2 观测模型

运行时间观测:

\[y_T(x) = T(x)+\epsilon_T \]

能耗观测:

\[y_E(x) = E(x)+\epsilon_E \]

对两个函数分别建立代理模型:

\[T(x)\sim GP(m_T,k_T) \]

\[E(x)\sim GP(m_E,k_E) \]


17.3 初始设计

初始点不应全部随机聚集,可以使用:

  • Latin Hypercube Sampling;
  • Sobol 序列;
  • 正交设计;
  • 基于领域知识的边界点。

初始点应覆盖:

  • 仅 P-core;
  • 仅 E-core;
  • P/E 混合;
  • 低频;
  • 高频;
  • 不同总线程数。

17.4 采集函数

定义可行概率:

\[P_{\mathrm{feasible}}(x) = P(T(x)\le 1.1T_{\mathrm{baseline}}) \]

定义能耗期望改进:

\[EI_E(x) \]

约束采集函数:

\[a(x) = EI_E(x) P_{\mathrm{feasible}}(x) \]

这条公式可以直接翻译为:

\[\boxed{ \text{一个配置值得测试的程度} = \text{它可能节省多少能耗} \times \text{它满足性能约束的概率} } \]

如果 \(EI_E(x)\) 很大但可行概率接近零,采集值仍然很小;如果可行概率很高但几乎不可能改善能耗,采集值也不会高。

下一点:

\[x_{t+1} = \arg\max_x a(x) \]


17.5 实验控制

为减少噪声,应尽量控制:

  • CPU governor;
  • 频率上限;
  • NUMA 绑定;
  • 查询缓存状态;
  • 数据库缓冲区状态;
  • 后台任务;
  • 温度;
  • 查询执行顺序;
  • 数据集版本;
  • 内核版本;
  • BIOS 功耗策略。

可以每个配置重复执行 \(r\) 次,并记录:

  • 中位运行时间;
  • 均值;
  • 标准差;
  • P95;
  • 总能耗;
  • 平均功率;
  • 峰值功率;
  • 硬件性能计数器。

17.6 异方差噪声

不同配置的测量噪声可能不同。例如,频率接近热限制时波动更大。

可以建模:

\[\epsilon(x) \sim \mathcal N(0,\sigma^2(x)) \]

这称为异方差模型。

若忽略异方差,优化器可能错误地把高波动区域视为高潜力区域。


17.7 停止条件

可以使用:

  • 达到实验次数上限;
  • 总实验时间耗尽;
  • 连续若干轮没有显著改进;
  • 采集函数最大值低于阈值;
  • 后验最优点稳定;
  • 达到预设性能或能耗目标。

17.8 泛化验证

训练工作负载上的最优配置不一定能泛化。

应划分:

  • 调优查询集;
  • 验证查询集;
  • 测试查询集。

还应测试:

  • 不同数据规模;
  • 不同并发度;
  • 不同缓存状态;
  • 不同参数漂移;
  • 不同温度状态;
  • 不同数据库版本。

18. 贝叶斯优化与其他方法的比较

方法 是否利用历史实验 是否需要梯度 样本效率 高维适应性 适合昂贵实验
网格搜索 很差
随机搜索 中低 一般
梯度下降 通常需要 取决于梯度成本
进化算法 中低 中高 一般
强化学习 通常较低 通常不适合极小预算
贝叶斯优化 中低 很适合

18.1 与随机搜索比较

随机搜索不会根据过去结果改变后续采样策略。

贝叶斯优化则不断利用历史实验构建模型,因此在每次实验昂贵时通常更有优势。

18.2 与梯度优化比较

梯度优化适合:

  • 目标函数可导;
  • 梯度容易获得;
  • 单次函数评估便宜;
  • 变量维度较高。

贝叶斯优化适合:

  • 黑盒;
  • 不可导;
  • 非光滑;
  • 评估昂贵;
  • 维度相对较低。

18.3 与强化学习比较

强化学习主要解决序列决策:

\[s_t\rightarrow a_t\rightarrow r_t\rightarrow s_{t+1} \]

而经典贝叶斯优化通常解决静态配置选择:

\[x\rightarrow f(x) \]

若数据库状态持续变化、动作影响未来状态,强化学习可能更合适;若每次完整实验昂贵、状态转移不是研究重点,贝叶斯优化通常更节省样本。


19. 常见误解

19.1 贝叶斯优化不是直接使用贝叶斯公式求最优值

贝叶斯公式用于更新概率认识。最优点通常通过优化采集函数得到,而不是直接由贝叶斯公式给出。

19.2 贝叶斯优化不一定必须使用高斯过程

高斯过程是经典选择,但也可以使用:

  • 随机森林;
  • TPE;
  • 贝叶斯神经网络;
  • 神经过程;
  • 深度集成;
  • 其他不确定性模型。

19.3 贝叶斯优化不保证很快找到全局最优解

其效果依赖:

  • 代理模型是否合适;
  • 采集函数是否合理;
  • 参数空间是否定义正确;
  • 噪声是否建模;
  • 实验预算是否足够;
  • 目标是否稳定。

19.4 不确定性不等于真实误差

模型给出的后验方差只在模型假设成立时有意义。模型错设时,方差可能严重失真。

19.5 观测到的最优点不一定是真实最优点

若噪声较大,某个点可能因偶然波动看起来最好。

可以使用:

  • 重复实验;
  • 后验均值最优;
  • 噪声校正 EI;
  • 最优点再验证;
  • 排序与置信区间。

19.6 参数越多不代表优化越好

无关参数会增加搜索难度。应尽量利用领域知识筛选真正影响目标的参数。


20. 学习路线

阶段一:概率论基础

需要掌握:

  • 条件概率;
  • 全概率公式;
  • 贝叶斯公式;
  • 随机变量;
  • 常见概率分布;
  • 期望、方差、协方差;
  • 多元高斯分布。

阶段二:统计推断

需要掌握:

  • 似然函数;
  • 最大似然估计;
  • 点估计与区间估计;
  • 假设检验;
  • 回归;
  • 偏差—方差关系。

阶段三:贝叶斯统计

重点学习:

  • 先验、似然和后验;
  • 共轭先验;
  • 后验预测;
  • 层次模型;
  • 贝叶斯决策理论;
  • MCMC;
  • 变分推断。

阶段四:高斯过程

重点学习:

  • 随机过程;
  • 核函数;
  • 高斯过程回归;
  • 超参数学习;
  • 预测均值和方差;
  • 稀疏高斯过程;
  • 异方差建模。

阶段五:贝叶斯优化

重点学习:

  • 黑盒优化;
  • 序贯试验设计;
  • PI、EI、UCB/LCB;
  • Thompson Sampling;
  • 约束 BO;
  • 多目标 BO;
  • 批量 BO;
  • 多保真 BO;
  • 高维 BO。

阶段六:系统实验方法

数据库和系统研究还需要掌握:

  • benchmark 设计;
  • 重复实验;
  • 缓存和热状态控制;
  • 性能计数器;
  • 能耗测量;
  • 方差分析;
  • 消融实验;
  • 泛化验证;
  • 可复现性。

21. 读公式时的自检清单

遇到一个看起来晦涩的公式时,可以依次问:

  1. 输出是什么? 是概率、预测值、方差、损失,还是最优输入?
  2. 哪些量已知,哪些量未知? 数据 \(D\) 已经固定,还是仍在积分或优化?
  3. 为什么使用求和或积分? 是否在汇总所有可能情况?
  4. 为什么使用乘法? 是否在组合独立证据或联合条件?
  5. 为什么有方差或标准差? 它表示数据噪声还是模型不确定性?
  6. 极端情况下合理吗? 样本趋于无穷时先验是否减弱?不确定性为零时采集函数是否退化为确定判断?
  7. 量纲是否一致? 时间不能直接与能耗相加,除非经过权重或归一化;方差的单位是原变量单位的平方。
  8. 这是数学定义还是建模假设? 例如贝叶斯公式是概率恒等式,而“查询时间服从正态分布”是可能被数据推翻的建模假设。

22. 总结

贝叶斯统计是一套以概率分布表达不确定性、并使用新数据更新认识的统计框架。它的核心是:

\[p(\theta\mid D) \propto p(D\mid\theta)p(\theta) \]

贝叶斯优化则面向昂贵黑盒函数,通过代理模型表示目标函数的不确定性,并使用采集函数选择下一次实验位置:

\[x_{t+1} = \arg\max_x a_t(x) \]

二者的关系可以总结为:

\[\boxed{ \text{贝叶斯统计提供后验认识和不确定性; 贝叶斯优化将其转化为寻找最优解的实验行动。} } \]

更完整地说:

\[\boxed{ \text{贝叶斯优化} = \text{贝叶斯统计} + \text{统计决策理论} + \text{序贯试验设计} + \text{黑盒优化} } \]

在数据库系统、异构 CPU、CPU–GPU 调频和能耗优化中,贝叶斯优化特别适合以下场景:

  • 参数数量有限;
  • 每次真实运行成本高;
  • 目标函数不可导;
  • 参数变化可能引发执行计划切换;
  • 测量存在噪声;
  • 需要在少量实验预算下找到高质量配置。

但它并非万能方法。在高维、快速变化、长时序控制和强非平稳环境中,可能需要结合上下文建模、迁移学习、多保真方法、强化学习或系统领域知识。

最终应把贝叶斯优化理解为一种“会学习的试验设计方法”:

它不是盲目枚举配置,而是在每轮实验后更新认识,并把有限的下一次实验机会放在最有希望或最有信息价值的位置。


附录:三个最重要的“公式翻译”

贝叶斯更新

\[p(\theta\mid D) \propto p(D\mid\theta)p(\theta) \]

翻译:既考虑参数原来是否合理,也考虑它能否解释新数据。

高斯过程后验方差

\[\sigma^2(x_*) = k(x_*,x_*) - k_*^\top(K+\sigma_n^2I)^{-1}k_* \]

翻译:当前剩余的不确定性,等于原本的不确定性减去已有实验消除的部分。

贝叶斯优化下一点

\[x_{t+1} = \arg\max_x a_t(x) \]

翻译:不是直接相信预测最好的点,而是选择当前最有实验价值的点。