讲透一个强大算法模型,贝叶斯优化!!
- 2025-07-25 17:15:00
哈喽,大家好~
昨天有同学提到了贝叶斯优化,思来想去,还是出一期,和大家一起讨论一下,大家有任何问题,评论区留言~
首先,咱们来说说基本的定义,贝叶斯优化是一种用于黑盒函数优化(Black-Box Optimization)的全局优化方法,特别适用于计算昂贵的目标函数。
贝叶斯优化基于贝叶斯定理,通过构建代理模型(通常是高斯过程,Gaussian Process, GP) 来对目标函数进行建模,并利用采集函数(Acquisition Function)来指导采样,从而高效地寻找全局最优解。
适用于高维、不可导、非凸、计算成本高的优化问题,广泛应用于机器学习超参数调优、实验设计、强化学习、A/B测试等领域。
你可以想象一下,如果想要找到全城最好吃的拉面店,但你不能一家家吃过去(因为时间和金钱成本太高)。贝叶斯优化就是一种很聪明的策略,帮助你在尽可能少的尝试下找到最佳选择。
1. 代理模型(高斯过程)
“吃了一些店后,估计其它店的味道”
你先随机选几家店试吃,并给它们评分。 你会根据这些评分,估计没吃过的店大概是什么水平(比如同一个商圈的店可能都不错)。 这就像贝叶斯优化中的高斯过程(Gaussian Process, GP),它会用已有的数据来预测未知区域的可能值,并且提供不确定性估计。
2. 采集函数(Acquisition Function)
“去哪家试吃最划算”
你不想浪费时间,所以每次选下一家店时要有策略: 选看起来可能很好吃的店(探索潜在最优解)。 选那些大家评价不一的店(不确定性大),因为可能是被低估的宝藏店(探索新区域)。 避免试吃太多已经很明确的店,因为已经知道它们味道了(减少重复采样)。 这就类似贝叶斯优化中的采集函数(Acquisition Function),它会平衡探索(Exploration)和利用(Exploitation),决定下一个要测试的点。
3. 逐步逼近最优解
你根据这个策略不断试吃,并更新自己的“预测模型”。 经过几轮尝试后,你就能找到最有可能是全城最好吃的拉面店,而不用把所有店都试吃一遍。 这正是贝叶斯优化的核心:**用最少的试验次数,找到最优解!
总结贝叶斯优化的核心思想是:
用高斯过程(GP)来预测未知区域的表现,减少不必要的计算。 用采集函数(Acquisition Function)决定下一个采样点,在探索和利用之间做权衡。 不断更新模型,逐步逼近全局最优解,最终找到最优值。
贝叶斯优化适用于那些计算代价昂贵的优化问题,比如神经网络超参数调优,比起暴力搜索或随机搜索,贝叶斯优化能更快、更智能地找到最佳结果。
理论基础
贝叶斯优化(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. 贝叶斯优化的算法流程
初始化:
选择一组初始点 并计算 。 训练高斯过程(GP)模型。
迭代循环(直到达到预算):
选择下一个评估点:
计算真实函数值 。
更新数据集 。
更新 GP 代理模型。
返回最优解:
5. 小结
核心思想:使用高斯过程(GP)预测目标函数,并通过采集函数(AF)选择下一个采样点。 代理模型:高斯过程 用来估计目标函数。 采集策略: EI:平衡探索和利用,适用于一般优化问题。 UCB:适用于控制探索程度的问题( 调节)。 PI:倾向于快速找到更优解。
贝叶斯优化在 计算昂贵的黑盒优化 场景(如超参数调优)中极为有效,比随机搜索、网格搜索更高效!
贝叶斯优化优缺点
优点
适用于计算昂贵的问题(如深度学习超参数优化)。
能有效找到全局最优解,避免局部最优陷阱。
利用先验知识(高斯过程)提高采样效率。
在较少查询次数下收敛,比随机搜索、网格搜索更高效。
缺点
计算复杂度较高(GP 逆矩阵计算为 )。
对高维问题扩展性有限(维度较高时 GP 近似方法如随机特征映射可优化)。
对采集函数敏感(不同 AF 适用于不同问题)。
假设目标函数平滑,在高度不规则的目标函数上可能效果不佳。
运用贝叶斯优化的前提条件
目标函数昂贵(单次计算成本高,如深度学习、实验优化)。
目标函数是黑盒的(无解析表达式、梯度不可得)。
目标函数是平滑的(适用于 GP 建模)。
输入空间较低维(通常 <20 维),否则 GP 计算成本高。
优化预算受限(不能进行大量随机采样)。
Python案例
咱们这里使用 贝叶斯优化 解决一个 黑盒函数优化问题。
在这个示例中,我们使用 虚拟数据集,并优化一个复杂的非凸目标函数。代码将:
定义目标函数(一个复杂的非凸函数)。 使用贝叶斯优化(BayesianOptimization 库)找到最优解。 绘制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': (-2, 2), 'y': (-2, 2)}
# 初始化贝叶斯优化器
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(-2, 2, 100)
y_range = np.linspace(-2, 2, 100)
X, Y = np.meshgrid(x_range, y_range)
Z = black_box_function(X, Y)
# 绘图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 1. 目标函数等高线 + 采样点分布
ax1 = axes[0, 0]
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[0, 1]
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[1, 0]
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(2, 2, 4, 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()
目标函数定义:使用一个非凸黑盒函数进行优化。 贝叶斯优化:用 BayesianOptimization
在(-2, 2) × (-2, 2)
范围内优化。

等高线+采样点 (目标函数的形状 + 采样点分布)。 优化目标值趋势 (每次迭代的最优值变化)。 采样点趋势 (x, y 参数随迭代变化)。 3D 视图 (目标函数的 3D 形态 + 采样点)。
最后



- 点赞 (0)
-
分享
微信扫一扫
-
加入群聊
扫码加入群聊