在优化领域,贝叶斯优化作为一种强大的工具,正发挥着越来越重要的作用。它为解决复杂的黑盒函数优化问题提供了高效的途径,尤其在计算成本高昂的场景中表现出色。
首先,咱们来说说基本的定义,贝叶斯优化是一种用于黑盒函数优化(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 形态 + 采样点)。
需要贝叶斯算法 的同学,请看主页简介哦~