BayesianOptimization采集函数全解析
【免费下载链接】BayesianOptimization 项目地址: https://gitcode.com/gh_mirrors/ba/BayesianOptimization
本文全面解析了BayesianOptimization库中的核心采集函数,包括UpperConfidenceBound(UCB)、ExpectedImprovement(EI)、ProbabilityOfImprovement(POI)三种基础采集函数,以及GPHedge和ConstantLiar两种高级策略。文章详细介绍了每种采集函数的数学原理、参数配置、实现代码、适用场景和性能特点,并通过实际示例展示了如何在不同优化问题中应用这些采集函数。
UpperConfidenceBound:置信上界采集函数
在贝叶斯优化中,置信上界(Upper Confidence Bound, UCB)采集函数是一种平衡探索(exploration)和利用(exploitation)的经典策略。它通过高斯过程的预测均值和标准差来构建一个置信区间,选择具有最高上界的点作为下一个评估点。
UCB 的数学原理
UCB 采集函数的核心公式为:
$$ \text{UCB}(x) = \mu(x) + \kappa \cdot \sigma(x) $$
其中:
- $\mu(x)$ 是高斯过程在点 $x$ 处的预测均值
- $\sigma(x)$ 是高斯过程在点 $x$ 处的预测标准差
- $\kappa$ 是平衡参数,控制探索与利用的权衡
class UpperConfidenceBound(AcquisitionFunction):
"""Upper Confidence Bound acquisition function.
Parameters
----------
kappa : float, default 2.576
Balances exploration and exploitation. Higher values lead to more exploration.
random_state : int, RandomState, default None
Set the random state for reproducibility.
"""
def __init__(self, kappa: float = 2.576, random_state: int | RandomState | None = None) -> None:
super().__init__(random_state)
self.kappa = kappa
def base_acq(self, mean: NDArray[Float], std: NDArray[Float]) -> NDArray[Float]:
"""Compute the Upper Confidence Bound acquisition value.
Parameters
----------
mean : np.ndarray
Predicted mean from the Gaussian Process.
std : np.ndarray
Predicted standard deviation from the Gaussian Process.
Returns
-------
np.ndarray
UCB acquisition values.
"""
return mean + self.kappa * std
κ 参数的作用机制
κ 参数在 UCB 中起着关键作用,它直接决定了探索与利用的平衡程度:
| κ 值范围 | 行为特征 | 适用场景 |
|---|---|---|
| κ < 1.0 | 偏向利用 | 函数评估成本高,需要快速收敛 |
| 1.0 ≤ κ ≤ 3.0 | 平衡探索与利用 | 大多数标准优化问题 |
| κ > 3.0 | 偏向探索 | 需要充分探索参数空间,避免陷入局部最优 |
UCB 的工作流程
实际应用示例
import numpy as np
from bayes_opt import BayesianOptimization
from bayes_opt import acquisition
# 定义目标函数
def target_function(x):
return -x**2 + 10*x + np.sin(x)*5
# 使用不同κ值的UCB采集函数
optimizers = {}
kappa_values = [0.5, 2.576, 5.0]
for kappa in kappa_values:
acq_func = acquisition.UpperConfidenceBound(kappa=kappa)
optimizer = BayesianOptimization(
f=target_function,
pbounds={'x': (0, 10)},
acquisition_function=acq_func,
random_state=42
)
optimizer.maximize(init_points=2, n_iter=10)
optimizers[kappa] = optimizer
# 比较不同κ值的优化结果
for kappa, opt in optimizers.items():
print(f"κ={kappa}: 最优值={opt.max['target']:.3f}, 参数={opt.max['params']}")
UCB 的性能特点
UCB 采集函数具有以下显著特点:
- 理论保证:UCB 具有regret bound的理论保证,在有限评估次数下能够接近全局最优
- 参数直观:κ 参数具有明确的统计意义,对应置信区间的宽度
- 计算高效:只需要均值和标准差,计算复杂度低
- 易于调参:κ 参数的选择相对直观,通常 2.576 对应 99% 置信区间
与其他采集函数的对比
下表展示了 UCB 与其他常见采集函数的对比:
| 采集函数 | 探索倾向 | 利用倾向 | 计算复杂度 | 参数敏感性 |
|---|---|---|---|---|
| UCB | 中等(可调) | 中等(可调) | 低 | 中等 |
| Expected Improvement | 低 | 高 | 中 | 低 |
| Probability of Improvement | 很低 | 很高 | 中 | 高 |
| Thompson Sampling | 高 | 低 | 高 | 低 |
最佳实践建议
- κ 参数选择:从 κ=2.576(99%置信水平)开始,根据问题特性调整
- 约束处理:UCB 天然支持约束优化,通过乘以约束满足概率
- 并行优化:可与 Constant Liar 等策略结合实现并行评估
- 自适应调整:可实现在优化过程中动态调整 κ 值的策略
# 自适应κ调整策略示例
class AdaptiveUCB(acquisition.UpperConfidenceBound):
def __init__(self, initial_kappa=2.576, decay_rate=0.95):
super().__init__(kappa=initial_kappa)
self.initial_kappa = initial_kappa
self.decay_rate = decay_rate
self.iteration = 0
def suggest(self, *args, **kwargs):
self.iteration += 1
# 随着迭代进行,逐渐减少探索倾向
self.kappa = self.initial_kappa * (self.decay_rate ** self.iteration)
return super().suggest(*args, **kwargs)
UCB 采集函数因其理论完备性和实践有效性,成为贝叶斯优化中最常用和可靠的采集策略之一。通过合理设置 κ 参数,可以在各种优化场景中取得良好的性能表现。
ExpectedImprovement:期望改进采集函数
期望改进(Expected Improvement,EI)是贝叶斯优化中最经典和最广泛使用的采集函数之一。它通过计算在当前最佳观测值基础上的期望改进量来平衡探索(exploration)和利用(exploitation),是BayesianOptimization库中核心的优化策略。
数学原理与公式推导
期望改进函数基于高斯过程的后验分布,计算在某个候选点x处,目标函数值f(x)超过当前最佳观测值f*的期望改进量:
$$ EI(x) = \mathbb{E}[\max(f(x) - f^*, 0)] $$
对于高斯过程,这个期望可以解析地表示为:
$$ EI(x) = (\mu(x) - f^* - \xi)\Phi(Z) + \sigma(x)\phi(Z) $$
其中:
- $\mu(x)$ 是高斯过程在点x处的预测均值
- $\sigma(x)$ 是高斯过程在点x处的预测标准差
- $f^*$ 是当前最佳观测值
- $\xi$ 是探索参数,控制探索程度
- $Z = \frac{\mu(x) - f^* - \xi}{\sigma(x)}$ 是标准化改进量
- $\Phi$ 是标准正态分布的累积分布函数
- $\phi$ 是标准正态分布的概率密度函数
核心实现解析
在BayesianOptimization库中,ExpectedImprovement类的实现继承了AcquisitionFunction基类,其核心方法base_acq实现了上述数学公式:
def base_acq(self, mean: NDArray[Float], std: NDArray[Float]) -> NDArray[Float]:
"""计算期望改进值"""
# 计算标准化改进量Z
Z = (mean - self.current_max - self.xi) / std
# 计算概率密度函数和累积分布函数值
pdf = norm.pdf(Z)
cdf = norm.cdf(Z)
# 计算期望改进
improvement = (mean - self.current_max - self.xi) * cdf + std * pdf
return np.maximum(improvement, 0)
参数配置与调优
ExpectedImprovement类提供了灵活的参数配置:
class ExpectedImprovement(AcquisitionFunction):
def __init__(
self,
xi: float = 0.01, # 探索参数,默认0.01
exploration_decay: float | None = None, # 探索衰减率
exploration_decay_delay: int | None = None, # 衰减延迟
random_state: int | RandomState | None = None,
) -> None:
关键参数说明:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| xi | float | 0.01 | 探索参数,值越大探索性越强 |
| exploration_decay | float | None | 每次迭代xi的衰减系数 |
| exploration_decay_delay | int | None | 开始衰减前的迭代次数 |
探索与利用的平衡机制
期望改进函数通过xi参数和数学公式自然地平衡探索和利用:
- 高均值低方差区域:当$\mu(x)$远大于$f^*$且$\sigma(x)$较小时,EI值较大,倾向于利用
- 高方差区域:当$\sigma(x)$较大时,即使$\mu(x)$不高,EI值也可能较大,倾向于探索
- xi参数调节:增大xi会增加对高方差区域的偏好,增强探索性
实际应用示例
下面展示如何在BayesianOptimization中使用ExpectedImprovement采集函数:
from bayes_opt import BayesianOptimization
from bayes_opt.acquisition import ExpectedImprovement
# 定义目标函数
def black_box_function(x, y):
return -x**2 - (y - 1)**2 + 1
# 创建优化器并指定采集函数
optimizer = BayesianOptimization(
f=black_box_function,
pbounds={'x': (2, 4), 'y': (-3, 3)},
acquisition_function=ExpectedImprovement(xi=0.05), # 使用EI采集函数
random_state=1,
)
# 执行优化
optimizer.maximize(init_points=2, n_iter=10)
性能特点与适用场景
期望改进采集函数具有以下特点:
优点:
- 数学理论基础坚实,收敛性有保证
- 自然地平衡探索与利用
- 对大多数优化问题都表现良好
- 参数调节相对简单
适用场景:
- 中等维度的连续参数优化
- 计算成本较高的黑盒函数优化
- 需要较好探索-利用平衡的场景
- 对收敛性有要求的应用
与其他采集函数的对比
下表对比了ExpectedImprovement与其他主要采集函数的特性:
| 采集函数 | 探索性 | 计算复杂度 | 参数敏感性 | 适用场景 |
|---|---|---|---|---|
| ExpectedImprovement | 中等 | 中等 | 低 | 通用优化 |
| UpperConfidenceBound | 强 | 低 | 高 | 强探索需求 |
| ProbabilityOfImprovement | 弱 | 低 | 中等 | 快速收敛 |
高级配置技巧
对于复杂优化问题,可以通过组合使用和参数调节来提升EI的性能:
# 动态调整探索参数
ei = ExpectedImprovement(
xi=0.1,
exploration_decay=0.9, # 每次迭代xi衰减10%
exploration_decay_delay=5 # 前5次迭代不衰减
)
# 与约束优化结合使用
from bayes_opt.constraint import NonlinearConstraint
constraint = NonlinearConstraint(
fun=lambda x, y: x + y, # 约束函数
lb=0, ub=2 # 约束边界
)
optimizer = BayesianOptimization(
f=black_box_function,
pbounds={'x': (2, 4), 'y': (-3, 3)},
acquisition_function=ei,
constraint=constraint
)
期望改进采集函数作为贝叶斯优化的核心组件,通过其优雅的数学形式和实用的性能表现,成为了众多优化任务的首选方案。
ProbabilityOfImprovement:改进概率采集函数
在贝叶斯优化中,ProbabilityOfImprovement(POI)是一种经典的采集函数,它通过计算新采样点能够改进当前最优值的概率来指导搜索过程。POI特别适合那些需要快速收敛到局部最优解的场景,因为它倾向于在已知的最优解附近进行采样。
数学原理与公式推导
ProbabilityOfImprovement的核心思想是计算新采样点 $x$ 的目标函数值 $f(x)$ 超过当前最优值 $f(x^+)$ 的概率。其数学表达式为:
$$ \text{POI}(x) = P(f(x) \geq f(x^+) + \xi) = \Phi\left(\frac{\mu(x) - f(x^+) - \xi}{\sigma(x)}\right) $$
其中:
- $\mu(x)$ 是高斯过程在点 $x$ 处的预测均值
- $\sigma(x)$ 是高斯过程在点 $x$ 处的预测标准差
- $f(x^+)$ 是当前最优目标函数值
- $\xi \geq 0$ 是控制探索-利用权衡的参数
- $\Phi(\cdot)$ 是标准正态分布的累积分布函数
参数 $\xi$ 的作用机制如下:
- 当 $\xi = 0$ 时,POI 计算严格改进的概率
- 当 $\xi > 0$ 时,POI 计算超过当前最优值加上 $\xi$ 的概率,增加了探索性
实现代码解析
让我们深入分析BayesianOptimization库中ProbabilityOfImprovement类的实现:
class ProbabilityOfImprovement(AcquisitionFunction):
"""Probability of Improvement acquisition function.
Parameters
----------
xi : float, default 0.0
Controls the balance between exploration and exploitation.
Higher values encourage more exploration.
random_state : int, RandomState, default None
Set the random state for reproducibility.
"""
def __init__(self, xi: float = 0.0, random_state: int | RandomState | None = None) -> None:
super().__init__(random_state=random_state)
self.xi = xi
def base_acq(self, mean: NDArray[Float], std: NDArray[Float]) -> NDArray[Float]:
"""Compute the base Probability of Improvement acquisition function.
Parameters
----------
mean : np.ndarray
Predicted mean from the Gaussian Process.
std : np.ndarray
Predicted standard deviation from the Gaussian Process.
Returns
-------
np.ndarray
Probability of Improvement values.
"""
if len(self.target_space) == 0:
return np.zeros_like(mean)
best = np.max(self.target_space.target)
z = (mean - best - self.xi) / std
return norm.cdf(z)
这个实现展示了POI的核心计算逻辑:
- 获取当前最优值
best(即 $f(x^+)$) - 计算标准化变量 $z = \frac{\mu - f(x^+) - \xi}{\sigma}$
- 使用标准正态分布的累积分布函数计算改进概率
参数调优与使用示例
$\xi$ 参数是控制POI行为的关键,下表展示了不同 $\xi$ 值对优化行为的影响:
| $\xi$ 值 | 行为特点 | 适用场景 |
|---|---|---|
| 0.0 | 纯利用,快速收敛到局部最优 | 计算资源有限,需要快速获得可用解 |
| 0.01-0.1 | 适度探索,平衡收敛和全局搜索 | 大多数标准优化问题 |
| > 0.1 | 强探索,避免局部最优陷阱 | 多峰函数,需要找到全局最优 |
使用ProbabilityOfImprovement的示例代码:
from bayes_opt import BayesianOptimization
from bayes_opt import acquisition
import numpy as np
# 定义目标函数
def target_function(x, y):
return -x**2 - (y - 1)**2 + 1
# 创建优化器,使用POI采集函数
optimizer = BayesianOptimization(
f=target_function,
pbounds={'x': (2, 4), 'y': (-3, 3)},
acquisition_function=acquisition.ProbabilityOfImprovement(xi=0.05),
random_state=42
)
# 执行优化
optimizer.maximize(init_points=5, n_iter=15)
# 输出最优结果
print(f"最优参数: {optimizer.max['params']}")
print(f"最优值: {optimizer.max['target']}")
探索-利用权衡的可视化分析
通过mermaid流程图展示POI在不同$\xi$值下的决策过程:
flowchart TD
A[开始POI决策] --> B{计算每个点的改进概率}
B --> C[选择概率最大的点]
C --> D{ξ = 0?}
D -->|是| E[纯利用策略<br>在已知最优附近采样]
D -->|否| F[ξ > 0<br>考虑探索性]
F --> G{ξ值大小?}
G -->|小ξ| H[适度探索<br>平衡收敛速度]
G -->|大ξ| I[强探索<br>寻找潜在更优区域]
E --> J[快速收敛到局部最优]
H --> K[较好平衡探索与利用
【免费下载链接】BayesianOptimization 项目地址: https://gitcode.com/gh_mirrors/ba/BayesianOptimization
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



