华为诺亚方舟实验室开源了一个贝叶斯优化+RL的仓库,里面包括几部分:
贝叶斯研究
(1)HEBO:异方差进化贝叶斯优化 HEBO: Heteroscedastic Evolutionary Bayesian Optimisation
(2)T-LBO:基于变分自编码器和深度度量学习的高维贝叶斯优化 High-Dimensional Bayesian Optimisation with Variational Autoencoders and Deep Metric Learning. 介绍了一种基于深度度量学习的方法,使用变分自编码器(ves)在高维结构化输入空间上执行贝叶斯优化。
(3)BOiLS:逻辑综合的贝叶斯优化 BOiLS: Bayesian Optimisation for Logic Synthesis (DATE22 conference)在逻辑综合过程中优化电路的结果质量(QoR)是一项艰巨的挑战,需要探索指数级大小的搜索空间。这是第一个采用现代贝叶斯优化来导航综合操作空间的算法。
(4) 贝叶斯优化与组合优化器 Are we Forgetting about Compositional Optimisers in Bayesian Optimisation? (JMLR conference)贝叶斯优化为全局优化提供了一种样本效率方法。在这个框架中,一个决定性能的关键子例程是获取函数的最大化,由于获取函数往往是非凸的,因此优化起来是非平凡的,这使得任务变得复杂。在本文中,我们对获取函数最大化的方法进行了全面的实证研究。
(5)AntBO:结合贝叶斯优化的抗体设计 AntBO: Towards Real-World Automated Antibody Design with Combinatorial Bayesian Optimisation.抗体是规范的y型多聚体蛋白质,具有高度特异性的分子识别能力。位于抗体可变链末端的CDRH3区域在抗原结合特异性中占主导地位。然而,CDRH3序列空间的组合性质使其不可能彻底和有效地寻找最佳结合序列。我们提出了AntBO:一种组合贝叶斯优化框架,可有效地实现CDRH3区域的硅片设计。强化学习研究
(1)Sauté RL: Almost Surely Safe RL Using State Augmentation. 几乎肯定地(或概率为1)满足安全约束对于在现实应用中部署强化学习(RL)是至关重要的。例如,理想情况下,飞机降落和起飞的概率应为1。我们通过引入安全增强(Saute)马尔可夫决策过程(MDPs)来解决这个问题,其中通过将安全约束增强到状态空间并重塑目标来消除安全约束。我们证明Saute MDP满足Bellman方程,使我们更接近于在约束几乎肯定满足的情况下求解Safe RL。
(2)Enhancing Safe Exploration Using Safety State Augmentation. 安全探索是无模型强化学习(RL)中一个具有挑战性和重要意义的问题。通常安全成本是稀疏的和未知的,这不可避免地导致约束违反——这是在安全关键应用程序中最好避免的现象。我们通过用安全状态来增加状态空间来解决这个问题,当且仅当约束被满足时,安全状态是非负的。该状态的值也作为约束违反的距离,其初始值表示可用的安全预算。这一思想使我们能够推导出在培训期间安排安全预算的政策。我们将我们的方法称为Simmer(用于RL的安全策略改进)。我们将这一思想应用于两个安全的RL问题:对平均成本施加约束的RL和对概率为1的成本施加约束的RL。
(3)Model-Based Offline Reinforcement Learning with Pessimism-Modulated Dynamics Belief (NeurIPS22 conference)基于模型的离线强化学习(RL)旨在利用以前收集的静态数据集和动态模型,找到高回报的策略。动态模型的泛化能力在重用静态数据集的同时,如果利用得当,有望促进策略学习。为此,一些研究提出量化预测动态的不确定性,并明确地将其应用于惩罚奖励。然而,由于动态和奖励在MDP背景下是本质不同的因素,通过奖励惩罚来表征动态不确定性的影响可能会在模型利用和风险规避之间产生意想不到的权衡。在这项工作中,我们相反地在动态上保持信念分布,并通过信念中的有偏见抽样来评估/优化政策。基于离线RL的交替马尔可夫对策公式推导了偏向悲观的抽样程序。
HEBO github & paper
仓库地址:https://github.com/huawei-noah/HEBO
其中河伯是NeurIPS 2020 Black-Box Optimisation Challenge的冠军解决方案
HEBO仓库宣称的特性
- 连续、整数和分类的设计参数。 Continuous, integer and categorical design parameters.
- 约束和多目标优化。 Constrained and multi-objective optimsation.
- 上下文optimsation。Contextual optimsation.
- 多个代理模型包括GP, RF和BNN。 Multiple surrogate models including GP, RF and BNN.
- 模块化和灵活的贝叶斯优化构建块。Modular and flexible Bayesian Optimisation building blocks.
Paper:HEBO: Heteroscedastic Evolutionary Bayesian Optimisation
- Motivation:赢得了NeurIPS 2020黑箱优化比赛。
- Method:提出了对 surrogate model 和 acquisition maximisation process 的非常规修改,结果显示这样的组合优于所有基线提供 Bayesmark包。最后,做了消融实验,分析有效trick
(1)对surrogate model的修改:增加了输入的wraping,降低非平稳性;增加了输出的transform,使得目标函数的异质的高斯噪声可以转化为同质的高斯噪声。
(2)对于acquisition function的修改:同时使用贝叶斯的3种acquisition function,包括EI、PI、UCB(或LCB),作为多目标优化的3个目标,提出multi object acquisition function。 - Background:黑盒优化有很多挑战巴拉巴拉,反正贝叶斯对于无导数的优化挺擅长的。介绍了一下贝叶斯优化的Surrogate Model 和 Acquisition Functions
- Contribution:在贝叶斯优化的两个过程中都做了一些修改,使用的是几十年前用过的一些方法的结合,取得不错的效果,获得了比赛第一,调研了一些消融实验确认创新点可以取得收益。
GitHub doc
- 安装
pip install hebo
- Space 定义:目前支持类型:int,实数num,在对数空间变化的实数pow,bool,离散cat
import torch
from hebo.design_space.design_space import DesignSpace
params = [
{'name' : 'hidden_size', 'type' : 'int', 'lb' : 16, 'ub' : 128},
{'name' : 'batch_size', 'type' : 'int', 'lb' : 16, 'ub' : 128},
{'name' : 'lr', 'type' : 'pow', 'lb' : 1e-4, 'ub' : 1e-2, 'base' : 10},
{'name' : 'use_bn', 'type' : 'bool'},
{'name' : 'activation', 'type' : 'cat', 'categories' : ['relu', 'tanh','sigmoid']},
{'name' : 'dropout_rate', 'type' : 'num', 'lb' : 0.1, 'ub' : 0.9},
{'name' : 'optimizer', 'type' : 'cat', 'categories' : ['sgd', 'adam', 'rmsprop']}
]
space = DesignSpace().parse(params)
space.sample(5) # 随机抽样,返回一个pandas
# 实际上在hebo内部会将所有类型的数据都转化为torch.FloatTensor或torch.LongTensor
- Optimisation 优化器
from hebo.optimizers.hebo import HEBO
from hebo.optimizers.bo import BO # 具有LCB采样的基本BO
hebo_seq = HEBO(space, model_name = 'gpy', rand_sample = 4)
for i in range(64):
rec_x = hebo_seq.suggest(n_suggestions=1) # n_suggestions可以决定每次采样多少个点来并行评估
hebo_seq.observe(rec_x, obj(rec_x)) # obj是目标函数
if i % 4 == 0:
print('Iter %d, best_y = %.2f' % (i, hebo_seq.y.min()))
conv_hebo_seq = np.minimum.accumulate(hebo_seq.y) # 获取所有结果,用于绘图
- Tuning sklearn esitmator 直接做黑盒优化
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score, mean_squared_error
from hebo.sklearn_tuner import sklearn_tuner
space_cfg = [
{'name' : 'max_depth', 'type' : 'int', 'lb' : 1, 'ub' : 20},
{'name' : 'min_samples_leaf', 'type' : 'num', 'lb' : 1e-4, 'ub' : 0.5},
{'name' : 'max_features', 'type' : 'cat', 'categories' : ['auto', 'sqrt', 'log2']},
{'name' : 'bootstrap', 'type' : 'bool'},
{'name' : 'min_impurity_decrease', 'type' : 'pow', 'lb' : 1e-4, 'ub' : 1.0},
]
X, y = load_boston(return_X_y = True)
result = sklearn_tuner(RandomForestRegressor, space_cfg, X, y, metric = r2_score, max_iter = 16)
print(result) #打印结果 {'最大深度':15, 'min_samples_leaf':0.00011814573477638075, 'max_features':'log2', '引导程序':假, 'min_impurity_decrease':0.00010743041070558209}
- Advanced optimisation 高级优化(优化带约束的多目标函数)
from pymoo.factory import get_problem
problem = get_problem("zdt1", n_var = 5) # pymoo的多目标基准函数
dim = problem.n_var # 优化维度
num_obj = problem.n_obj # 优化的目标数量
num_constr = problem.n_constr # 优化的约束数量
from hebo.optimizers.general import GeneralBO #在这之前还有很多别的配置,建议直接看HEBO官方文档,下方仅截取核心代码
opt = GeneralBO(space, num_obj, num_constr, model_conf = conf)
for i in range(50):
rec = opt.suggest(n_suggestions=4)
opt.observe(rec, obj(rec))
# 可以通过绘图发现HEBO得到的帕累托前沿比随机搜索更好
- High-dimensional optimisation via random linear embedding 将随机嵌入与HRBO结合,进行高维优化(实际上解决的还是低内在维度的问题)
from hebo.benchmarks.synthetic_benchmarks import BraninDummy
from hebo.optimizers.hebo_embedding import HEBO_Embedding
prob = BraninDummy(1000) # 1000-D Branin function where the frist two dimensions are active
opt = HEBO_Embedding(prob.space, rand_sample = 10, eff_dim = 2, scale = 1)
- Evolutionary Optimization with HEBO API 进化算法优化,包装了pymoo的进化算法
from hebo.optimizers.evolution import Evolution
from hebo.benchmarks.synthetic_benchmarks import Ackley
prob = Ackley(dim = 2)
opt = Evolution(prob.space, num_obj = 1, num_constr = 0, algo = 'de', verbose = True)
n_eval = 0
for i in range(30):
rec = opt.suggest()
obs = prob(rec)
n_eval += rec.shape[0]
opt.observe(rec, obs)
print(f'After iter {i+1}, evaluated {n_eval}, best_y is {opt.best_y.squeeze()}')
- Custom: writing your own BO algorithm 自定义算法,暂时还没有相关介绍
复现HEBO结果
Step1:配置环境
pip install HEBO
pip install pymoo==0.4.1 # 新版本的pymoo>=0.5.0跑不起来hebo
pip install bayesmark[optimizers,notebooks] # 既安装所有内置优化器,也安装包含notebook的环境
Step2:下载HEBO,评测脚本
git clone https://github.com/rdturnermtl/bbo_challenge_starter_kit.git # 下载官方的一键评测脚本,主要用到了bayesmark这个库来作为评测基准
git clone https://github.com/huawei-noah/HEBO.git # 下载HEBO代码
Step3:测试一下评测脚本,用pysot算子例程评测3次得到的结果,评测的训练模型是SVM、DT,使用训练数据集合是boston、wine。脚本将自动进行初始化、评测、结果分析。
cd bbo_challenge_starter_kit
bash ./run_local.sh ./example_submissions/pysot 3 # 会报错,看了下是pysot/optimizer.py的实现有问题,引入了不存在的类
bash ./run_local.sh ./example_submissions/random-search 3 # 换个算法就能跑了
Step4:重跑华为的脚本,时间关系只评估1趟就好了
bash ./run_local.sh ../HEBO/HEBO/archived_submissions/hebo 1
报错 ModuleNotFoundError: No module named 'pymoo.algorithms.so_genetic_algorithm'。原因是pymoo升级了,如果要跑hebo,就需要安装旧版本的pymoo==0.4.1