Bayesian Optimization
文章目录
参考
- 贝叶斯条件概率
- 贝叶斯优化方法和应用综述
Exploring Bayesian Optimization
- 许多英文资料和实现库
调参优化算法有哪些
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化 - 算法金「全网同名」…
- 网格搜索
- 随机搜索
- 贝叶斯优化
遗传算法
- 工具 python deap 包:python 进化算法框架 DEAP_python deap库-CSDN博客
多目标优化 Multi-Object Optimization
贝叶斯优化实现库
- skopt: GitHub - scikit-optimize/scikit-optimize: Sequential model-based optimization…
- optuna: GitHub - optuna/optuna: A hyperparameter optimization framework
- hyperopt: GitHub - hyperopt/hyperopt: Distributed Asynchronous Hyperparameter Optimizat…
- bayesopt: GitHub - hyperopt/hyperopt: Distributed Asynchronous Hyperparameter Optimizat…
贝叶斯优化理论学习
贝叶斯优化流程:
选定代理模型
- 代理模型:就是一个对真实目标事物模拟(黑盒函数/真实世界的实验/被模拟的函数)的一个算法或者模型,输入到输出的映射,可以是机器学习模型、神经网络、高斯过程函数等等
获取不确定性
- 对于代理函数的输出要有不确定性数据,例如:
期望和方差
- 对于代理函数的输出要有不确定性数据,例如:
使用采集函数查找下一个优化点
- 使用代理模型的输出和不确定性数据,来计算下一个优化点在哪里
优化点值的计算
对目标事物执行计算
例如:
- 实验:把找到的优化参数,代入化学实验,做实验,得到实验结果
- 被拟合的真实函数或黑盒函数:把得到的优化点 X,代入黑盒函数 f(x), 求出结果 y
- 把输出结果(X,y)和其他训练数据代入代理模型训练,开启下一轮贝叶斯优化
贝叶斯优化组件:
概率代理模型(probabilistic surrogate model)
实际包括两个小模型
先验概率模型(prior)- p(Bi)
观测模型- 作用:模拟真实目标函数
- 即:
似然分布p(A|Bi), (likelihood) - 即各处参数 X,可以评估得到结果 y
采集函数(acquisition function)
- 使用了后验概率分布
作用:
根据
后验概率(posterior)计算下一个最合适的样本采集点- 注:后验概率可以通过
后验概率:- P(Bi|A)
- 已知结果 A,是输入事件 Bi 的概率
真实函数的执行(采样)
- 采集函数计算出
采样点后,执行真实函数计算
- 采集函数计算出
贝叶斯优化需由考虑的问题:
- 不确定区域的探索和已知区域有更好结果的区域探索(挖黄金例子)
挖黄金例子解析
参考:
辨析两个任务目标
探查黄金在地底的分布曲线
- 目标:整个曲线的模拟
- 适合场景:
类似主动学习
探查哪里黄金最多
- 不需要知道所有位置的黄金分布密度
- 只关心哪里黄金最多,即:最优点(最大值点)搜索
- 目标:最优先搜索
- 适合场景:
贝叶斯优化
相关词汇
Active learning
- 主动学习
序贯决策
- 即,动态决策
似然
- likelihood
- 确定的结果下去推测产生这个结果的可能环境(参数)
参考
似然就是假设
- 假设是可以有很多种的
- 而概率,是实际所有可能结果的总和情况
概率
- probability
- 概率是在特定环境下某件事情发生的可能性,也就是结果没有产生之前依据环境所对应的参数来预测某件事情发生的可能性。
全概率公式
- 根据子事件的概率和子事件下复杂时间的条件概率,求复杂事件的全概率
贝叶斯概率公式(
条件概率)作用:
- 知道结果,求原因(由果求因)
参考:
- 根据全概率,求复杂事件下子事件的条件概率
- 复杂事件(A),是已知结果
- 子事件 (Bi),是可能的原因
- P(Bi), 是原因发生的概率, 也叫做
先验概率 - P(A|Bi) 是原因发生的条件下,结果发生的概率, 也叫
似然 - P(A), 总概率(全概率公式可以求出)
- P(Bi|A), 已知结果,原因发生的概率,也叫做
后验概率
共轭分布
输入空间
- 子事件 B 的取值范围
观测空间
- 复杂事件 A 的取值范围
- 超参数空间
先验概率
- 子事件概率 P(B)
- 英语:
prior
后验概率
- P(B|A)
- 英语:
posterior
采集函数- acquisition function
- 贝叶斯优化的采集函数
作用:
- 用来评估一个点是否是,最想要评估的点(挖黄金例子:挖掘探测)
特点:
- 每次“探测”后都要“更新”采集函数
概率代理模型
- 一个贝叶斯模型
作用:
- 一个用来表示每个点的不确定性
- 用来模拟真实目标函数
特点:
- 每次“探测”后都要“更新”模型
argmax 函数
作用:
- 求当目标函数 $\alpha(x)$ 取得最大值时,自变量 x 的点集
CDF
- cumulative distribution function (概率)累计分布函数
PDF
- probability distribution(density) function 概率(密度)分布函数
高斯过程
- Gaussian Process
高斯过程 Vs 多元高斯分布
参考: Is Gaussian Process just a Multivariate Gaussian Distribution? - Cross Validated
- 多元高斯分布: 多参数的高斯分布,这里的参数是取值有限的变量(离散取值)
- 高斯过程: 多参数(连续变化)的随机(高斯)分布
- 注:元就是未知数(参数)
参考:
协方差
- covariance
- 参考: 协方差详解-CSDN博客
方差
- variance
偏差
- bias
深度学习算法 + 贝叶斯优化
bayesian-optimization, bayes_opt 库使用说明
使用方法(流程)
自动探测
写一个自动执行黑盒函数的方法,探索过 minimize() 自动开始优化,找到最大的 (X,ymax)
- 使用 optimzer.minimize(init_points, n_tries)
全手动 suggest + evaluate + register 流程
参考:
流程:
suggest: 生成探测点,获得 X
- 注意:第一次 suggest 时,因为没有缓存的数据,不会发生高斯过程训练,第二次以后会触发
高斯过程训练
- 注意:第一次 suggest 时,因为没有缓存的数据,不会发生高斯过程训练,第二次以后会触发
evaluate: 手动执行获取结果 y
- 执行黑盒函数,y = blackbox_fun(X)
- 手动做实验, 使用实验参数 X 做实验,获得结果 y
- register: 把探测的结果 (X, y) 注册到 optimizer
离散型输入参数处理方法
内部高斯过程模型调参
采集函数 acquisition_function 的选择
参考:
Exploitation vs Exploration — Bayesian Optimization documentation
- exploitation: 开发,趋向于在已有最大值附近探测
- exploitation: 探索,趋向于在别的地方接着探测,而不是在已有最大值附近
ucb 函数(置信上界, upper confident bound):
- 偏向开发:kappa = 0.1 –>
exploitation - 偏向探索:kappa = 10 –>
exploration
- 偏向开发:kappa = 0.1 –>
ei 函数(期望提升, expected improvement)
- 偏向开发: xi =0 (1e-4)
- 偏向探索: xi = 0.1
poi 函数(Probility of Improvement)
- 偏向开发: xi =0 (1e-4)
- 偏向探索: xi = 0.1
探测点的获取
两种方式:
使用
init_points创建的,存储在optimizer._queue中的点- 注意:这些点没有被存放在 optimizer._space._params 中, 在调用 optimizer.probe(params) 之后才会存储到 self._space._params 和 self._space._target 中
通过采集函数获取的点,获得方法:
optimizer.suggest(acquisition_function)作用:
如果 optimizer._space.params 不为空(即有训练数据)
- 把现有的所有数据( _space._params, _space._target),用来训练高斯过程模型
使用
采集函数和概率代理模型(高斯过程)生成下一个最优的探测点- 调用了
bayes_opt.util.acq_max(...)函数选择最最优点
- 调用了
params 为空:
- 随机生成一个 target_function 的输入参数(一个 params)
optimizer, BayesianOptimization 类,优化器
init_points 参数
作用:
- 用来创建 init_points 个随机产生的输入参数点 self._space._params
注意:
init_points 指定的个数通过 self._prime_que(init_points) 来创建 params
- 但是这些 params 还没有被执行,需要使用 self.probe(param) 来获取对应的 target
用到的地方:
| |
_queue 探测点队列
作用:
- 存储用来探测的数据点
lazy 模式下:
- self.probe(x_probe) 存起来的点
数据来源:
- init_points 参数规定,并使用 self._space 随机生成的
optimizer.probe(x_probe)
x_probe: 就是各个地方说的 params, 给一个店的输入参数
作用:
调用 self._space.probe(x_probe)
- 黑盒函数执行,获取对应的结果 (target)
- 把(params, target)(一个点的 X,y)存储到 self._space 保存起来
optimizer.suggest()
作用:
- 如果 optimizer._space 生成随机输入参数点(params) 中没有存储 params, 生成一个看
如果 optimizer._space 己经存储了参数点(一般是 optimzer.probe(params) 存进去的)
- 训练一遍高斯过程函数, optimzer._gp
获取下一个 取得最大值的 params
搜索 params 定义域
acq_max()函数- 高斯过程训练好的模型
- 采集函数
- ymax
- params bounds 等
acq_max 搜索 target 取最大值的 params 的方法
使用了两种方法搜索取得 target 最大的的 params
在定义域使用均匀分布获取 n_warmup(默认 10000) 个随机值
- 通过 aquisition_function 计算比较求得最大值
通过 scipy.optimize.minimize(acquisition_function) 寻找最大值
- 通过尝试 n 个 随机 x0, 找 n 次
TargetSpace
optimizer._space: 用来存储参数的 pbounds 和 target_function 等信息
属性:
- target: target_function 输出值
- param: target_function 输入参数
- target_function: 黑盒函数
方法:
- self._as_array(params: dict) -> array
self.probe(params: dict) -> target_value
- 黑盒函数执行把 params 作为输入参数执行,并加入到 self._params, self._target 中,用来做训练
self.__len__:- 长度,存储的数据点的数量
作用:
- 更具 pbounds(上下限), target(参数的名称)等信息生成随机入参数据点
文章作者
上次更新 2025-02-24 (77fafc9)