算法核心技术——贝叶斯优化模块介绍
贝叶斯优化简介
超参数优化是典型的黑盒优化问题 , 即对于目标函数(超参数 - 奖励函数) , 具体表达式或导数信息是不可知的 , 只能通过尝试输入获取输出来推测目标函数的内部情况 。
贝叶斯优化是解决黑盒优化问题的一个迭代式框架 , 优化流程包括如下步骤:
- 使用代理模型(surrogate model)对已有观测历史数据(尝试过的超参数和对应的奖励)进行建模拟合;
- 使用采集函数(acquisition function)评估搜索空间内的超参数 , 平衡探索与利用 。 对采集函数执行优化 , 找到验证价值最大(使采集函数值最大)的下一组超参数;
- 在目标函数上评估超参数 , 得到奖励;
- 将新评估的超参数和结果加入观测历史数据 , 重复以上步骤 。
贝叶斯优化算法封装在 OpenBox 系统中 , 代码实现的主要流程如下:
# 使用贝叶斯优化得到超参数配置推荐
def get_suggestions(self, history_container, batch_size):
# ...
# 基于观测历史数据 , 训练贝叶斯优化代理模型
self.surrogate_model.train(X, Y)
# ...
# 更新采集函数(使用EI函数时 , 要更新当前最优观测值)
self.acquisition_function.update(eta=incumbent_value, ...)
# 使用优化器优化采集函数 , 得到使采集函数值最大的一个(一组)超参数
challengers = self.optimizer.maximize(...)
# ...
return batch_configs_list # 依据并行算法 , 得到下一轮需要验证的超参数
文章图片
代码以图示为准
超参数空间定义
首先 , 我们使用 ConfigSpace 库 [4] 定义超参数空间 。 由于赛题中的超参数均为离散浮点型 , 并可近似为等间距分布 , 因此使用 Int 型定义超参数(本质上和使用 Float 定义相同 , 但避免了赛题中超参数取值范围边缘可能出现不同间距的问题) 。 在 ConfigSpace 库中 , Float 型和 Int 型超参数均被视作连续型 , 在执行优化时会自动将参数范围缩放至[0, 1] 。
初始化方法
贝叶斯优化需要一定数量的历史数据才能启动 , 我们使用了一种贪心法生成初始超参数配置 。 该方法从随机候选配置中 , 逐步挑选距离已有配置最远的配置加入初始配置集合 。 使用该方法进行初始化能更好地探索超参数空间 , 经测试效果稍好于完全随机初始化方法 。 初始化配置数设置为 10 个 。 该方法集成在 OpenBox 系统中 , 可通过 init_strategy="random_explore_first" 调用 。
代理模型
贝叶斯优化中的代理模型(surrogate model)有多种选择 , 包括高斯过程(Gaussian process)、概率随机森林(probabilistic random forest)、Tree Parzen Estimator(TPE)等 , 其中高斯过程在连续超参数空间上(如数学问题)优化效果较好 , 概率随机森林在含有分类超参数的空间上优化效果较好 。 本次比赛只包含连续型超参数 , 经测试 , 高斯过程作为代理模型效果最好 。 高斯过程使用 OpenBox 系统默认的 Matern5/2 核 , 核超参数通过最大似然 (maximize log likelihood) 得到 。
采集函数与优化
我们使用常用的 Expected Improvement(EI)函数作为贝叶斯优化的采集函数(acquisition function) 。 在优化采集函数时 , 我们使用系统中的 "random_scipy" 优化器 。 该优化器在结合局部搜索与随机采样的基础上 , 使用 L-BFGS-B 算法对采集函数执行优化 。 测试表明 , 相较于单纯使用随机采样 , 该方法能对采集函数进行更为充分的优化 , 从而更大程度发挥 GP 模型和 EI 函数的潜能 。
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
