多保真度优化:平衡效用与成本
立即解锁
发布时间: 2025-08-31 01:48:32 阅读量: 8 订阅数: 25 AIGC 

### 多保真度优化:平衡效用与成本
#### 1. 多保真度优化中的性能评估
在之前的讨论中,我们了解到多保真度最大熵搜索(MES)策略在选择查询的两种保真度时能够做出恰当的决策。但这个策略是否优于仅查询真实函数 \( f(x) \) 的常规贝叶斯优化(BayesOpt)策略呢?如果是,它的优势有多大?接下来,我们将学习如何在多保真度环境中对 BayesOpt 策略的性能进行基准测试。
在之前的优化进度衡量中,我们记录了整个搜索过程中训练集中收集到的最高目标值(即当前最优值)。若策略 A 收集到的当前最优值超过策略 B,我们就认为策略 A 的优化效果比策略 B 更好。然而,在多保真度环境中,记录当前最优值的方法并不适用。原因在于,如果我们要记录训练集中的当前最优值,通常会选择高保真度数据点中标签值最高的那个,但这种策略忽略了低保真度查询对了解目标函数 \( f(x) \) 所做的贡献。
例如,有两种可能的情况:
- **情况一**:我们进行了三次高保真度观测,最高观测值约为 0.8。实际上,在这种情况下我们几乎没有取得优化进展,甚至还未探索 \( x > 0 \) 的区域。
- **情况二**:我们仅进行了低保真度观测,此时记录高保真度的当前最优值就变得不适用。但我们发现,通过这些查询,我们已经接近找到了目标函数的最优值。
很明显,我们应该更倾向于第二种情况,因为它表明优化接近成功,而第一种情况则显示优化进展甚微。但使用高保真度的当前最优值作为进展衡量标准,无法帮助我们区分这两种情况。因此,我们需要另一种方法来衡量优化进展。
在 BayesOpt 领域,一个常见的进展衡量标准是当前后验均值最高位置处的目标函数值。直观地说,如果我们要停止运行 BayesOpt 并推荐一个点作为优化问题的解决方案,我们应该选择在最合理的情况下(根据高斯过程(GP)的信念)给出最高值的点,即后验均值最大化点。
后验均值最大化点有助于我们对上述两种情况进行比较。在第一种情况中,后验均值最大化点在 \( x = 0 \) 处,目标值为 0.8;而在第二种情况中,后验均值最大化点约在 \( x = 4.5 \) 处。这表明后验均值最大化指标成功地帮助我们区分了这两种情况,并且显示出第一种情况不如第二种情况理想。
为了实现这个指标,我们创建一个辅助策略,将后验均值作为其获取分数。就像在 BayesOpt 中优化常规策略的获取分数一样,我们使用这个辅助策略来优化后验均值。这个策略需要两个组件:
- **后验均值类**:使用后验均值作为获取分数的 BayesOpt 策略类,即 `PosteriorMean`,可以从 `botorch.acquisition` 导入。
- **包装策略**:仅优化高保真度指标的包装策略。由于我们使用的是多保真度 GP 模型,在将该模型传递给优化策略时,需要指定要处理的保真度。这个包装策略是 `botorch.acquisition.fixed_feature` 中的 `FixedFeatureAcquisitionFunction` 类的一个实例。
以下是实现后验均值最大化指标的代码:
```python
from botorch.acquisition.fixed_feature import FixedFeatureAcquisitionFunction
from botorch.acquisition import PosteriorMean
# 创建后验均值策略
post_mean_policy = FixedFeatureAcquisitionFunction(
acq_function=PosteriorMean(model),
d=2,
columns=[1],
values=[1],
)
# 找到最大化获取分数的点
from botorch.optim import optimize_acqf
final_x, _ = optimize_acqf(
post_mean_policy,
bounds=bounds,
q=1,
num_restarts=20,
raw_samples=50,
)
```
在上述代码中,`d = 2` 表示搜索空间的维度,实际搜索空间是一维的,但还有一个用于表示相关性值(即查询的保真度)的额外维度。`columns = [1]` 和 `values = [1]` 表示在优化过程中,我们指定第二列(索引为 1)的值始终为 1,以确保我们只找到对应于目标函数(高保真度函数)的后验均值最大化点。
在 Jupyter 笔记本中,我们将上述代码封装在一个辅助函数中,该函数返回 `final_x` 并添加一个相关性值为 1 的维度,表示真实的目标函数:
```python
import torch
def get_final_recommendation(model):
post_mean_policy = FixedFeatureAcquisitionFunction(
acq_function=PosteriorMean(model),
d=2,
columns=[1],
values=[1],
)
final_x, _ = optimize_acqf(
post_mean_policy,
bounds=bounds,
q=1,
num_restarts=20,
raw_samples=50,
)
return torch.cat([final_x, torch.one
```
0
0
复制全文
相关推荐









