mango

mango

机器学习超参数并行优化库

Mango是一个专注于机器学习超参数优化的Python库。它支持在复杂搜索空间中进行并行优化,适用于连续、离散和类别值。该库特点包括简便的搜索空间定义、先进的无梯度优化算法、模块化调度设计和应用层故障检测。Mango可部署于本地、集群或云环境,在普通硬件上也能实现良好扩展性。通过在实际生产环境中的持续应用和改进,Mango不断增添新功能。

Mango超参数调优并行优化搜索空间调度器Github开源项目

Mango: 并行超参数调优库

Mango 是一个用于寻找机器学习分类器最优超参数的 Python 库。Mango 支持在连续/离散/分类值的复杂搜索空间上进行并行优化。

观看 12 秒的快速演示,展示 Mango 如何逼近 SVM 的复杂决策边界

AirSim 无人机演示视频

Mango 具有以下显著特点:

  • 轻松定义与 scikit-learn 兼容的复杂搜索空间。
  • 用于连续/离散/分类值的新型最先进无梯度优化器。
  • 模块化设计,可在本地、集群或云基础设施上调度目标函数。
  • 应用层故障检测,可在普通硬件上实现可扩展性。
  • 由于在生产环境中的测试和使用,持续添加新功能。

目录

  1. 安装
  2. 入门
  3. 超参数调优示例
  4. 搜索空间定义
  5. 调度器
  6. 可选配置
  7. 附加功能
  8. CASH 功能
  9. 平台感知神经架构搜索
  10. Mango 介绍幻灯片Mango 生产使用幻灯片
  11. 核心 Mango 研究论文引用基于 Mango 构建的新颖应用

<a name="setup"></a>

1. 安装

使用 pip

pip install arm-mango

从源代码安装:

$ git clone https://github.com/ARM-software/mango.git
$ cd mango
$ pip3 install .

<a name="getting-started"></a>

2. 入门

Mango 使用起来非常简单。以下示例最小化一个二次函数,其输入是 -10 到 10 之间的整数。

from mango import scheduler, Tuner # 搜索空间 param_space = dict(x=range(-10,10)) # 二次目标函数 @scheduler.serial def objective(x): return x * x # 初始化并运行调优器 tuner = Tuner(param_space, objective) results = tuner.minimize() print(f'参数的最优值:{results["best_params"]} 和目标:{results["best_objective"]}') # => 参数的最优值:{'x': 0} 和目标:0

<a name="knnexample"></a>

3. 超参数调优示例

from sklearn import datasets from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import cross_val_score from mango import Tuner, scheduler # KNN 分类器超参数的搜索空间 # n_neighbors 可以在 1 到 50 之间变化,使用不同的算法选择 param_space = dict(n_neighbors=range(1, 50), algorithm=['auto', 'ball_tree', 'kd_tree', 'brute']) @scheduler.serial def objective(**params): X, y = datasets.load_breast_cancer(return_X_y=True) clf = KNeighborsClassifier(**params) score = cross_val_score(clf, X, y, scoring='accuracy').mean() return score tuner = Tuner(param_space, objective) results = tuner.maximize() print('最佳参数:', results['best_params']) print('最佳准确率:', results['best_objective']) # => 最佳参数:{'algorithm': 'ball_tree', 'n_neighbors': 11} # => 最佳准确率:0.9332401800962584

注意,最佳参数可能会有所不同,但准确率应该约为 0.93。更多示例可以在 examples 目录中找到(Facebook 的 ProphetXGBoostSVM)。

<a name="DomainSpace"></a>

4. 搜索空间

搜索空间定义了目标函数输入参数的范围和分布。Mango 的搜索空间与 scikit-learn 的参数空间定义兼容,可用于 RandomizedSearchCVGridSearchCV。搜索空间被定义为一个字典,其中键是参数名(字符串),值是离散选项列表、整数范围或分布。以下是一些常见搜索空间的示例:

整数

以下空间将 x 定义为范围在 range(-10, 11) 内的整数参数(不包括 11):

param_space = dict(x=range(-10, 11)) #=> -10, -9, ..., 10 # 可以使用步长来定义稀疏范围 param_space = dict(x=range(0, 101, 10)) #=> 0, 10, 20, ..., 100

整数从给定范围内均匀采样,被假定为有序,并被视为连续变量。

分类

离散类别可以定义为列表。例如:

# 字符串 param_space = dict(color=['red', 'blue', 'green']) # 浮点数 param_space = dict(v=[0.2, 0.1, 0.3]) # 混合类型 param_space = dict(max_features=['auto', 0.2, 0.3])

列表是均匀采样的,并被假定为无序。它们在内部被进行独热编码。

分布

支持 scipy.stats 支持的所有分布。通常,分布必须提供 rvs 方法用于采样。

均匀分布

使用 uniform(loc, scale) 可以获得 [loc, loc + scale] 上的均匀分布。

from scipy.stats import uniform # 在 -1 和 1 之间均匀分布 param_space = dict(a=uniform(-1, 2))

对数均匀分布

我们通过扩展 scipy.stats.distributions 构造添加了 loguniform 分布。 使用 loguniform(loc, scale) 可以在 <code>[10<sup>loc</sup>, 10<sup>loc + scale</sup>]</code> 范围内获得对数均匀分布。

from mango.domain.distribution import loguniform # 在 10^-3 和 10^-1 之间对数均匀分布 param_space = dict(learning_rate=loguniform(-3, 2))

超参数搜索空间示例

随机森林分类器 的超参数搜索空间示例:

param_space = dict( max_features=['sqrt', 'log2', .1, .3, .5, .7, .9], n_estimators=range(10, 1000, 50), # 10 到 1000,步长为 50 bootstrap=[True, False], max_depth=range(1, 20), min_samples_leaf=range(1, 10) )

XGBoost 分类器 的搜索空间示例:

from scipy.stats import uniform from mango.domain.distribution import loguniform param_space = { 'n_estimators': range(10, 2001, 100), # 10 到 2000,步长为 100 'max_depth': range(1, 15), # 1 到 14 'reg_alpha': loguniform(-3, 6), # 10^-3 到 10^3 'booster': ['gbtree', 'gblinear'], 'colsample_bylevel': uniform(0.05, 0.95), # 0.05 到 1.0 'colsample_bytree': uniform(0.05, 0.95), # 0.05 到 1.0 'learning_rate': loguniform(-3, 3), # 0.001 到 1 'reg_lambda': loguniform(-3, 6), # 10^-3 到 10^3 'min_child_weight': loguniform(0, 2), # 1 到 100 'subsample': uniform(0.1, 0.89) # 0.1 到 0.99 }

SVM 的搜索空间示例:

from scipy.stats import uniform from mango.domain.distribution import loguniform param_dict = { 'kernel': ['rbf', 'sigmoid'], 'gamma': uniform(0.1, 4), # 0.1 到 4.1 'C': loguniform(-7, 8) # 10^-7 到 10 }

<a name="scheduler"></a>

5. 调度器

Mango 设计用于利用分布式计算的优势。目标函数可以被调度在本地运行或在集群上并行评估。Mango 的设计允许使用任何分布式计算框架(如 Celery 或 Kubernetes)。scheduler 模块附带一些预定义的调度器。

串行调度器

串行调度器在本地运行,一次评估一个目标函数

from mango import scheduler @scheduler.serial def objective(x): return x * x

并行调度器

并行调度器在本地运行,并使用 joblib 并行评估目标函数

from mango import scheduler @scheduler.parallel(n_jobs=2) def objective(x): return x * x

n_jobs 指定并行评估的数量。n_jobs = -1 使用机器上所有可用的 CPU 核心。完整的工作示例请参见 simple_parallel

自定义分布式调度器

用户可以使用 custom 调度器定义自己的分布策略。为此,用户需要定义一个接受参数列表并返回结果列表的目标函数:

from mango import scheduler @scheduler.custom(n_jobs=4) def objective(params_batch): """ 自定义分布式目标函数的模板 参数: params_batch (list):要并行评估的参数字典批次 返回: list:给定参数下的目标函数值 """ # 在分布式框架上评估目标 ... return results

例如,以下代码片段使用了 Celery

import celery from mango import Tuner, scheduler # 连接到 Celery 后端 app = celery.Celery('simple_celery', backend='rpc://') # 远程 Celery 任务 @app.task def remote_objective(x): return x * x @scheduler.custom(n_jobs=4) def objective(params_batch): jobs = celery.group(remote_objective.s(params['x']) for params in params_batch)() return jobs.get() param_space = dict(x=range(-10, 10)) tuner = Tuner(param_space, objective) results = tuner.minimize()

使用 Celery 调优 KNN 超参数的工作示例在这里

6. 可选配置

Mango使用的默认配置参数如下:

{'param_dict': ..., 'userObjective': ..., 'domain_size': 5000, 'initial_random': 1, 'num_iteration': 20, 'batch_size': 1}

配置参数包括:

  • domain_size: 每次迭代中高斯过程探索的范围大小。通常在优化高维函数时,建议使用较大的值。后续会添加更多关于贝叶斯优化内部细节的信息。

  • initial_random: 尝试的随机样本数。注意:Mango会一次性返回所有随机样本。用户可以利用这一点在不受限制的情况下并行运行随机样本。

  • num_iteration: Mango用于寻找最优值的总迭代次数。

  • batch_size: 传递给目标函数进行并行评估的args_list的大小。对于较大的批量大小,Mango内部使用智能采样来决定要评估的最佳样本。

  • early_stopping: 一个可调用对象,用于指定自定义停止条件。回调函数具有以下签名:

def early_stopping(results): ''' results与tuner返回的字典相同 可用的键:params_tries, objective_values, best_objective, best_params ''' ... return True/False

早停是Mango的一个重要特性,允许根据用户自定义的条件提前终止当前的并行搜索,例如总优化时间、当前验证精度或过去几次迭代的改进情况。使用示例请参见早停示例notebook

  • constraint: 一个可调用对象,用于指定参数空间的约束。它具有以下签名:
def constraint(samples: List[dict]) -> List[bool]: ''' 给定样本列表(每个样本是一个字典,参数名称作为键) 返回一个布尔值列表,表示相应的样本是否满足约束条件 '''

有关示例,请参见[此notebook](https://github.com/ARM-software/mango/blob/main/<examples/Test functions for constrained optimization.ipynb>)。

  • initial_custom: 一个初始评估点列表,用于预热优化器,而不是随机采样。 它可以是:
    • 带参数的字典列表。例如,对于具有两个参数x1x2的搜索空间,输入可以是: [{'x1': 10, 'x2': -5}, {'x1': 0, 'x2': 10}]
    • 带参数和目标函数值的元组列表。例如,如果目标函数是将x1x2相加,输入可以是: [({'x1': 10, 'x2': -5}, 5), ({'x1': 0, 'x2': 10}, 10)]
    这允许用户自定义初始评估点,从而引导优化过程。 它还可以从上一次tuner运行的结果开始优化器(参见此notebook的工作示例)。 注意,如果给定了initial_custom选项,则会忽略initial_random

默认配置参数可以修改,如下所示。只需传递需要调整值的参数字典即可。

conf_dict = dict(num_iteration=40, domain_size=10000, initial_random=3) tuner = Tuner(param_dict, objective, conf_dict)

7. 其他功能

处理运行时评估失败

在生产部署中,运行时评估失败是常见的。Mango的抽象使用户即使在出现故障的情况下也能取得进展,只需使用正确的评估。语法可以返回成功的评估,用户可以灵活地跟踪失败,例如使用超时。显示Mango在出现故障时使用的示例:串行执行并行执行

神经架构搜索

Mango还可以进行高效的神经架构搜索。在MNIST数据集上搜索最佳滤波器大小、滤波器数量等的示例可用

THIN-Bayes文件夹中提供了更多广泛的示例,为不同的回归和分类任务对一类神经网络和经典模型进行神经架构搜索

8. 组合分类器选择和优化(CASH)

Mango现在提供了一种新的组合分类器选择和优化功能。它允许开发人员直接指定一组分类器及其不同的超参数空间。Mango内部会以尽可能少的总迭代次数找到最佳分类器及其最优参数。示例可在此处获得

骨架代码中的重要部分如下。

from mango import MetaTuner #定义搜索空间和目标函数,与tuner相同。 param_space_list = [param_space1, param_space2, param_space3, param_space4, ..] objective_list = [objective_1, objective_2, objective_3, objective_4, ..] metatuner = MetaTuner(param_space_list, objective_list) results = metatuner.run() print('best_objective:',results['best_objective']) print('best_params:',results['best_params']) print('best_objective_fid:',results['best_objective_fid'])

参与

引用Mango的核心论文

更多技术细节可参见 Mango 论文-1 (ICASSP 2020)Mango 论文-2 (CogMI 2021) 请按如下方式引用:

@inproceedings{sandha2020mango,
  title={Mango: A Python Library for Parallel Hyperparameter Tuning},
  author={Sandha, Sandeep Singh and Aggarwal, Mohit and Fedorov, Igor and Srivastava, Mani},
  booktitle={ICASSP 2020-2020 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)},
  pages={3987--3991},
  year={2020},
  organization={IEEE}
}
@inproceedings{sandha2021mango,
  title={Enabling Hyperparameter Tuning of Machine Learning Classifiers in Production},
  author={Sandha, Sandeep Singh and Aggarwal, Mohit and Saha, Swapnil Sayan and Srivastava, Mani},
  booktitle={CogMI 2021, IEEE International Conference on Cognitive Machine Intelligence},
  year={2021},
  organization={IEEE}
}

<a name="ApplicationPapers"></a>

基于 Mango 构建的新型应用

@article{saha2022auritus,
  title={Auritus: An open-source optimization toolkit for training and development of human movement models and filters using earables},
  author={Saha, Swapnil Sayan and Sandha, Sandeep Singh and Pei, Siyou and Jain, Vivek and Wang, Ziqi and Li, Yuchen and Sarker, Ankur and Srivastava, Mani},
  journal={Proceedings of the ACM on Interactive, Mobile, Wearable and Ubiquitous Technologies},
  volume={6},
  number={2},
  pages={1--34},
  year={2022},
  publisher={ACM New York, NY, USA}
}
@article{saha2022tinyodom,
  title={Tinyodom: Hardware-aware efficient neural inertial navigation},
  author={Saha, Swapnil Sayan and Sandha, Sandeep Singh and Garcia, Luis Antonio and Srivastava, Mani},
  journal={Proceedings of the ACM on Interactive, Mobile, Wearable and Ubiquitous Technologies},
  volume={6},
  number={2},
  pages={1--32},
  year={2022},
  publisher={ACM New York, NY, USA}
}
@article{saha2022thin,
  title={THIN-Bayes: Platform-Aware Machine Learning for Low-End IoT Devices},
  author={Saha, Swapnil Sayan and Sandha, Sandeep Singh and Aggarwal, Mohit and Srivastava, Mani},
  year={2022}
}

幻灯片

解释 Mango 抽象概念和设计选择的幻灯片可在此处获取:Mango 幻灯片-1Mango 幻灯片-2

贡献

如果您正在寻找贡献的领域,请查看未解决的问题

问题

如有任何问题,请随时在此处创建问题进行咨询。

编辑推荐精选

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多