发布 Optuna 2.0

2023-11-04 10:21
文章标签 发布 2.0 optuna

本文主要是介绍发布 Optuna 2.0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述


发布 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 (已被墙,请用该替代链接访问)

这篇关于发布 Optuna 2.0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/345122

相关文章

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Nginx实现前端灰度发布

《Nginx实现前端灰度发布》灰度发布是一种重要的策略,它允许我们在不影响所有用户的情况下,逐步推出新功能或更新,通过灰度发布,我们可以测试新版本的稳定性和性能,下面就来介绍一下前端灰度发布的使用,感... 目录前言一、基于权重的流量分配二、基于 Cookie 的分流三、基于请求头的分流四、基于请求参数的分

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面