多保真度优化中效用与成本的平衡
立即解锁
发布时间: 2025-08-31 01:43:59 阅读量: 10 订阅数: 23 AIGC 

# 多保真度优化中效用与成本的平衡
## 1. 多保真度 GP 模型中的相关性值
在多保真度优化里,多保真度 GP 模型具有灵活性。同时,保真度张量中正确的相关性值极为重要。通过对比相关示例中的两个面板可知,两个保真度之间的相关性值设为 0.5 比 0.9 更佳:
- 右侧面板中,由于过度依赖和信任低保真度观测值,预测结果在大部分空间都偏离了真实目标函数 f(x)。
- 左侧面板中,95% 置信区间更宽,能恰当反映对 f(x) 的不确定性。
这表明不应高估低保真度近似 f̅(x) 对目标函数 f(x) 的信息价值。
## 2. 多保真度优化中的信息与成本平衡
### 2.1 不同保真度查询成本的建模
在多保真度优化问题中,假定已知查询目标函数 f(x) 或低保真度近似 f̅(x) 的成本。为便于模块化优化工作流程,需将查询各函数的成本信息表示为成本模型。该模型接收给定数据点(包含额外的相关性值特征),并返回在指定保真度下查询该数据点的已知成本。
BoTorch 提供了线性成本模型 `AffineFidelityCostModel`,其假设查询成本与保真度和真实目标 f(x) 之间的相关性呈线性关系。以下是初始化该线性成本模型的代码:
```python
from botorch.models.cost import AffineFidelityCostModel
cost_model = AffineFidelityCostModel(
fixed_cost=0.0,
fidelity_weights={1: 1.0},
)
```
此代码将固定成本设为 0,权重设为 1。这意味着查询低保真度数据点的成本恰好是低保真度近似的相关性值(0.5 成本单位),查询高保真度数据点的成本为 1 成本单位。成本单位取决于具体应用,可由用户设定,如时间(分钟、小时或天)、金钱(美元)或某种努力程度。
线性趋势体现了相关性值与成本的关系:高相关性的高保真度函数查询成本高,低保真度函数查询成本低。固定成本和权重这两个可设置参数,能灵活建模多种查询成本。
若需对查询成本进行非线性建模(如二次或指数趋势),可自行实现成本模型。具体成本计算公式如下:
|查询类型|计算公式|
| ---- | ---- |
|低保真度查询成本|固定成本 + 权重 × 低保真度相关性值|
|高保真度查询成本|固定成本 + 权重 × 高保真度相关性值|
### 2.2 优化每美元信息获取量以指导优化
在多保真度优化中,需平衡查询函数获取的信息量与查询成本。高保真度函数能提供目标函数 f(x) 的精确信息,但查询成本高;低保真度近似评估成本低,但提供的信息不精确。多保真度贝叶斯优化策略的任务就是实现这种平衡。
#### 2.2.1 信息获取量的量化
已有的成本模型可计算查询任意数据点的成本。对于获取目标函数信息的量化,采用最大价值熵搜索(MES)策略。MES 策略根据查询能提供的关于 f(x) 最优值的信息量对查询进行排序,该信息获取量的衡量是通用的信息论概念,可应用于多保真度场景。
#### 2.2.2 成本感知的效用衡量
使用投资回报率(ROI)指标来量化查询的成本感知效用,计算公式为:
\[ROI\ score = \frac{信息获取量}{查询成本}\]
ROI 分数能合理权衡查询获取的信息和成本:
- 若两个查询成本相同但信息获取量不同,应选择信息获取量多的查询。
- 若两个查询提供的关于目标最优值的信息量相同,应选择成本低的查询。
#### 2.2.3 成本感知的 MES 策略实现
为实现成本感知的 MES 策略,需使用 BoTorch 的 `qMultiFidelityMaxValueEntropy` 类,其实现需要以下组件:
1. **成本效用对象**:使用 `InverseCostWeightedUtility` 类实现,对查询效用按成本的倒数进行加权,初始化时传入之前创建的成本模型:
```python
from botorch.acquisition.cost_aware import InverseCostWeightedUtility
cost_aware_utility = InverseCostWeightedUtility(cost_model=cost_model)
```
2. **Sobol 序列**:作为 MES 熵计算的候选集。从单位立方体中抽取 1000 个元素的 Sobol 序列,并将其缩放到搜索空间,同时在多保真度场景下,为该候选集添加表示目标函数 f(x) 相关性值为 1 的额外列:
```python
import torch
from botorch.utils.sampling import SobolEngine
torch.manual_seed(0)
sobol = SobolEngine(1, scramble=True)
candidate_x = sobol.draw(1000)
candidate_x = bounds[0] + (bounds[1]
```
0
0
复制全文
相关推荐









