超参数优化完整指南
超参数调优[1](或超参数优化)是确定使模型性能最大化的超参数正确组合的过程。其在一个训练过程中运行多个试验。每一次试验都是训练程序的完整执行,并在指定的范围内选择超参数设置值。这个过程一旦完成,就会给你一组最适合模型的超参数值,以获得最佳结果。毫无疑问,这是任何机器学习项目中的一个比较重要的步骤,因为其影响了模型的最佳结果。如果你希望看到超参数调优的作用,这里有一篇研究论文[2],通过在数据集上
编者按:今天为大家带来的一份超全的超参数调优指南,可谓一文在手,超参数调优无敌手。本文主要介绍了超参数调优的基本概念、常用方法和算法,以及超参数调优的工具推荐。
小编温馨提示,全文阅读预计需要20-30分钟,可以先收藏哦!
话不多说,开启超参数调优之旅吧,Enjoy!
作者 | Shahul ES, Aayush Bajaj
编译 | 岳扬
为机器学习或深度学习模型选择正确的超参数是从模型中提取精华的最佳方式之一。在本篇文章中,我们将向读者展示一些目前可用的做超参数调优的最佳方法。
参数和超参数有什么区别?
首先,让我们了解机器学习中超参数和参数之间的区别。
-
模型参数:这些是由模型从给定的数据中估计出来的参数。例如,一个深度神经网络的权重。
-
模型超参数:这些是不能由模型从给定数据中估计的参数,超参数被用来估计模型的参数,例如,深度神经网络的学习率。
模型参数与模型超参数 | 来源:https://www.geeksforgeeks.org...
什么是超参数调优,为什么他如此重要?
超参数调优[1](或超参数优化)是确定使模型性能最大化的超参数正确组合的过程。其在一个训练过程中运行多个试验。每一次试验都是训练程序的完整执行,并在指定的范围内选择超参数设置值。这个过程一旦完成,就会给你一组最适合模型的超参数值,以获得最佳结果。
毫无疑问,这是任何机器学习项目中的一个比较重要的步骤,因为其影响了模型的最佳结果。如果你希望看到超参数调优的作用,这里有一篇研究论文[2],通过在数据集上的实验,介绍了超参数优化的重要性。
如何进行超参数调优,找到最佳的超参数?
选择正确的超参数组合需要拥有对超参数和业务用例的深刻理解。然而,从技术上讲,有两种方法来找到它们。
1) 手动超参数调优手动超参数调优包括通过手动方式来实验不同的超参数集。这种技术将需要一个强大的实验跟踪器,要能够跟踪从图像、日志到系统指标的各种变量。典型的提供试验追踪功能的工具包括Neptune, W&B、Comet或者MLflow。
手动超参数优化的优势 😊
手动调整超参数意味着对这个过程有更多的人为控制。
如果正在研究或学习调优以及它是如何影响网络权重的,那么手动操作将是有意义的。
手动超参数优化的劣势 😥
手动调优是一个繁琐的过程,可能会有很多试验,而且保持跟踪是比较昂贵和耗时的。
当有很多超参数需要考虑时,这并不是一个非常实用的方法。
阅读关于如何手动优化机器学习模型超参数:How to Manually Optimize Machine Learning Model Hyperparameters - MachineLearningMastery.com
2) 自动超参数调优自动超参数调优是利用已有的算法来实现这一过程的自动化。需要遵循的步骤为:
首先,指定一组超参数和对这些超参数值的限制(注意:每个算法都要求这组参数是一个特定的数据结构,例如,字典)。
然后,该算法运行这些试验,并为你提取最佳的超参数集,以获得最佳的结果。
超参数调优方法
在本节中,我将介绍当今流行的所有超参数优化方法。
1) 随机搜索(Random Search)在随机搜索方法[4]中,我们为超参数创建了拥有很多可能值的网格。每次迭代都从这个网格中尝试随机的超参数组合,记录性能,最后得到最佳性能的超参数组合。
2) 网格搜索(Grid Search)在网格搜索法中,我们为超参数创建了一个可能值的网格。每次迭代都以特定的顺序尝试超参数的组合。它在每一个可能的超参数组合上拟合模型并记录模型的性能。最后,它返回具有最佳超参数的最佳模型。
来源:https://nanonets.com/blog/hyp...3) 贝叶斯优化为模型调整和寻找合适的超参数是一种优化问题。我们希望通过改变模型参数来最小化我们模型的损失函数。贝叶斯优化帮助我们通过最少的步骤中找到最小的点。贝叶斯优化还使用了采集函数(Acquisition Funtion),将采样引向有可能比当前最佳观察结果更好的区域。
4) Tree-structured Parzen estimators (TPE)基于树的帕森优化的理念与贝叶斯优化很相似。TPE不是寻找p(y|x)的值——其中y是要最小化的函数(例如,验证损失),x是超参数的值,而是建立P(x|y)和P(y)的模型。TPE算法的一个很大的缺点是,它们没有对超参数之间的相互作用进行建模。尽管如此,TPE在实践中的效果非常好,并在大多数领域通过了实战检验。
超参数调优算法这些是专门为超参数调优而开发的算法。
1) HyperbandHyperband是随机搜索的一个变种,但运用探索与利用理论[5],以便找到每个配置的最佳时间分配。你可以查看这篇研究论文[6],以获得进一步的参考。
2) Population-based training (PBT)这种技术是两种最常用的搜索技术的混合,同时将随机搜索和手动调整应用于神经网络模型。
PBT首先用随机超参数并行训练多个神经网络,但是这些网络并不是完全相互独立的。其使用来自其他群体的信息来完善超参数,并确定要尝试的超参数值。你可以查看这篇文章[7],了解更多关于PBT的信息。
3) 贝叶斯优化为模型调整和寻找合适的超参数是一种优化问题。我们希望通过改变模型参数来最小化我们模型的损失函数。贝叶斯优化帮助我们通过最少的步骤中找到最小的点。贝叶斯优化还使用了采集函数(Acquisition Funtion),将采样引向有可能比当前最佳观察结果更好的区域。
4) Tree-structured Parzen estimators (TPE)基于树的帕森优化的理念与贝叶斯优化很相似。TPE不是寻找p(y|x)的值——其中y是要最小化的函数(例如,验证损失),x是超参数的值,而是建立P(x|y)和P(y)的模型。TPE算法的一个很大的缺点是,它们没有对超参数之间的相互作用进行建模。尽管如此,TPE在实践中的效果非常好,并在大多数领域通过了实战检验。
超参数调优算法
这些是专门为超参数调优而开发的算法。
1) HyperbandHyperband是随机搜索的一个变种,但运用探索与利用理论[5],以便找到每个配置的最佳时间分配。你可以查看这篇研究论文[6],以获得进一步的参考。
2) Population-based training (PBT)这种技术是两种最常用的搜索技术的混合,同时将随机搜索和手动调整应用于神经网络模型。
PBT首先用随机超参数并行训练多个神经网络,但是这些网络并不是完全相互独立的。其使用来自其他群体的信息来完善超参数,并确定要尝试的超参数值。你可以查看这篇文章[7],了解更多关于PBT的信息。
来源:https://deepmind.com/blog/art...
3) BOHBBOHB(Bayesian Optimization and HyperBand)混合了Hyperband算法和Bayesian优化。你可以查看这篇文章来进一步参考:https://www.automl.org/blog_b...。
超参数调优的工具
1) Scikit-learnScikit-learn有网格搜索和随机搜索的实现,对于此两种方法,scikit-learn在不同的参数选择上,以K-fold交叉验证的方式训练和评估模型,并返回最佳模型。
具体来说:
-
随机搜索:用gridsearchcv在一些随机的参数组合上运行搜索。
-
网格搜索:用gridsearchcv在网格中的所有参数集上运行搜索。
用Scikit-learn调整模型是一个好的开始,但还有更好的选择,而且它们往往拥有随机搜索策略。
2) Scikit-optimizeScikit-optimize[8]使用一种基于序列模型的优化算法,在较短的时间内找到超参数搜索问题的最优解。
Scikit-optimize提供了除超参数优化之外的许多功能,例如:
-
存储和加载优化结果。
-
收敛图
-
比较代理模型
3) OptunaOptuna使用过往记录的轨迹细节来确定有希望的区域来搜索优化超参数,从而在最短的时间内找到最佳超参数。
它具有修剪功能,可以在训练的早期阶段自动停止没有希望的轨迹。optuna提供的一些关键功能是:
-
轻量级的、多功能的、与平台无关的架构
-
Python风格的搜索空间
-
高效的优化算法
-
易于并行化
-
快速可视化
在IDP中,可以快速开始使用Optuna。
4) HyperoptHyperopt允许用户创建一个搜索空间,在该空间中,用户期望得到最好的结果,使Hyperopt中的算法能够更有效地搜索。
目前,Hyperopt中实现了三种算法:
-
随机搜索
-
Tree of Parzen Estimators(TPE)
-
自适应的TPE
要使用hyperopt,首先应该确定:
-
要最小化的目标函数
-
搜索的空间
-
用于存储所有搜索点评估的数据库
-
要使用的搜索算法
教程(https://github.com/hyperopt/h...)将指导你如何构建代码并使用hyperopt包来获得最佳的超参数。你也可以阅读这篇文章(https://mlwhiz.com/blog/2019/...)以了解更多关于如何使用Hyperopt的信息。
5) Ray TuneRay Tune是在任何规模下进行实验和超参数调优的一个比较流行的选择。Ray利用分布式计算来加速超参数的优化,并为几种最先进的优化算法提供了规模化的实现。
Ray Tune提供的核心功能:
-
通过利用Ray,实现开箱即用的分布式异步优化
-
易于扩展
-
提供了SOTA算法,如ASHA、BOHB和基于群体的训练(population based training)。
-
支持Tensorboard和MLflow。
支持各种框架,如Sklearn、XGBoost、TensorFlow、PyTorch等。
你可以参考这个教程(https://docs.ray.io/en/latest...)。
6) Keras TunerKeras Tuner可以为TensorFlow程序挑选最佳的超参数集。当建立一个用于超参数调优的模型时,除了模型架构外,还会定义超参数搜索空间。你为超参数调整所建立的模型被称为超模型。
你可以通过两种方法定义超参数模型:
-
通过使用一个模型构建器函数
-
通过子类化Keras Tuner API的HyperModel类
你也可以将两个预定义的HyperModel类——HyperXception和HyperResNet用于计算机视觉应用。
你可以参考这个官方教程(https://www.tensorflow.org/tu...),了解进一步的实施细节。
7) BayesianOptimizationBayesianOptimization旨在最小化找到接近最优组合的参数组合所需的步骤数。
这种方法使用了一个代理优化问题(寻找获取函数的最大值),虽然它仍然是一个比较困难的问题,但在计算意义上花费更小,而且可以采用普通工具。因此,贝叶斯优化法最适合于对要优化的函数进行采样比较昂贵的情况。
请访问GitHub repo(https://github.com/fmfn/Bayes...),看看它的当前情况。
8) Metric Optimization EngineMOE(Metric Optimization Engine)是在评估参数耗时多或代价昂贵的情况下优化系统参数的一种有效方法。
它非常适合于以下问题 :
-
优化问题的目标函数是一个黑盒子,不一定是凸的或凹的。
-
导数是不可用的。
-
我们寻求全局最优,而不仅仅是局部最优。
这种处理黑箱目标函数的能力使我们能够使用MOE来优化几乎任何系统,而不需要任何内部知识或内部权限。
请访问GitHub Repo(https://github.com/Yelp/MOE)以获得更多信息。
9) SpearmintSpearmint被设计为自动运行实验(因此被命名为spearmint),其方式是迭代调整一些参数,以便在尽可能少的运行中使一些目标最小化。
在这个GitHub repo(https://github.com/HIPS/Spear...)中阅读有关Spearmint的内容。
10) GPyOptGPyOpt是使用GPy的高斯过程优化。其使用不同的采集函数(Acquisition Functions)进行全局优化。
可以使用GPyOpt来优化物理实验(按顺序或分批),并调整机器学习算法的参数。它能够通过稀疏的高斯过程模型处理大型数据集。
不幸的是,GpyOpt已经停止维护,但你仍然可以使用该软件包进行实验。
其GitHub repo:https://github.com/SheffieldM...。
11) SigOptSigOpt将自动超参数调优与训练运行跟踪完全整合在一起,让你对整体和达到最佳模型的路径有一个基本的认识。
凭借高度可定制的搜索空间和多指标优化等功能,SigOpt可以在将你的模型投入生产之前,通过简单的API进行复杂的超参数调优。
访问这里的文档(https://app.sigopt.com/docs/i...),了解更多关于SigOpt。
12) Fabolas传统的贝叶斯超参数优化器将机器学习算法在给定数据集上的损失建模为需要最小化的黑箱函数,而Fast Bayesian Optimization on LArge data Sets (FABOLAS)则在不同的数据集大小上为损失和计算成本建模,并使用这些模型来进行具有额外自由度的贝叶斯优化。
你可以在这里查看实现fabolas的函数(https://github.com/automl/RoB...)和研究论文(https://arxiv.org/pdf/1605.07...)。
参考资料
https://towardsdatascience.com/hyperparameter-tuning-c5619e7e6624
https://arxiv.org/pdf/2007.07588.pdf
https://docs.neptune.ai/you-should-know/what-can-you-log-and-display
https://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf
https://en.wikipedia.org/wiki/Multi-armed_bandit#Empirical_motivation
https://arxiv.org/abs/1603.06560
https://deepmind.com/blog/article/population-based-training-neural-networks
https://scikit-optimize.github.io/stable/index.html
https://optuna.readthedocs.io/en/stable/tutorial/first.
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)