关于优化:发布-Optuna-20

99次阅读

共计 5809 个字符,预计需要花费 15 分钟才能阅读完成。

公布 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.

咱们感激所有从一开始就关注本我的项目的、同咱们一路走来的人。

正文完
 0