![](https://i-blog.csdnimg.cn/blog_migrate/49d14d9120d514d8deb78c498ee24194.png#pic_center)
简介
近年来,人工智能与机器学习备受人们关注,越来越多的人使用机器学习模型解决实际问题,如数据分析与预测、人脸识别、商品推荐等。在应用机器学习模型的过程中,模型超参数的选择对模型性能有着重要影响,超参数优化问题成为了机器学习的重要挑战之一。超参数优化是典型的黑盒优化问题,对于优化目标不存在具体表达式或梯度信息,且验证代价较大,其目标是在有限的验证次数内,尽快找到全局最优点。
OpenBox是我们针对黑盒优化设计的一套开源系统,以贝叶斯优化为基础,高效求解黑盒优化问题。其使用场景广泛,不仅支持传统的单目标黑盒优化(如超参数优化),还支持多目标优化、带约束条件优化、多种参数类型、迁移学习、分布式并行验证、多精度优化等。OpenBox不仅支持本地安装与优化调用,还提供在线优化服务,用户可通过网页可视化监控并管理优化过程,也可以部署私有优化服务。
本文首先对黑盒问题及优化算法做简要介绍,然后将介绍我们的开源黑盒优化系统OpenBox。
黑盒优化介绍
首先,什么是黑盒优化?黑盒优化是在有限的验证预算内,对黑盒函数 f : X → R f : X → \R f:X→R 进行优化。但对于任何输入 x ∈ X x \in X x∈X,验证 f ( x ) f(x) f(x) 时,无法得知 f f f 的其他信息,例如表达式或梯度。当验证代价很昂贵时,应当谨慎选择输入参数,尽快达到全局最优值。
![](https://i-blog.csdnimg.cn/blog_migrate/88adad97e834b6d3f0e47404a5495f25.png#pic_center)
上图为一个黑盒函数的示意图,进行黑盒优化的过程中,我们只能通过不断地将数据输入到黑盒函数中,然后利用输出值猜测黑盒函数的结构信息。黑盒函数本身不提供任何有关内部运行的信息。
在白盒优化中,问题的具体形式是已知的,例如,对于线性回归问题,我们可以通过解析表达式求解,或者对于深度神经网络,即使无法直接求解,也可以利用优化目标对参数的梯度信息进行优化。而在黑盒优化中,优化目标的解析表达式及梯度信息均未知,我们无法利用优化目标本身的特性求得其全局最优解。
以机器学习超参数优化为例,我们的目标是找到一组使得机器学习模型性能最好的超参数,因此,函数的输入是模型超参数,输出是机器学习模型通过在这组超参数上执行训练与预测得到的性能评估,模型性能与超参数之间的关系无法用具体表达式刻画。
除了机器学习超参数优化外,黑盒优化在许多领域都有着广泛的应用,如自动化A/B测试、实验设计、数据库参数调优、处理器架构和芯片设计、资源配置优化、自动化化工设计等(如下图)。
![](https://i-blog.csdnimg.cn/blog_migrate/6716423d757938d933f68cdfa311616a.jpeg#pic_center)
解决黑盒优化问题的最朴素方法是网格搜索(Grid Search)和随机搜索(Random Search)。网格搜索也被称为全因子设计(Full Factorial Design),用户对每个超参数给定有限取值集合,网格搜索将在所有超参数取值集合的笛卡尔积上进行验证。显然,这一方法存在维度灾难问题,即随着超参数个数的增加,所需的函数验证次数呈指数级增长。
相对于网格搜索,随机搜索是更有效的方法。随机搜索将在给定的(时间)资源约束内,不断对超参数空间进行采样与验证。在网格搜索的过程中,如果对于优化目标存在不重要的输入参数,当我们固定重要参数,尝试不重要参数的不同取值时,验证结果差异很小,搜索低效,而随机搜索避免了这个问题,能够搜索更多不同重要参数对应的目标值。下图为网格搜索和随机搜索的对比示意。
![](https://i-blog.csdnimg.cn/blog_migrate/549bd3001492f04d8583c054bf8ef57c.png#pic_center)
贝叶斯优化是目前最先进的黑盒优化方法,针对验证代价昂贵的黑盒函数,可以在更少的验证次数内找到全局最优解。贝叶斯优化是基于模型的迭代式优化框架,包含两个重要组成部分,即概率代理模型(probabilistic surrogate model)和采集函数(acquisition function)。优化的主要步骤如下:
- 根据已有历史观测数据,使用概率代理模型,对黑盒函数的输入输出建模。
- 代理模型对输入空间中的候选点预测概率分布,采集函数根据概率代理模型计算候选点的验证价值。
- 优化采集函数,得到价值最高的下一个候选点。使用黑盒函数验证该参数配置,并将结果更新到历史观测数据中。
- 重复以上步骤,直至达到给定资源约束或达到预期效果。
![](https://i-blog.csdnimg.cn/blog_migrate/51120c2ae191f71bbaa45699a49686d5.png#pic_center)
根据代理模型,采集函数(图中橙色曲线)计算候选输入参数的验证价值。采集函数需要平衡探索(exploration)与利用(exploitation),即权衡选择不确定性高的候选点还是选择性能更优的候选点。相对于黑盒函数,采集函数的验证代价较低,可进行较为充分的优化。常用的采集函数有Expected Improvement、Lower Confidence Bound、Probability of Improvement等。
优化采集函数得到最大值点后(橙色曲线上的x),在黑盒函数上验证这个候选点并得到新的结果,之后我们重新训练代理模型,进行下一轮优化。
OpenBox开源项目
OpenBox是解决黑盒优化(超参数优化)问题的高效且通用的开源系统,我们的设计遵循以下理念:
- 易用:用户以最小代价使用黑盒优化服务,可通过用户友好的可视化界面监控与管理优化任务。
- 性能优异:集成最先进(state-of-the-art)的优化算法,并可自动选择最优策略。
- 资源感知管理:为用户提供基于成本(时间、并行数等)的建议。
- 高效:充分利用并行资源,并利用迁移学习、多精度优化加速搜索。
- 规模可扩展:对于输入维度、目标维度、任务数、并行验证数量等有较好的可扩展性。
- 错误容忍、系统可扩展性、数据隐私保护。
OpenBox使用Python编写,开源项目地址为:https://github.com/thomas-young-2013/open-box
广泛的使用场景
相较于现有的黑盒优化(超参数优化)系统,OpenBox支持更广泛的使用场景,包括多目标优化、带约束条件优化、多种参数类型、迁移学习、分布式并行验证、多精度优化等。OpenBox与现有系统的支持场景对比如下图:
- 多种参数类型(FIOC,即浮点型、整型、序数型、类别型):输入参数不局限于浮点型(实数),例如超参数优化中,SVM模型核函数用类别型表示,如果单纯用整型代替序数型或类别型参数,将对参数附加额外的序关系,不利于模型优化。
- 多目标优化(Multi-objective Optimization):同时优化多个不同(甚至相互冲突)的目标,例如同时优化机器模型准确率和模型训练/预测时间。
- 带约束条件优化(Optimization with Constraints):最优化目标的同时,要满足(黑盒)条件。
现有系统往往不能同时支持以上特性。OpenBox在支持上述场景的基础上,还支持:
- 利用历史任务信息指导当前优化任务,即迁移学习(Transfer Learning)。
- 提供并行优化算法、支持分布式验证,充分利用并行资源。
- 提供多精度(Multi-Fidelity)优化算法,从而在高验证代价场景下(如大数据集,机器模型训练时间较长),进一步加速搜索。
我们会在后续文章中介绍不同场景的使用方法。
高效并多样的优化策略
OpenBox系统默认使用基于随机森林代理模型(Random Forest Surrogate Model)的贝叶斯优化(Bayesian Optimization)算法,该算法对于超参数优化任务有着杰出的表现。相较于同样使用该算法的SMAC3库,OpenBox使用了更多优化策略,使得优化收敛更快,效果进一步提升。
对于贝叶斯优化算法,OpenBox还支持:
- 高斯过程(Gaussian Process)代理模型。
- Tree-structured Parzen Estimator(TPE)模型。
- 多种采集函数(Acquisition Function)如EI、PI、LCB、EIC、EHVI、MESMO、USeMO等。
用户可在系统推荐的基础上自行选择优化策略。
多种使用方法
在现有系统中,Google Vizier为用户提供了一个超参数优化服务(Service)。与算法库(Library)不同,用户无需部署与运行优化算法,只需要与服务交互,获取参数配置、进行验证并更新结果。但是,Google Vizier为谷歌内部服务,并未开源。OpenBox提供了开源优化服务,用户既可以使用我们提供的OpenBox在线服务,也可以通过开源代码将服务部署在自己的服务器中,满足用户自定义与隐私性需求。
目前OpenBox支持全平台(Linux、macOS、Win10)使用,并为用户提供本地和服务两种使用方式:
- 本地使用:用户可通过安装Python包,调用黑盒优化(超参数优化)框架与算法。
- 服务使用:用户可通过接口访问OpenBox服务,从服务端获取推荐的参数配置,在本地执行参数性能验证(如机器学习模型训练与预测)后,将结果更新至服务端。用户可通过访问服务网站页面,可视化监视与管理优化过程。
OpenBox代码已在Github开源,项目地址:https://github.com/thomas-young-2013/open-box 。欢迎更多开发者参与我们的开源项目。
本地使用教程
我们将通过数学函数优化和LightGBM模型超参数优化两个例子,介绍OpenBox系统本地使用方法。安装方法请参考我们的安装教程。
数学函数优化
首先,我们定义输入参数空间,并定义优化目标函数(最小化),这里我们使用Branin函数。
import numpy as np
from openbox import sp
# Define Search Space
space = sp.Space()
x1 = sp.Real("x1", -5, 10, default_value=0)
x2 = sp.Real("x2", 0, 15, default_value=0)
space.add_variables