哈喽,大家好~

昨天有同学提到了贝叶斯优化,思来想去,还是出一期,和大家一起讨论一下,大家有任何问题,评论区留言~

首先,咱们来说说基本的定义,贝叶斯优化是一种用于黑盒函数优化(Black-Box Optimization)的全局优化方法,特别适用于计算昂贵的目标函数

贝叶斯优化基于贝叶斯定理,通过构建代理模型(通常是高斯过程,Gaussian Process, GP) 来对目标函数进行建模,并利用采集函数(Acquisition Function)来指导采样,从而高效地寻找全局最优解。

适用于高维、不可导、非凸、计算成本高的优化问题,广泛应用于机器学习超参数调优、实验设计、强化学习、A/B测试等领域。

你可以想象一下,如果想要找到全城最好吃的拉面店,但你不能一家家吃过去(因为时间和金钱成本太高)。贝叶斯优化就是一种很聪明的策略,帮助你在尽可能少的尝试下找到最佳选择。

1. 代理模型(高斯过程)

“吃了一些店后,估计其它店的味道”

  • 你先随机选几家店试吃,并给它们评分。
  • 你会根据这些评分,估计没吃过的店大概是什么水平(比如同一个商圈的店可能都不错)。
  • 这就像贝叶斯优化中的高斯过程(Gaussian Process, GP),它会用已有的数据来预测未知区域的可能值,并且提供不确定性估计。

2. 采集函数(Acquisition Function)

“去哪家试吃最划算”

  • 你不想浪费时间,所以每次选下一家店时要有策略:
    • 选看起来可能很好吃的店(探索潜在最优解)。
    • 选那些大家评价不一的店(不确定性大),因为可能是被低估的宝藏店(探索新区域)。
    • 避免试吃太多已经很明确的店,因为已经知道它们味道了(减少重复采样)。
  • 这就类似贝叶斯优化中的采集函数(Acquisition Function),它会平衡探索(Exploration)和利用(Exploitation),决定下一个要测试的点。

3. 逐步逼近最优解

  • 你根据这个策略不断试吃,并更新自己的“预测模型”。
  • 经过几轮尝试后,你就能找到最有可能是全城最好吃的拉面店,而不用把所有店都试吃一遍。
  • 这正是贝叶斯优化的核心:**用最少的试验次数,找到最优解!

总结贝叶斯优化的核心思想是:

  1. 用高斯过程(GP)来预测未知区域的表现,减少不必要的计算。
  2. 用采集函数(Acquisition Function)决定下一个采样点,在探索和利用之间做权衡。
  3. 不断更新模型,逐步逼近全局最优解,最终找到最优值。

贝叶斯优化适用于那些计算代价昂贵的优化问题,比如神经网络超参数调优,比起暴力搜索或随机搜索,贝叶斯优化能更快、更智能地找到最佳结果。

理论基础

贝叶斯优化(Bayesian Optimization, BO)是一种用于黑盒函数优化的方法,尤其适用于目标函数计算成本较高的情况(例如深度学习中的超参数调优、实验设计等)。

贝叶斯优化的核心思想是利用概率模型(通常是高斯过程 GP) 来代理目标函数,并使用采集函数(Acquisition Function) 来决定下一个评估的点,从而在较少的查询次数下找到最优解。

1. 问题定义

设目标函数为:

其中:

  •  是输入空间,通常是一个高维空间。
  •  是我们希望优化的函数,但它可能是昂贵的(如实验数据、复杂计算)。
  • 我们希望找到全局最优解:

(对于最小化问题,只需取负数 

由于  计算代价高,我们不能直接使用网格搜索或随机搜索,因此使用贝叶斯优化。

2. 代理模型(高斯过程,GP)

贝叶斯优化的核心是使用 高斯过程(Gaussian Process, GP) 来估计目标函数 

高斯过程回归

高斯过程是一种概率分布,假设函数  在每个点上服从高斯分布:

其中:

  • :均值函数,通常取 (简化计算)。
  • :协方差函数(核函数),常见的选择是 RBF(径向基函数)
  •  控制方差的大小
  •  控制函数的平滑度

高斯过程的预测公式

假设已有  个采样点:

目标是对新点  预测 

已知数据的输出:

协方差矩阵:

新点与已有点的协方差:

新点自身的协方差:

则高斯过程预测的 均值(期望)和方差

  •  代表对  的预测值(代理目标函数)。
  •  代表预测的不确定性(模型的置信度)。

3. 采集函数(Acquisition Function, AF)

采集函数用于决定下一个采样点,即如何在探索和利用之间做权衡。常见的采集函数包括:

期望提升(Expected Improvement, EI)

其中  是当前最佳点。具体计算:

  •  和  是标准正态分布的 CDF 和 PDF。
  •  是探索参数,较大时增加探索。

置信上界(Upper Confidence Bound, UCB)

  •  控制探索和利用的权衡
    •  :更多探索(优先选不确定区域)。
    •  :更多利用(优先选高值点)。

概率提升(Probability of Improvement, PI)

  • 直接选择提升概率高的点。

4. 贝叶斯优化的算法流程

  1. 初始化

  • 选择一组初始点  并计算  。
  • 训练高斯过程(GP)模型。
  • 迭代循环(直到达到预算)

    1. 选择下一个评估点

    2. 计算真实函数值 

    3. 更新数据集 

    4. 更新 GP 代理模型

    5. 返回最优解

    5. 小结

    • 核心思想:使用高斯过程(GP)预测目标函数,并通过采集函数(AF)选择下一个采样点。
    • 代理模型:高斯过程  用来估计目标函数。
    • 采集策略
      • EI:平衡探索和利用,适用于一般优化问题。
      • UCB:适用于控制探索程度的问题( 调节)。
      • PI:倾向于快速找到更优解。

    贝叶斯优化在 计算昂贵的黑盒优化 场景(如超参数调优)中极为有效,比随机搜索、网格搜索更高效!

    贝叶斯优化优缺点

    优点

    • 适用于计算昂贵的问题(如深度学习超参数优化)。

    • 能有效找到全局最优解,避免局部最优陷阱。

    • 利用先验知识(高斯过程)提高采样效率。

    • 在较少查询次数下收敛,比随机搜索、网格搜索更高效。

    缺点

    • 计算复杂度较高(GP 逆矩阵计算为 )。

    • 对高维问题扩展性有限(维度较高时 GP 近似方法如随机特征映射可优化)。

    • 对采集函数敏感(不同 AF 适用于不同问题)。

    • 假设目标函数平滑,在高度不规则的目标函数上可能效果不佳。

    运用贝叶斯优化的前提条件

    1. 目标函数昂贵(单次计算成本高,如深度学习、实验优化)。

    2. 目标函数是黑盒的(无解析表达式、梯度不可得)。

    3. 目标函数是平滑的(适用于 GP 建模)。

    4. 输入空间较低维(通常 <20 维),否则 GP 计算成本高。

    5. 优化预算受限(不能进行大量随机采样)。

    Python案例

    咱们这里使用 贝叶斯优化 解决一个 黑盒函数优化问题

    在这个示例中,我们使用 虚拟数据集,并优化一个复杂的非凸目标函数。代码将:

    1. 定义目标函数(一个复杂的非凸函数)。
    2. 使用贝叶斯优化(BayesianOptimization 库)找到最优解。
    3. 绘制4个分析图像(采样点分布、目标函数优化过程、超参数变化趋势、采样效率)。
    import numpy as np
    import matplotlib.pyplot as plt
    from bayes_opt import BayesianOptimization

    # 目标函数(复杂的非凸函数)
    def black_box_function(x, y):
        return -np.sin(3*x) - x**2 + 0.7*x + np.cos(2*y) + y**2 - 0.5*y

    # 定义贝叶斯优化的边界
    pbounds = {'x': (-22), 'y': (-22)}

    # 初始化贝叶斯优化器
    optimizer = BayesianOptimization(
        f=black_box_function, 
        pbounds=pbounds,
        random_state=42
    )

    # 运行优化
    optimizer.maximize(init_points=10, n_iter=30)

    # 获取优化历史
    x_vals, y_vals, target_vals = [], [], []
    for res in optimizer.res:
        x_vals.append(res["params"]["x"])
        y_vals.append(res["params"]["y"])
        target_vals.append(res["target"])

    # 生成虚拟数据进行可视化
    x_range = np.linspace(-22100)
    y_range = np.linspace(-22100)
    X, Y = np.meshgrid(x_range, y_range)
    Z = black_box_function(X, Y)

    # 绘图
    fig, axes = plt.subplots(22, figsize=(1210))

    # 1. 目标函数等高线 + 采样点分布
    ax1 = axes[00]
    c = ax1.contourf(X, Y, Z, levels=20, cmap='viridis')
    fig.colorbar(c, ax=ax1)
    ax1.scatter(x_vals, y_vals, c='red', marker='o', label='Sampled Points')
    ax1.set_title('Target Function Contour with Sample Points')
    ax1.set_xlabel('x')
    ax1.set_ylabel('y')
    ax1.legend()

    # 2. 优化目标值的变化趋势
    ax2 = axes[01]
    ax2.plot(range(len(target_vals)), target_vals, marker='o', linestyle='-', color='b')
    ax2.set_title('Optimization Progress')
    ax2.set_xlabel('Iteration')
    ax2.set_ylabel('Target Value')
    ax2.grid()

    # 3. 采样点 x, y 的变化趋势
    ax3 = axes[10]
    ax3.plot(range(len(x_vals)), x_vals, marker='s', linestyle='-', label='x', color='r')
    ax3.plot(range(len(y_vals)), y_vals, marker='^', linestyle='-', label='y', color='g')
    ax3.set_title('Sampled Parameter Values Over Iterations')
    ax3.set_xlabel('Iteration')
    ax3.set_ylabel('Parameter Values')
    ax3.legend()
    ax3.grid()

    # 4. 采样点分布的 3D 视图
    from mpl_toolkits.mplot3d import Axes3D
    ax4 = fig.add_subplot(224, projection='3d')
    ax4.plot_surface(X, Y, Z, cmap='plasma', alpha=0.7)
    ax4.scatter(x_vals, y_vals, target_vals, c='black', marker='o')
    ax4.set_title('3D View of Optimization Process')
    ax4.set_xlabel('x')
    ax4.set_ylabel('y')
    ax4.set_zlabel('Target Value')

    plt.tight_layout()
    plt.show()
    1. 目标函数定义:使用一个非凸黑盒函数进行优化。
    2. 贝叶斯优化:用 BayesianOptimization 在 (-2, 2) × (-2, 2) 范围内优化。
    资讯配图
    • 等高线+采样点 (目标函数的形状 + 采样点分布)。
    • 优化目标值趋势 (每次迭代的最优值变化)。
    • 采样点趋势 (x, y 参数随迭代变化)。
    • 3D 视图 (目标函数的 3D 形态 + 采样点)。

    最后

    宝子们,快来领取16大块的内容,124个算法问题的总结,完整的机器学习小册,免费领取~
    资讯配图
    领取:备注「算法小册」即可~
    资讯配图
    围观朋友圈,满满的干货!~