发布 Optuna 2.0
我们很高兴发布 Optuna 的第二个主要版本,Optuna 是一个用 Python 写的的超参数优化(HPO)框架,现在你已经可以通过 PyPI 和 conda-forge 来获取它。
自今年一月的第一个主要版本发布以来,我们见证了社区在提出 pull request, issue 和一些不属于常见HPO的用例等方面做出的巨大努力。而该框架也已发展到可以容纳大量的新功能,其中包括用于评估超参数重要性的特性,用以节省计算资源的复杂剪枝算法,以及与 LightGBM 的紧密集成。本文将向你介绍这些更新,并展示本项目自上一个版本起的发展过程。同时,我们还将分享未来的规划,以期让你先一步了解未来会引入的新特性。。
如果你曾使用过 Optuna, 则能很快理解下面将介绍的内容。如果你想先了解对本框架,请参考我们之前的博客(https://medium.com/optuna/optuna-v1-86192cd09be5),它解释了 Optuna 背后的各种概念。
- 新特性
- 超参数重要性
- 性能提升
- Hyperband Pruning
- 新的 CMA-ES 采样
- 与第三方框架的集成 (Integration)
- 文档
- 与 PyTorch 协作
- 未来规划
- 贡献者
新特性
下面介绍的是本次发布的版本中一些非常重要的特性。
超参数重要性
虽然 Optuna 的设计可以处理任意多的超参数,但通常情况下,我们建议保持尽量少的参数个数,以减少搜索空间的维度。因为实际上,在许多情况下,只有很少的参数在确定模型的整体性能中起主导作用。而从 2.0 版开始,我们 引入了一个新模块 optuna.importance. 该模块可以评估每个超参数对整体性能的重要性,`optuna.importances.get_param_importances`. 该函数接受一个 study 作为参数,返回一个字典,该字典将不同的超参数映射到其各自的重要性数值上,这个数值的浮动范围为 0.0 到 1.0, 值越高则越重要。同时,你也可以通过修改evaluator 参数来尝试不同的超参数重要性评估算法,其中包括 fANOVA,这是一种基于随机森林的复杂算法。由于各种算法对重要性的评估方式不同,因此我们计划在以后的发行版中增加可选算法的数量。
study.optimize(...)
importances = optuna.importance.get_param_importances(study)
# Specify which algorithm to use.
importances.optuna.importance.get_param_importances(
study, evaluator=optuna.importance.FanovaImportanceEvaluator()
)
你不用自己处理这些重要性数据,Optuna 已经提供了同 `optuna.importance.get_param_importances` 具有相同接口的函数 `optuna.visualization.plot_param_importances`。它将返回一个 Plotly 图表,这对于可视化分析很有帮助。
fig = optuna.visualization.plot_param_importances(study)
fig.show()
下面是一幅使用 PyTorch 编写的神经网络绘制的重要性图。从中可以看出,学习率 “ lr” 占主导地位。
通过 mean decrease impurity 得出的超参数重要性。图中横柱的不同颜色是用于区分参数类型的,包括整数,浮点数和类别参数。
性能提升
在新版 Optuna 中,关系型数据库 (RDB) 下的超参数采样、对无望的试验 (trial) 的剪枝和对优化历史记录的一般处理性能都有很大的提升。通过精心设计的缓存机制和数据库查询语句,我们对底层负责读写试验数据的 storage layer 进行了非常多的改进(这一点对分布式训练尤其重要,因为此时不同的节点是通过数据表来共享数据的)。这使得 Optuna 可以用于更普遍的黑箱优化问题。这项改进在运行轻量级的目标函数或者处理大量的试验时尤其明显,因为在这种情况下采样过程一度是性能的瓶颈。
2.0 和 1.0 版本的优化时间对比,它们都采用了通过 Tree-structured Parzen Estimator (TPESampler
) 来采样浮点数的简单目标函数。2.0 版本明显在超参数和trials增加的情况下都展现出更快的速度。。注意:在每一次 suggestion 中,TPESampler
都需要采集之前所有试验中的 suggestion 值,而且,上图的 y 轴是对数轴。本次对比实验中所用的存储引擎均是 MySQL 数据库。
Hyperband Pruning
剪枝 (Pruning) 对于优化需要计算的目标函数至关重要。它使你可以在早期阶段有效地发现和停止无意义的试验,以节省计算资源,从而在更短的时间内找到最佳的优化方案。这也是在深度学习,这个Optuna的主要应用场景下我们经常碰到的情况。
比如,你可能需要训练由数百万个参数组成的神经网络,它们通常需要数小时或数天的处理时间。 Hyperband 是一种剪枝算法,它是建立在之前的逐次减半算法(SuccessiveHalvingPruner)基础上。逐次减半可以显着减少每次试验所需时间,但是众所周知,它对配置方式很敏感,而 Hyperband 解决了这个问题。该问题有很多种解决办法,而 Optuna 选择了启发式算法以进一步降低对用户的配置方式要求,使无相关技术背景的用户也能很容易使用。它最初在1.1版中作为实验性特性被引入,不过现在在接口和性能方面都已稳定。实验表明,在通用基准测试中,它的表现远强于其他的 pruner, 包括中位数 pruner (MedianPruner) ( Optuna 中的默认 pruner)。这一点你可以从下文的基准测试结果中看出。
study = optuna.create\_study(
pruner=optuna.pruners.HyperbandPruner(max\_resource=”auto”)
)
study.optimize(...)
比起之前的包括中位数 pruner (`tpe-median`) 在内的 pruner,Hyperband (`tpe-hyperband`) 不仅收敛更快,而且在多次运行中更稳定(见阴影区域的variance)。图中 1 budget 对应 100 个 training epochs. `tpe-nop` 代表无剪枝。
新的 CMA-ES 采样
`optuna.samplers.CmaEsSampler` 是新的CMA-ES采样器。 它比以前的 `optuna.integration` 子模块下的 CMA-ES 采样器要快。 这种新的采样器可以处理大量的试验,因此应适用于更广泛的问题。 此外,尽管以前的CMA-ES采样器过去一直不考虑被剪枝试验的优化,但该采样器还具有实验功能,可以在优化过程中更有效地利用修剪试验获得的信息。 该采样器由 @c-bata 开发, @c-bata 是 Optuna 的主要贡献者之一,也是其中所用的 `cmaes` 的作者。
过去你可能这么创建一个 study:
study = optuna.create_study(sampler=optuna.integration.CmaEsSampler())
现在你可以用新的子模块来这么做了:
study = optuna.create_study(sampler=optuna.samplers.CmaEsSampler())
或者,如果你要用原来的模块的话,它现在改了个名字:
study = optuna.create_study(sampler=optuna.integration.PyCmaSampler())
在优化过程中考虑被剪枝的试验的情况下,新的 CMA-ES 收敛速度更快。
与第三方框架的集成 (Integration)
Optuna带有各种子模块,可与各种第三方框架集成。 其中包括 LightGBM 和 XGBoost 等梯度增强框架,各种 PyTorch 和 TensorFlow 生态系统内的深度学习框架,以及许多其他框架。 在下文中,我们将介绍其中最重要的一些与此版本紧密相关的集成。
LightGBM
LightGBM是一个完善的、用于梯度增强的 Python 框架。 Optuna 提供了各种与 LightGBM 紧密集成的集成模块。 其中,“optuna.integration.lightgbm.train” 提供了对超参数的高效逐步调整,可用于直接取代 “ lightgbm.train”,因而用户无需修改代码。
而为了与其他Optuna组件进行交叉验证和集成,例如记录优化历史记录和分布式部署的研究,Optuna还提供了`optuna.integration.lightgbm.LightGBMTuner`和`optuna.integration.lightgbm.LightGBMTunerCV
MLflow
MLflow 是一个流行的、用于管理机器学习流水线和生命周期的框架。 而 MLflow Tracking 是一个通过交互式 GUI 监视实验的特别有用的工具。而现在,由于 MLflowCallback 的存在,使用 MLflow Tracking 来跟踪 Optuna 中的 HPO 实验变得非常简单,只要向 Optuna 的优化过程中注册一个回调函数即可。
Redis
优化算法和优化历史记录在 Optuna 的体系结构中是明确分开的。Storage 抽象了优化历史记录到各种后端(例如 RDB 或内存中)的储存过程。 RDB 可用于分布式优化或持久化保存历史记录,而内存中的存储则适用于不需要分布式优化或者持久记录的快速实验。 Redis 作为一种内存中的键-值存储,由于其灵活性和高性能而常被用于缓存。在本版本中,我们实验性地新增了一个 Redis 存储,在现有的 RDB 和内存存储之间建立了一个折中选项。 Redis 存储易于设置,可作为无法配置 RDS 的用户的备选项。
文档
官方文档 https://optuna.readthedocs.io 经过重新设计和改进,外观已焕然一新。 通过为每个函数或类创建独立的短页面,大大提高了可读性,在不同页面之间跳转也更容易了。
与 PyTorch 协作
PyTorch 是一个流行的深度学习框架,而深度学习也是 Optuna 的一个重要应用领域。 Optuna 最近加入了 PyTorch 生态系统,而且目前我们正持续继续添加功能,以便更轻松地与 PyTorch 及其生态系统下其他的框架集成。
AllenNLP
除了用于 PyTorch Lightning 和 PyTorch Ignite 的现有集成模块之外,我们还为 AllenNLP 添加了集成模块,AllenNLP 是一个基于 PyTorch 的机器学习框架,专门用于自然语言处理(NLP)。 使用 AllenNLP 时用户通常需要在 Jsonnet 文件中定义模型和训练过程。 当与Optuna结合使用时,这很不方便,因为必须从系统的文件中读取和写入参数。AllenNLPExecutor 让你仅用几行代码就能优化这些模型定义。 具体参见 @himkt 的这篇博客文章。
在 Pytorch 强化学习中使用 Optuna
创建了 ChainerRL 强化学习算法库的团队已将其算法库迁移到 PyTorch 上,更名为 PFRL,并且已经包含了 Optuna 的支持。 实际上,作为PFRL的一部分,NeurIPS 2020 的 Minecraft RL 竞赛的基准算法已经使用了 Optuna.
未来规划
尽管最初我们已为本版本规划了许多特性,但最终成品还是超出了预期。比如上述几个集成模块并不在我们最初的规划中,而是由越来越多的贡献者开发而成。我们会不断审视要纳入的功能,并将继续接受社区对 Optuna 可以起作用的新领域的意见。
至于具体的开发计划,多目标(multi-objective: MO)优化是处于规划中的一个主要功能。通过多目标优化,你将能够根据多个判据优化目标函数。一个典型的场景是在最大化模型精度的同时最小化 FLOPS (每秒浮点运算次数)。Optuna 中的 MO 算法将同时优化这两个条件,从而为用户提供最佳试验构成的所谓帕累托前沿面(由于在多目标下,单目标最佳的trial不能被认为是全局最佳)。如果你感兴趣,多目标优化已经可以作为实验功能来使用了,它是用诸如NSGA-II 之类的复杂算法实现的。由于其 API 与 Optuna 中的现有 API 非常相似,所以你只需对现有代码稍作改动即可开始使用它。在即将发布的版本中,我们将完善和修复该 API 并期待你在生产或使用中使用此功能或者开发新的MO算法。
贡献者
同之前版本一样,来自大量贡献者的反馈、代码和评论对本版本而言是不可或缺的。
A03ki, AnesBenmerzoug, Crissman, HideakiImamura, Muragaruhae, PhilipMay, Rishav1, RossyWhite, VladSkripniuk, Y-oHr-N, arpitkh101, araffin, barneyhill, bigbird555, c-bata, cafeal, chris-chris, crcrpar, d1vanloon, daikikatsuragawa, djKooks, dwiel, festeh, g-votte, gorogoroumaru, harupy, hayata-yamamoto, hbredin, henry0312, higumachan, himkt, hross, hugovk, hvy, iwiwi, jinnaiyuu, keisuke-umezawa, kuroko1t, momijiame, mottodora, nmasahiro, nuka137, nzw0301, oda, okapies, okdshin, pablete, r-soga, scouvreur, seungjaeryanlee, sfujiwara, shino-yoshi, sile, smly, suecharo, tadan18, tanapiyo, tohmae, toshihikoyanase, upura, victorhcm, y0z, yasuyuky, ytsmiling, yutayamazaki, zishiwu123 and zzorba.
我们感谢所有从一开始就关注本项目的、同我们一路走来的人。
哪里可以找到Optuna?
Optuna 官网:https://optuna.org
Optuna 中文文档:https://zh-cn.optuna.org (已被墙,请用该替代链接访问)