超参数优化方法之贝叶斯优化实现流程及代码
在机器学习模型的训练过程中,超参数的选择往往对模型性能有着决定性的影响。贝叶斯优化作为一种高效的超参数调优方法,以其在高维空间中的搜索效率和对最优化问题的独特见解而受到关注。本文将深入探讨贝叶斯优化的基本原理、实现策略,并展示其在实际机器学习任务中的应用。从贝叶斯统计的角度出发,我们将一起了解如何利用先验知识与概率模型来指导超参数的搜索过程,从而提高模型调优的效率和效果。
文章目录
- 超参数优化方法之贝叶斯优化实现流程及代码
- 一、什么是贝叶斯优化
- 二、贝叶斯优化用于HPO(超参数优化)的基本流程
- 三、贝叶斯优化的实现代码
- 3.1基于Bayes_opt实现GP(高斯过程)优化
- 3.2基于HyperOpt实现TPE优化(第一选择,最常用)
- 3.3基于Optuna实现多种贝叶斯优化
一、什么是贝叶斯优化
贝叶斯调参过程有着非常严谨的数学理论,借助一些先验的假设,在实际进行调参之前,先假设一些数据、损失函数满足的一些条件。然后通过这种假设来避免去尝试很多点来尽量捕捉到损失函数真实的分布。 通过假设在很短时间内找到比较好的最小值或者是次小值。
贝叶斯优化方法(在很短的时间内就能找到泛化能力很强的参数)是当前超参数优化领域的SOTA手段(State of the Art),可以被认为是当前最为先进的优化框架,它可以被应用于AutoML的各大领域,不止限于超参数搜索HPO的领域,更是可以被用于神经网络架构搜索NAS以及元学习等先进的领域(用于不同的自动化机器学习领域表现出不同的性质)。现代几乎所有在效率和效果上取得优异成果的超参数优化方法都是基于贝叶斯优化的基本理念而形成的。
二、贝叶斯优化用于HPO(超参数优化)的基本流程
使用贝叶斯优化方法确定超参数的最优取值,实现流程如下所示:
- 1 .定义需要估计的𝑓(𝑥)以及𝑥的定义域
- 2.取出有限的n个 𝑥上的值,求解出这些 𝑥 对应的 𝑓(𝑥) (求解观测值)
- 3.根据有限的观测值,对函数进行估计(该假设被称为贝叶斯优化中的先验知识:假设分布是什么样子,满足什么规律),得出该估计𝑓上的目标值(最大值或最小值)[估计出来的结果是这条线,一条带有具体的值,以及这个值具体的置信程度的线,算出这条线上的最大值和最小值]
- 4.定义某种规则(有利于估计出𝑓(𝑥)真实的值,同时有利于找到目标点),以确定下一个需要计算的观测点
- 持续在2-4步骤中进行循环,直到假设分布的目标值达到标准,或所有计算资源被用完。
根据概率代理模型输出的计算结果,计算出采集函数,得到采集函数的最大值,最大值所指向的x点就是下一个要进行实际观测的点。通过实际观测不断修正估计的𝑓。
三、贝叶斯优化的实现代码
贝叶斯优化是当今黑盒函数估计领域最为先进和经典的方法,在同一套序贯模型下使用不同的代理模型以及采集函数、还可以发展出更多更先进的贝叶斯优化改进版算法,因此,贝叶斯优化的其算法本身就多如繁星,实现各种不同种类的贝叶斯优化的库也是琳琅满目,几乎任意一个专业用于超参数优化的工具库都会包含贝叶斯优化的内容。在以下页面中可以找到大量用于实现贝叶斯优化方法的HPO库:https://www.automl.org/automl/hpo-packages/ ,其中大部分库都是由独立团队开发和维护,因此不同的库之间之间的优劣、性格、功能都有很大的差异。
注意:在实际当中一般是hyperopt和optuna二选一,不会使用bayes_opt(因为计算效率实在太差)。但以上三个库都不支持基于Python环境的并行或加速(不像sklearn中有个n_jobs参数可以调用多核计算,同时也不支持在GPU上进行加速),大多数优化算法库只能够支持基于数据库(如MangoDB,mySQL)的并行或加速,但以上库都可以被部署在分布式计算平台(支持分布式计算,python环境加速的唯一选择)。
3.1基于Bayes_opt实现GP(高斯过程)优化
基于高斯过程的贝叶斯优化是最为经典的一个贝叶斯优化算法,但目前在实际当中,应用并不多,主要是因为使用贝叶斯优化就是为了提升速度,而高斯过程不够快。bayes-optimization是最早开源的贝叶斯优化库之一,也是为数不多至今依然保留着高斯过程优化的优化库。由于开源较早、代码简单,bayes-opt常常出现在论文、竞赛kernels或网络学习材料当中,因此理解Bayes_opt的代码是极其重要的课题。不过,bayes-opt对参数空间的处理方式较为原始,也缺乏相应的提效/监控功能,对算力的要求较高,因此它往往不是在进行优化时的第一首选库。 通常来说,当且仅当必须要实现基于高斯过程的贝叶斯优化,且算法的参数空间中带有大量连续型参数时,才会优先考虑Bayes_opt库。在github上找到bayes-optmization的官方文档(https://github.com/fmfn/BayesianOptimization)
基于高斯过程的贝叶斯优化实现流程
3.2基于HyperOpt实现TPE优化(第一选择,最常用)
TPE方法基本流程和普通贝叶斯优化一致,不过他基于的概率代理模型并不是高斯过程而是高斯混合模型,相比高斯过程算得更快,更容易获得更好的结果,应用更加广泛。
Hyperopt优化器是目前最为通用的贝叶斯优化器之一,Hyperopt中集成了包括随机搜索、模拟退火和TPE(Tree-structured Parzen Estimator Approach)等多种优化算法。相比于Bayes_opt,Hyperopt的是更先进、更现代、维护更好的优化器,也是最常用来实现TPE方法的优化器。在实际使用中,相比基于高斯过程的贝叶斯优化,基于高斯混合模型的TPE在大多数情况下以更高效率获得更优结果,该方法目前也被广泛应用于AutoML领域中。TPE算法原理可以参阅原论文Multiobjective tree-structured parzen estimator for computationally expensive optimization problems。
基于tpe的贝叶斯优化实现流程
3.3基于Optuna实现多种贝叶斯优化
Optuna是目前为止最为成熟、拓展性最强的超参数优化框架, 与古旧的bayes_opt相比,Optuna明显是专门为机器学习和深度学习所设计(封装程度比较高)。为了满足机器学习开发者的需求,Optuna拥有强大且固定的API,因此Optuna代码简单,编写高度模块化,是介绍的库中代码最为简练的库。Optuna的优势在于,它可以无缝衔接到PyTorch、Tensorflow等深度学习框架上(可以和各种库连接非常流畅),也可以与sklearn的优化库scikit-optimize结合使用,因此Optuna可以被用于各种各样的优化场景。
基于Optuna的贝叶斯优化实现流程
上述完整代码以及详细描述可关注公众号获取~