贝叶斯优化:从理论到实践
立即解锁
发布时间: 2025-08-31 01:43:56 阅读量: 11 订阅数: 23 AIGC 

### 贝叶斯优化:从理论到实践
#### 1. 贝叶斯优化概述
在优化问题中,一个好的预测模型和决策策略至关重要。没有像高斯过程(GP)这样的好的预测模型,我们就无法做出带有校准不确定性的良好预测;而没有策略,即使能做出好的预测,也无法做出好的决策。
以天气预报为例,我们使用手机上的天气预报应用来决定是否带伞。应用的预测必须准确可靠,我们才能据此做出决策。同时,我们需要一个合理的决策方式,既不能不管下雨概率如何都不带伞,也不能即使有 100% 的晴天概率还带伞,而是要根据天气预报自适应地做决定。贝叶斯优化(BayesOpt)的核心就是自适应地做决策,为此我们需要一个好的预测模型和一个好的决策策略。
#### 2. 贝叶斯优化实战
为了验证贝叶斯优化的效果,我们来看一个简单函数的优化示例。假设我们要优化的一维黑盒目标函数定义在 -5 到 5 的区间内,目标是找到其最大值。在黑盒优化中,我们实际上并不知道目标函数的具体形状。该函数在 -5 附近有几个局部最大值(大约在 -2.4 和 1.5 处),而全局最大值在右侧约 4.3 处。我们最多可以对目标函数进行 10 次评估。
在使用贝叶斯优化解决这个问题之前,我们先看看两种基线策略:
- **随机搜索**:在 -5 到 5 的区间内均匀随机采样点,然后在这些点上评估目标函数。随机搜索找到的最大值点大约在 x = 4 处,函数值 f(x) = 3.38。不过,随机采样的点很多都集中在 0 附近,这可能会浪费宝贵的资源去检查函数的一个小区域。直观上,更有益的做法是分散评估点,以便更多地了解目标函数。
- **网格搜索**:将搜索空间划分为均匀间隔的段,并在这些段的端点处进行评估。网格搜索找到的最佳点是最右侧的点 5,评估值约为 4.86。这比随机搜索要好,但仍然没有找到实际的全局最优值。
接下来看看贝叶斯优化的表现:
- 贝叶斯优化和随机搜索一样,从一个随机采样点开始。此时,高斯过程(GP)基于这个评估点进行训练,预期改进策略计算每个位置的得分,得分告诉我们在搜索空间中每个位置的价值,我们应该选择得分最高的点进行下一次评估。由于只看到了一个数据点,我们对目标函数的其他区域还不了解,所以策略告诉我们应该更多地探索。
- 从第一次查询到第四次查询,有三次查询集中在 1 附近,这里有一个局部最优值,策略还建议我们在这个区域再查询一个点。不过,贝叶斯优化不会一直被困在局部最优区域。在对这个局部最优区域进行了五次查询后,策略决定探索其他更有前景的区域,即左侧约 -2 处和右侧约 4 处。
- 进行八次查询后,我们在右侧又观察到两个点,这更新了我们的 GP 模型和策略。此时,均值函数(代表最可能的预测)在 4 到 5 的区间内几乎与真实目标函数匹配,策略也指向了非常接近全局最优值的地方。
- 经过 10 次查询,我们几乎可以确定已经找到了约 4.3 处的全局最优值。
这个例子清楚地表明,贝叶斯优化比随机搜索和网格搜索效果好得多。许多机器学习从业者在进行超参数调优时常用随机搜索和网格搜索,而贝叶斯优化在这方面有很大的提升空间。以下是一些贝叶斯优化在实际应用中取得成功的例子:
- 2020 年的一篇研究论文发现,贝叶斯优化在许多超参数调优任务中非常成功。
- 2018 年诺贝尔奖获得者 Frances Arnold 在研究中使用贝叶斯优化来指导寻找能有效催化理想化学反应的酶。
- 一篇发表在《自然》杂志上的研究将贝叶斯优化应用于分子有机发光二极管的筛选问题,效率有了很大提高。
#### 3. 何时不使用贝叶斯优化
贝叶斯优化适用于资源有限,无法多次评估目标函数的情况。如果评估目标函数的成本很低,我们就没有必要节省观察目标函数的次数。此时,如果能在一个密集的网格上彻底检查目标函数,就可以确保找到全局最优值。否则,可以使用其他策略,如 DIRECT 算法或进化算法,这些算法在评估成本低时通常在优化方面表现出色。此外,如果有目标函数的梯度信息,基于梯度的算法会更合适。
#### 4. 高斯过程作为函数分布
在贝叶斯优化工作流程中,高斯过程(GP)作为预测模型,决策策略用于决策。使用 GP 进行预测时,我们得到的不是一个点估计,而是一个代表我们对预测的信念的整个概率分布。
GP 会从相似的数据点产生相似的预测。例如,在天气预报中,估计今天的温度时,GP 会查看与今天相似的日子(如过去几天或去年的同一天)的气候数据,而另一个季节的日子对这个预测没有帮助。同样,在预测房价时,GP 会认为与预测目标在同一社区的相似房屋比其他州的房屋更有信息价值。
数据点之间的相似性通过 GP 的协方差函数编码,该函数还对 GP 预测中的不确定性进行建模。与岭回归模型相比,岭回归器只产生单值预测,而 GP 在每个测试点输出一个正态分布。不确定性量化是 GP 与其他机器学习模型的区别所在,特别是在不确定性下的决策背景中。
#### 5. 用贝叶斯方法卖房示例
在进入 GP 的细节之前,我们通过一个房屋价格建模的例子来看看多元高斯分布中的相关性是如何起作用的。假设你是密苏里州的一位房主,想出售你的房子,你不确定房子的价格,最初估计价格在 15 万美元到 30 万美元之间。
- 当你得知住在加利福尼亚州的 Alix 以 25 万美元的价格出售了她的房子时,这对你估计自己房子的价格没有帮助,你的估计仍然在 15 万美元到 30 万美元之间。
- 但当你得知住在你隔壁的 Alice 以 25 万美元的价格出售了她的房子时,这就很有用了。因为你们的房子在属性上相似且地理位置接近,你会预期它们的售价相似。此时,你对自己房子价格的估计会更新到 23 万美元到 27 万美元之间。
这个计算过程是对我们对房子价格的信念的贝叶斯更新。贝叶斯定理为我们提供了一种更新对感兴趣的数量(这里是房子的合适价格)的信念的方法。在应用贝叶斯定理时,我们从先验信念(最初的猜测)转变为关于该数量的后验信念,后验信念结合了先验信念和我们观察到的任何数据的可能性。
在这个例子中,我们最初的先验信念是价格在 15 万美元到 30 万美元之间,这个范围很宽,包含的信息不多。当考虑新的房屋价格信息时,我们更新为后验信念:
- 如果新信息是 Alix 在加利福尼亚州的房子价值 25 万美元,我们对自己房子的后验信念保持不变,仍然是 15 万美元到 30 万美元。
- 如果新信息是隔壁 Alice 的房子价值 25 万美元,我们的后验信念会显著改变,变为 23 万美元到 27 万美元。我们的信念围绕观察到的值 25 万美元更新,同时缩小了信念的范围(从 15 万美元的差异缩小到 4 万美元的差异)。
#### 6. 为何选择 GPyTorch
在 Python 中有其他 GP 建模库,如 GPy 或 GPflow,但我们选择了 GPyTorch。它基于 PyTorch 构建并得到积极维护,提供了从数组操作到 GP 建模,最终到使用 BoTorch 进行贝叶斯优化的简化工作流程。该库也有许多先进的方法实现,例如可以使用 GPyTorch 将 GP 扩展到大型数据集,还可以将神经网络集成到 GP 模型中。
通过以上内容,我们对贝叶斯优化和高斯过程有了更深入的了解,并且看到了它们在实际问题中的应用和优势。在后续的学习中,我们可以进一步掌握如何使用 GPyTorch 实现高性能的 GP 模型,以及如何使用 BoTorch 实现各种贝叶斯优化策略等。
### 贝叶斯优化:从理论到实践
#### 7. 多元高斯分布与高斯过程
要深入理解高斯过程(GP),我们先回顾一下多元高斯分布及其性质。多元高斯分布是一种常见的概率分布,它描述了多个随机变量之间的联合概率分布。在高斯过程中,我们可以将其看作是多元高斯分布在无限维度上的推广。
在多元高斯分布中,我们可以通过协方差矩阵来描述变量之间的相关性。同样,在高斯过程中,协方差函数起着类似的作用,它编码了数据点之间的相似性,并且可以用来量化预测的不确定性。
下面我们通过一个 mermaid 流程图来展示高斯过程与多元高斯分布的关系:
```mermaid
graph LR
A[多元高斯分布] --> B[协方差矩阵描述相关性]
C[高斯过程] --> D[协方差函数编码相似性]
B --> E[有限维度]
D --> F[无限维度]
E --> G[推广到]
F --> G
G --> H[高斯过程是多元高斯分布在无限维度的推广]
```
在 Python 中实现高斯过程,我们可以使用 GPyTorch 库。以下是一个简单的示例代码,展示了如何使用 GPyTorch 定义一个高斯过程模型:
```python
import torch
import gpytorch
# 定义一个简单的高斯过程模型
class ExactGPModel(gpytorch.models.ExactGP):
def __init__(self, train_x, train_y, likelihood):
super(ExactGPModel, self).__init__(train_x, train_y, likelihood)
self.mean_module = gpytorch.means.ConstantMean()
self.covar_module = gpytorch.kernels.ScaleKernel(gpytorch.kernels.RBFKernel())
def forward(self, x):
mean_x = self.mean_module(x)
covar_x = self.covar_module(x)
return gpytorch.distributions.MultivariateNormal(mean_x, covar_x)
# 生成一些训练数据
train_x = torch.linspace(0, 1, 100)
train_y = torch.sin(train_x * (2 * torch.pi))
# 定义似然函数和模型
likelihood = gpytorch.likelihoods.GaussianLikelihood()
model = ExactGPModel(train_x, train_y, likelihood)
```
#### 8. 高斯过程的数学灵活性
高斯过程具有很强的数学灵活性,这使得我们可以将先验信息融入到预测中。通过调整 GP 的全局趋势和变异性,我们可以对各种不同的函数进行建模。
例如,我们可以通过组合不同的组件来构建一个复杂的高斯过程模型。下面是一个表格,展示了一些常见的 GP 组件及其作用:
| 组件名称 | 作用 |
| ---- | ---- |
| 常数均值模块 | 表示函数的整体平均水平 |
| RBF 核函数 | 描述数据点之间的相似性,常用于平滑函数的建模 |
| 多项式核函数 | 可以捕捉函数的多项式趋势 |
| 周期核函数 | 用于建模具有周期性的函数 |
通过组合这些组件,我们可以根据具体的问题需求来设计合适的高斯过程模型。例如,对于一个既有平滑趋势又有周期性变化的函数,我们可以同时使用 RBF 核函数和周期核函数。
#### 9. 贝叶斯优化的关键技能
在掌握了高斯过程的相关知识后,我们可以进一步学习如何实现贝叶斯优化的完整流程。以下是一些我们需要掌握的关键技能:
1. **实现高性能的 GP 模型**:使用 GPyTorch 实现 GP 模型,包括模型的设计、训练和评估。我们需要学会选择合适的参数,如均值模块、核函数等,以提高模型的性能。
2. **实现贝叶斯优化策略**:使用 BoTorch 库实现各种贝叶斯优化策略,如预期改进策略、上置信界策略等。这些策略可以帮助我们在搜索空间中选择最有前景的点进行评估。
3. **处理特殊设置**:在实际应用中,我们可能会遇到一些特殊的优化问题,如批量优化、约束优化和多目标优化。我们需要学会使用贝叶斯优化框架来处理这些特殊情况。
4. **应用到实际任务**:将贝叶斯优化应用到实际任务中,如机器学习模型的超参数调优。通过优化超参数,我们可以提高模型的性能和泛化能力。
#### 10. 总结
贝叶斯优化是一种强大的机器学习技术,它可以帮助我们解决昂贵的黑盒优化问题。在贝叶斯优化中,高斯过程作为预测模型,决策策略用于选择评估点,两者相辅相成。
通过本文的介绍,我们了解了贝叶斯优化的基本概念、工作原理和应用场景。我们还学习了高斯过程的相关知识,包括其作为函数分布的特点、数学灵活性以及如何在 Python 中实现。
在实际应用中,我们可以根据具体的问题需求选择合适的贝叶斯优化策略和高斯过程模型。同时,我们需要不断实践和探索,以提高自己在贝叶斯优化领域的技能和能力。希望本文能够为你在贝叶斯优化的学习和实践中提供一些帮助和指导。
0
0
复制全文
相关推荐









