Hyperopt是Python语言编写的一个开源超参数优化库,用于对机器学习模型中的超参数进行串行或并行的自动搜索。它可以处理实数、离散和条件型等结构不规则的搜索空间,并内置了随机搜索与基于树状Parzen估计器(TPE)的贝叶斯优化算法。该库由James Bergstra等人开发,常用于深度学习、梯度提升机与支持向量机等模型的调参工作。
定义
Hyperopt是一个用Python实现的库,目标是在结构不规则的搜索空间上完成串行或并行的优化,这类空间可能包含实值、离散以及条件型维度[1]。它服务的主要对象是机器学习流程中的超参数:这些参数不像模型权重那样由训练过程自动学出,而需要在训练开始前人工指定或另行搜索[2]。
该库在设计上把三件事分隔开来:搜索空间的描述、对一组超参数的评价函数,以及负责挑选下一组超参数的搜索算法,三者之间通过一套统一的协议通信[3]。这种分隔使得同一个搜索算法可以套用到差别很大的问题上,也使评估过程可以被复现[3]。
原理
使用者的工作流通常包含4个环节:先写出一个返回标量损失的目标函数,再用库中的参数表达式定义搜索空间,接着选定搜索算法,最后调用fmin()在给定的最大评估次数内完成搜索[4]。搜索空间里的每个超参数都以随机变量形式给出,并可以指定其服从的概率分布,例如均匀分布或对数尺度分布,也可以写成先选分支再取值的条件结构[5]。
库中目前实现了3种算法:随机搜索、树状Parzen估计器(TPE)以及自适应TPE[6]。TPE是一条贝叶斯优化路径,它用高斯核或分类核的核密度估计来刻画变量,而不是像高斯过程那样假定一条平滑的响应曲面,因而能一并处理连续与离散混合的维度。它按观测结果把样本分成表现较好与较差两组,分别建模后从中抽样,以此在探索与利用之间取得平衡。
并行化有两条途径:借助Apache Spark,或借助MongoDB[6]。对应地,库提供了SparkTrials类,它把试验分发到Spark工作节点上,适用于scikit-learn这类本身不做分布式的算法;而对于MLlib、Horovod等已经把训练分散到整个集群的算法,则应使用默认的Trials类,让每个试验在驱动节点上运行并自行启动分布式训练[7]。SparkTrials的parallelism参数控制同时评估的试验数,timeout参数则限定整个搜索可运行的最长时间[8]。
发展历程
该库的算法基础来自James Bergstra等人在2011年提出的TPE方法,当时作为超参数优化算法发表于神经信息处理系统会议[6]。James Bergstra与Yoshua Bengio在2012年发表的随机搜索研究进一步说明,当超参数数量较多时,随机搜索的表现可以与专家人工调参相当[3]。
2013年,James Bergstra、Daniel Yamins与David Cox在国际机器学习会议上报告了在视觉架构上做高维超参数搜索的工作,该研究用TPE为一类前馈视觉模型配置了238个超参数,并在人脸匹配、人脸识别与物件识别3个任务上取得当时的最优结果[9]。同年发布的ICML论文给出了正式的引用信息[10]。
围绕核心库还衍生出若干配套项目,例如把该库的接口接到scikit-learn分类器上的hyperopt-sklearn,以及面向深度信念网络和卷积视觉架构的hyperopt-nnet与hyperopt-convnet[3]。论文作者包括James Bergstra、Dan Yamins与David D. Cox[3]。
进入2020年代,该库的开源版本已不再维护,Databricks也宣布从16.4 LTS ML版本起不再把它包含在机器学习运行时中,并建议单节点优化改用Optuna,分布式场景改用RayTune。尽管官方维护已经停止,它提出的TPE思路仍是后续多个调参框架的默认策略。
应用
该库被广泛用于为各类模型挑选超参数,包括深度神经网络、支持向量机与梯度提升机,常见于数据科学、深度学习与机器学习研究中的模型选择环节[2]。在scikit-learn生态中,hyperopt-sklearn可以把任意该库算法的超参数接入Hyperopt的优化流程,使用者只需给出搜索空间、目标函数与优化算法这3个部分[5]。
在分布式平台上,它可以与SparkTrials配合,把原本在单机上进行的调参扩展到Spark集群,并借助MLflow记录每一次试验[4]。它同样适用于Apache Spark MLlib、Horovod等分布式算法以及TensorFlow等单机模型。在工程类研究中,该方法也被用于5G移动边缘计算场景下的网络资源配置,以在预算约束内搜索成本更低的部署方案[11]。
局限
该库实现的算法以随机搜索与TPE为主,虽然设计上预留了基于高斯过程和回归树的贝叶斯优化接口,但这两类算法在现有版本中并未真正实现[1]。TPE不产生一个全局的代理模型,因此无法给出不确定度估计,也就不能按标准形式支持期望改进等采集函数,在这一点上它弱于高斯过程类方法[12]。有研究指出TPE对自身控制参数不算敏感,这使得它上手较快,但也可能导致它在特定情形下难以自适应[13]。
并行化本身存在取舍:在固定的评估预算下,并行度越高计算越快,但并行度较低时每一轮迭代能利用更多历史结果,可能得到更好的解[8]。调参本身也被认为是机器学习建模中最费力的环节之一,参数众多、单次训练耗时长,通常还需要多折交叉验证来避免信息泄漏,因而优化的总开销可能相当可观[2]。此外,该库的优化目标被当作每次返回单个标量的黑箱来处理,不包含多保真度的资源调度机制,因而无法像基于Hyperband的方法那样提前终止表现不佳的试验[12]。
参见
-
树状Parzen估计器 —— Hyperopt内置的核心搜索算法,用核密度估计指导超参数采样。
-
贝叶斯优化 —— Hyperopt所依循的优化范式,用已有观测指导下一步搜索。
-
Optuna —— 同样采用TPE的Python调参框架,在该库停止维护后被推荐作为替代。
-
scikit-learn —— 常用机器学习库,其模型的超参数可通过hyperopt-sklearn接入Hyperopt。
-
Apache Spark —— Hyperopt通过SparkTrials在其上实现调参任务的并行化。
-
随机搜索 —— Hyperopt实现的另一种搜索算法,不利用历史结果进行自适应。
参考资料
- hyperopt - Hyperopt: Distributed Hyperparameter Optimization [引用日期2026-10-14]
- s41598-024-79191-8 [引用日期2026-10-14]
- github.io 上的网页 [引用日期2026-10-14]
- hyperopt-spark-mlflow-integration [引用日期2026-10-14]
- arxiv.org 上的网页 [引用日期2026-10-14]
- Hyperopt: Distributed Hyperparameter Optimization [引用日期2026-10-14]
- 将分布式训练算法与 Hyperopt 配合使用 - Azure Databricks [引用日期2026-10-14]
- hyperopt-concepts [引用日期2026-10-14]
- New paper: Making a Science of Model Search [引用日期2026-10-14]
- bergstra13 [引用日期2026-10-14]
- ieee.org 上的网页 [引用日期2026-10-14]
- OPTIMIZATION WITH SPOTOPTIM [引用日期2026-10-14]
- ed.ac.uk 上的文件 [引用日期2026-10-14]