UltraOpt:比HyperOpt更强的超参优化库

这个月,笔者复盘了2020年做的一些AutoML项目,并在多个优秀的开源项目的基础上,博采众长,写了一个超参优化库:UltraOpt。这个库包含一个笔者自研的贝叶斯优化算法:ETPE,其在基准测试中比HyperOptTPE算法表现更为出色。UltraOpt对分布式计算有更强的适应性,支持MapReduce异步通信两种并行策略,并且可以扩展到各种计算环境中。

除此之外,UltraOpt对与新手也特别友好,笔者特地花了3周的时间写中文文档,就是为了让小白也能0基础看懂AutoML(自动机器学习)是在做什么。UltraOpt使用起来也是相当的轻量简洁,并且有大量的可视化工具函数帮助您更快地分析问题。

受篇幅所限,本文只能简明扼要地将UltraOpt的关键特性介绍出来,文本的所有代码与参考文献都能在代码仓库的README和中文文档中找到。如果您觉得这个项目对您有帮助,也欢迎给UltraOpt点一个小小的★star 哟~


安装方法:

pip install ultraopt

代码仓库:
https://github.com/auto-flow/ultraopt

中文文档:
https://auto-flow.github.io/ultraopt/zh/

目录

  • 快速上手
    • 用于超参优化
    • 考虑算法选择与较少代价的评估策略
  • 为什么比HyperOpt更强
    • 从性能上
    • 从功能上

快速上手

用于超参优化

首先我们通过一个对随机森林进行超参优化的过程来了解UltraOpt

如果要启动一个优化过程,首先我们要提供两个东西:1) 参数空间 2) 目标函数。

首先,定义一个超参空间,在UltraOpt中超参空间可以用HDL(Hyperparameters Description Language,超参描述语言)来定义:

UltraOpt:比HyperOpt更强的超参优化库_第1张图片

然后我们定义一个用于评判超参好坏的目标函数,接受一个字典类型的config,返回loss,即 1 减去交叉验证中验证集的平均正确率。我们的优化目标是 loss 越小越好。

UltraOpt:比HyperOpt更强的超参优化库_第2张图片

在定义了超参空间和目标函数后,进行优化其实就是一行代码的事情,只需要调用UltraOptfmin函数就行了:

from ultraopt import fmin
result = fmin(eval_func=evaluate, config_space=HDL, 
			optimizer="ETPE", n_iterations=30)
print(result)

优化过程中会打印进度条,完成后打印result对象会对优化结果进行一个汇总。

UltraOpt:比HyperOpt更强的超参优化库_第3张图片

调用result对象的plot_convergence方法会绘制拟合曲线。

UltraOpt:比HyperOpt更强的超参优化库_第4张图片

在安装了Facebook的可视化工具hiplot后,你可以查看这次超参优化结果的高维交互图

UltraOpt:比HyperOpt更强的超参优化库_第5张图片

考虑算法选择与较少代价的评估策略

可能有小伙伴要问,如果我想先从一组优化器中选一个优化器(算法选择),再对这个优化器进行超参优化UltraOpt能解决这样的算法选择与超参优化问题(CASH Problem)吗?答案是可以的。首先我们定义一个解决CASH ProblemHDL

UltraOpt:比HyperOpt更强的超参优化库_第6张图片

我们看到,首先我们要从【随机森林,KNN】这两个优化器中选一个,再对这个优化器进行超参优化。

这时又有小伙伴提问:上个案例中AutoML的评估函数需要进行一次完整的训练与预测流程,耗时比较长,换句话说就是代价比较大。有什么方法可以解决这个问题呢?有的大佬就提出了一种简单粗暴的方法:连续减半(Successive Halving,SH),即用少量样本来评价大量超参配置,将表现好的超参配置保留到下一轮迭代中,如图所示:

UltraOpt:比HyperOpt更强的超参优化库_第7张图片

后面又有大佬在SH的基础上提出了HyperBand(HB), 但为了读者朋友理解,今天咱们就以SH为例,让UltraOpt采用较少代价的评估策略

我们在考虑了评估代价(或者称为预算,budget)这一影响因素后,需要重新设计我们的目标函数,即添加budget参数并做相应的改变:

UltraOpt:比HyperOpt更强的超参优化库_第8张图片

这段代码可能有点难理解,简单说做了以下修改:

  1. 考虑了评估代价(量化为budget,取值范围0到1,表示训练样本采样率)
  2. 考虑了算法选择,AS表示算法选择结果,HP表示超参优化结果。

再实例化用于支持SH的迭代生成器:

UltraOpt:比HyperOpt更强的超参优化库_第9张图片

现在菜都配齐了,往ultraopt.fmin的锅里一扔,炖了:

UltraOpt:比HyperOpt更强的超参优化库_第10张图片

UltraOpt提供了大量的可视化工具函数,您可以查看优化过程与优化结果:

UltraOpt:比HyperOpt更强的超参优化库_第11张图片

为什么比HyperOpt更强

从性能上

我们在Synthetic BenchmarkTabular Benchmark上对优化算法进行了对比实验,结果如下:

  • Synthetic Benchmark

UltraOpt:比HyperOpt更强的超参优化库_第12张图片

  • Tabular Benchmark

UltraOpt:比HyperOpt更强的超参优化库_第13张图片

  • Tabular Benchmark(考虑HyperBand评价策略)

UltraOpt:比HyperOpt更强的超参优化库_第14张图片

从功能上

UltraOpt的设计哲学是以优化器为中心,优化器与评估器分离,并且是目前所有黑盒优化库中唯一能做到同时支持TPE算法和SMAC算法的,未来还会支持MCMC-GP贝叶斯回归贝叶斯网络等更多的优化器。

并且UltraOptmulti-fidelity(也就是HyperBand、连续减半等评估策略)也解耦和了出来,相比于BOHB的原生实现HpBandSter库,你可以在UltraOpt中更自由地将多保真度优化与贝叶斯优化进行混搭,创造属于你的BOHB算法。

下图表格从各种角度列出了UltraOpt相比于其他优化库的优势:

UltraOpt:比HyperOpt更强的超参优化库_第15张图片

如果您在使用中遇到了问题,欢迎issue反馈。如果您有idea,也欢迎Pull Request~

你可能感兴趣的:(automl)