BayesianOptimization采集函数全解析

BayesianOptimization采集函数全解析

【免费下载链接】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 的工作流程

mermaid

实际应用示例

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 采集函数具有以下显著特点:

  1. 理论保证:UCB 具有regret bound的理论保证,在有限评估次数下能够接近全局最优
  2. 参数直观:κ 参数具有明确的统计意义,对应置信区间的宽度
  3. 计算高效:只需要均值和标准差,计算复杂度低
  4. 易于调参:κ 参数的选择相对直观,通常 2.576 对应 99% 置信区间

与其他采集函数的对比

下表展示了 UCB 与其他常见采集函数的对比:

采集函数探索倾向利用倾向计算复杂度参数敏感性
UCB中等(可调)中等(可调)中等
Expected Improvement
Probability of Improvement很低很高
Thompson Sampling

最佳实践建议

  1. κ 参数选择:从 κ=2.576(99%置信水平)开始,根据问题特性调整
  2. 约束处理:UCB 天然支持约束优化,通过乘以约束满足概率
  3. 并行优化:可与 Constant Liar 等策略结合实现并行评估
  4. 自适应调整:可实现在优化过程中动态调整 κ 值的策略
# 自适应κ调整策略示例
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:

关键参数说明:

参数类型默认值说明
xifloat0.01探索参数,值越大探索性越强
exploration_decayfloatNone每次迭代xi的衰减系数
exploration_decay_delayintNone开始衰减前的迭代次数

探索与利用的平衡机制

期望改进函数通过xi参数和数学公式自然地平衡探索和利用:

  1. 高均值低方差区域:当$\mu(x)$远大于$f^*$且$\sigma(x)$较小时,EI值较大,倾向于利用
  2. 高方差区域:当$\sigma(x)$较大时,即使$\mu(x)$不高,EI值也可能较大,倾向于探索
  3. xi参数调节:增大xi会增加对高方差区域的偏好,增强探索性

mermaid

实际应用示例

下面展示如何在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的核心计算逻辑:

  1. 获取当前最优值 best(即 $f(x^+)$)
  2. 计算标准化变量 $z = \frac{\mu - f(x^+) - \xi}{\sigma}$
  3. 使用标准正态分布的累积分布函数计算改进概率

参数调优与使用示例

$\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 【免费下载链接】BayesianOptimization 项目地址: https://gitcode.com/gh_mirrors/ba/BayesianOptimization

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值