什么是贝叶斯优化(Bayesian Optimization)?
创作时间:
作者:
@小白创作中心
什么是贝叶斯优化(Bayesian Optimization)?
引用
CSDN
1.
https://blog.csdn.net/weixin_44114030/article/details/140802210
贝叶斯优化(Bayesian Optimization)是一种用于函数全局最优化的策略,特别适用于那些计算代价昂贵的黑箱函数(如机器学习模型的超参数调优)。其核心思想是通过构建一个代理模型(通常是高斯过程或随机森林),逐步选择最优的参数,从而有效地找到全局最优解。贝叶斯优化能够在不需要大量计算资源的情况下,有效探索参数空间,具有更高效、更严密的特点。
贝叶斯优化的原理
- 初始采样:
- 随机选择一些参数点,并计算对应的目标函数值。
- 这些点和目标函数值将用于初始化代理模型。
- 构建代理模型:
- 使用高斯过程(Gaussian Process, GP)或随机森林(Random Forest)等方法,构建目标函数的代理模型。高斯过程常用,因为它不仅能预测函数值,还能提供预测不确定性。
- 代理模型优化:
- 使用代理模型预测新的参数点的目标函数值和不确定性。
- 基于这些预测,计算一个采集函数(Acquisition Function),如期望改进(Expected Improvement, EI),上置信界(Upper Confidence Bound, UCB)等。采集函数用来平衡探索(exploration)和开发(exploitation)之间的权衡。
- 探索:选择那些不确定性较大的点,希望发现新的好点。
- 开发:选择那些预计目标函数值较好的点,利用已有信息改进最优解。
- 更新代理模型:
- 在采集函数的指导下选择下一个参数点,计算其目标函数值。
- 将新的数据点加入已有的数据集中,更新代理模型。
- 重复迭代:
- 重复步骤3和4,逐步缩小参数空间,找到最优参数。
- 迭代过程在达到预设的迭代次数或收敛条件时结束。
贝叶斯优化的优势
- 高效性:
- 贝叶斯优化通过代理模型有效地探索参数空间,减少了直接计算目标函数的次数,适合计算昂贵的优化问题。
- 平衡探索与开发:
- 通过采集函数,贝叶斯优化能很好地平衡探索未知区域和利用已知好区域,避免陷入局部最优。
- 不确定性量化:
- 高斯过程能提供预测不确定性,这有助于更好地指导采样过程。
应用领域
贝叶斯优化广泛应用于机器学习中的超参数调优,如:
- 深度学习模型中的超参数调优(学习率、批量大小、网络结构等)。
- 机器学习算法(如支持向量机、随机森林等)的参数设置。
- 强化学习中的策略优化。
总之,贝叶斯优化在处理高维、非凸、计算代价昂贵的优化问题时,提供了一种高效且严密的方法。
示例代码
下面是一段实现贝叶斯优化算法的Python代码,用于优化一个二维目标函数f(x, y) = sin(x) + cos(y)。下面是代码的具体实现步骤及其功能:
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import Matern
from scipy.optimize import minimize
from scipy.stats import norm
# 目标函数:f(x, y) = sin(x) + cos(y)
def objective_function(x):
return np.sin(x[0]) + np.cos(x[1])
# 采集函数:期望改进
def acquisition_function(x, gp, y_max):
mean, std = gp.predict(np.array([x]), return_std=True)
z = (mean - y_max - 0.01) / std
return (mean - y_max - 0.01) * norm.cdf(z) + std * norm.pdf(z)
# 绘制目标函数热力图
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)
plt.figure(figsize=(10, 7))
plt.contourf(X, Y, Z, levels=50, cmap='viridis')
plt.colorbar(label='Objective Function Value')
plt.title('Objective Function Heatmap')
plt.xlabel('x')
plt.ylabel('y')
# 初始化随机采样点
initial_points = np.random.uniform(-5, 5, (5, 2))
initial_values = np.array([objective_function(x) for x in initial_points])
# 高斯过程模型
kernel = Matern(nu=2.5)
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10)
gp.fit(initial_points, initial_values)
# 贝叶斯优化过程
n_iter = 15
for i in range(n_iter):
y_max = max(initial_values)
res = minimize(lambda x: -acquisition_function(x, gp, y_max), x0=np.random.uniform(-5, 5, 2), bounds=[(-5, 5), (-5, 5)])
next_sample = res.x
next_value = objective_function(next_sample)
initial_points = np.vstack((initial_points, next_sample))
initial_values = np.append(initial_values, next_value)
gp.fit(initial_points, initial_values)
plt.scatter(next_sample[0], next_sample[1], c='red')
plt.scatter(initial_points[:, 0], initial_points[:, 1], c='black', label='Samples')
plt.legend()
plt.show()
代码实现步骤及功能
- 导入必要的库:
import numpy as np import matplotlib.pyplot as plt from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import Matern from scipy.optimize import minimize from scipy.stats import norm
- 导入用于数值计算、绘图、构建高斯过程模型和优化的库。
- 定义目标函数:
def objective_function(x): return np.sin(x[0]) + np.cos(x[1])
- 目标函数f(x, y) = sin(x) + cos(y)。
- 定义采集函数:
def acquisition_function(x, gp, y_max): mean, std = gp.predict(np.array([x]), return_std=True) z = (mean - y_max - 0.01) / std return (mean - y_max - 0.01) * norm.cdf(z) + std * norm.pdf(z)
- 采集函数(期望改进):用于选择下一个采样点,平衡探索和开发。
- 绘制目标函数热力图:
x = np.linspace(-5, 5, 100) y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(x, y) Z = np.sin(X) + np.cos(Y) plt.figure(figsize=(10, 7)) plt.contourf(X, Y, Z, levels=50, cmap='viridis') plt.colorbar(label='Objective Function Value') plt.title('Objective Function Heatmap') plt.xlabel('x') plt.ylabel('y')
- 绘制目标函数在二维参数空间中的热力图。
- 初始化随机采样点:
initial_points = np.random.uniform(-5, 5, (5, 2)) initial_values = np.array([objective_function(x) for x in initial_points])
- 随机选择一些初始采样点,并计算其目标函数值。
- 构建高斯过程模型:
kernel = Matern(nu=2.5) gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10) gp.fit(initial_points, initial_values)
- 使用高斯过程回归模型拟合初始采样点及其目标函数值。
- 贝叶斯优化过程:
n_iter = 15 for i in range(n_iter): y_max = max(initial_values) res = minimize(lambda x: -acquisition_function(x, gp, y_max), x0=np.random.uniform(-5, 5, 2), bounds=[(-5, 5), (-5, 5)]) next_sample = res.x next_value = objective_function(next_sample) initial_points = np.vstack((initial_points, next_sample)) initial_values = np.append(initial_values, next_value) gp.fit(initial_points, initial_values) plt.scatter(next_sample[0], next_sample[1], c='red') plt.scatter(initial_points[:, 0], initial_points[:, 1], c='black', label='Samples') plt.legend() plt.show()
- 迭代优化过程:
- 每次迭代中,基于当前模型选择下一个采样点。
- 计算新采样点的目标函数值。
- 更新采样点和对应的目标函数值。
- 重新拟合高斯过程模型。
- 将新采样点绘制在热力图上(红色点表示新的采样点,黑色点表示所有采样点)。
- 采集函数最小化:选择最大期望改进的点作为下一个采样点。
结果
这个热力图展示了目标函数(f(x, y) = sin(x) + cos(y))在二维空间中的值分布。以下是图中的一些要点及其与代码的关系:
热力图的解释
- 颜色表示目标函数值:
- 颜色从紫色到黄色,表示目标函数值从低到高。紫色区域表示目标函数值较低的区域,而黄色区域表示目标函数值较高的区域。
- 图右侧的颜色条显示了目标函数值的范围,从大约-1.92到1.92。
- 坐标轴:
- x轴和y轴分别表示参数x和y的取值范围,从-5到5。
- 这个范围内的每个点都有一个对应的目标函数值f(x, y),其大小由图中的颜色表示。
- 采样点:
- 图中的黑色点表示采样点,即在优化过程中实际计算了目标函数值的点。
- 初始的几个采样点是随机选择的,而后续的采样点是通过贝叶斯优化过程选择的。
代码的解释与图结合
代码通过以下步骤生成了这个热力图并选择采样点:
- 目标函数的热力图:
- 代码生成了一组x和y值的网格(通过np.meshgrid),并计算了每个网格点的目标函数值sin(x) + cos(y)。
- 使用plt.contourf绘制目标函数值的等高线图,颜色表示目标函数值的大小。
- 初始化随机采样点:
- 初始采样点通过np.random.uniform在范围[-5, 5]内随机生成,代码中的initial_points和initial_values保存了这些点及其对应的目标函数值。
- 图中的一些黑色点表示这些初始采样点。
- 高斯过程模型拟合和更新:
- 使用高斯过程回归模型拟合初始采样点及其目标函数值。
- 在每次迭代中,通过最小化采集函数(期望改进函数)选择下一个采样点,这个采样点是优化过程中认为可能改进最大的点。
- 采样点的可视化:
- 在每次新的采样点被选择并计算其目标函数值后,代码通过plt.scatter将新的采样点绘制在图上(红色点)。
- 最后使用黑色点(plt.scatter(initial_points[:, 0], initial_points[:, 1], c='black', label='Samples'))表示所有采样点。
总结
- 热力图展示了目标函数在二维空间中的值分布。
- 黑色点表示在贝叶斯优化过程中计算目标函数值的采样点。
- 贝叶斯优化过程通过代理模型(高斯过程)逐步选择新的采样点,以高效找到目标函数的全局最优解。
- 通过可视化,可以直观地看到采样点如何逐步分布在目标函数的高值区域。
- 代码通过贝叶斯优化算法在目标函数的二维参数空间中逐步逼近最优值。
- 初始随机采样点经过高斯过程模型的拟合和采集函数的引导,逐步找到目标函数的最优解。
- 可视化部分展示了采样点如何逐步逼近最优区域。
通过这个过程,贝叶斯优化有效地减少了目标函数评估次数,同时能够在计算代价昂贵的情况下找到全局最优解。
热门推荐
房贷还款方式选择对月供的影响及优劣比较
印花工艺专业知识
财务人员培训的目的:提升企业核心竞争力的关键
颅底肿瘤患者眼球运动颅神经麻痹的预后
男童幼儿园午睡猝死 孩子怎么睡更健康
Nginx 配置 SSL(HTTPS)详解
虚短与虚断概念详解:运放电路中的重要现象
《死侍 1》:打破常规的超级英雄喜剧
杨门女将十大高手,穆桂英第二,杨八姐第九,花解语杜金娥第几?
掌握情绪转移与变化训练,让生活更加自如
京剧脸谱:传承东方美
5G正交频分复用(OFDM):无线通信的核心技术
什么是CN2 GT?什么是CN2 GIA?CN2 GT和CN2 GIA区别详解
刻蚀技术解析:半导体制造的关键步骤
企业安全生产责任制度范本
PDA扫码仪的原理特点及应用场景(详解)
十种用于更年期综合征的中成药
硒酵母和硒元素具有哪些功效和作用
机电经理如何管理项目
节日外出游玩走多了脚跟痛?专家教你这几个动作可以缓解哦~
持续腹泻怎么办?这份处理和预防指南请收好
清华大学曲钧天/浙大李铁风AISY:水下软体机器人最新研究进展
如何查看和分析股息记录?这些股息记录对投资决策有什么参考价值?
合同文件电子化:法律合规与实践指南
健身房减脂计划全攻略:从运动到饮食的全方位指南
格陵兰岛:世界第一大岛的地缘政治博弈
亚索800训练法:最简单粗暴的马拉松提效训练
Excel不识别DATEDIF函数怎么办?原因分析与解决方案
平板电脑储存照片哪个好用?一文详解选购要点
车贷逾期车被拖走了被卖掉合法吗