浏览器|腾讯QQ浏览器2021AI算法大赛,北大冠军团队经验分享,附详细代码( 二 )


参赛者需要提交超参数生成的算法代码 , 算法每一轮需要提供一组超参数 , 裁判程序会返回超参数对应的 reward 。 参赛者的算法要求在限定的迭代轮次和时间内 , 找到 reward 尽可能大的一组超参数 , 最终按照找到的最大 reward 来计算排名 。
针对该赛题 , 优化器需要在每轮以同步并行方式推荐 5 个超参数配置 , 共执行 20 轮推荐 , 即总共搜索 100 个超参数配置 。 对每个超参数配置均执行完整资源的验证 , 并且在比赛的问题抽象中 , 不同超参数的验证时间相同 。
根据现有研究 , 贝叶斯优化是超参数优化(黑盒优化)问题上 SOTA 的方法 , 而且比赛场景中的超参数空间维度不超过 6 维 , 并非超高维问题 , 较适合贝叶斯优化方法 , 因此我们选定贝叶斯优化作为初赛的搜索算法 。 另外 , 问题中所有的超参数均为连续型(离散浮点型)超参数 , 这决定了我们的超参数空间定义方法、贝叶斯优化代理模型以及优化器的选择 , 接下来也将分别进行介绍 。
算法核心技术——贝叶斯优化模块介绍
贝叶斯优化简介
超参数优化是典型的黑盒优化问题 , 即对于目标函数(超参数 - 奖励函数) , 具体表达式或导数信息是不可知的 , 只能通过尝试输入获取输出来推测目标函数的内部情况 。
贝叶斯优化是解决黑盒优化问题的一个迭代式框架 , 优化流程包括如下步骤:

  1. 使用代理模型(surrogate model)对已有观测历史数据(尝试过的超参数和对应的奖励)进行建模拟合;
  2. 使用采集函数(acquisition function)评估搜索空间内的超参数 , 平衡探索与利用 。 对采集函数执行优化 , 找到验证价值最大(使采集函数值最大)的下一组超参数;
  3. 在目标函数上评估超参数 , 得到奖励;
  4. 将新评估的超参数和结果加入观测历史数据 , 重复以上步骤 。
注:以下代码分为文字版和图示版 , 代码以图示版为准 。
贝叶斯优化算法封装在 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 # 依据并行算法 , 得到下一轮需要验证的超参数

推荐阅读