机器学习的贝叶斯超参数优化

2024年8月28日 | 阅读 7 分钟

超参数的调整对于提升机器学习模型的整体性能至关重要。选择合适的超参数对模型的准确性和泛化能力有着巨大影响。然而,由于搜索空间是高维且非凸的,找到一组合适的超参数可能很困难。这个问题可以通过贝叶斯超参数优化(BO)巧妙地解决,它利用概率模型有效地搜索超参数空间并选择最佳配置。

什么是贝叶斯超参数优化?

贝叶斯超参数优化是一种迭代方法,它结合了优化技术和贝叶斯推理,以确定能够最大化机器学习模型性能的超参数。与传统的网格搜索或随机搜索方法对超参数空间进行穷举探索相比,贝叶斯优化将问题视为一系列顺序决策步骤。它维护一个目标函数的概率模型,该模型通常是模型的整体性能指标,用来决定在哪个位置采样下一组超参数。

贝叶斯超参数优化的关键组成部分

  1. 代理模型(Surrogate Model):贝叶斯优化的核心是代理模型,它近似目标函数。高斯过程(GPs)通常用作代理模型,因为它们能够模拟复杂、非线性的函数并提供不确定性估计。
  2. 采集函数(Acquisition Function):采集函数通过平衡探索(在不确定性高的区域采样)和利用(在可能产生高整体性能的区域采样)来指导优化过程。常用的采集函数包括改进概率(Probability of Improvement, PI)、期望改进(Expected Improvement, EI)和置信上限(Upper Confidence Bound, UCB)。
  3. 贝叶斯更新(Bayesian Update):在评估了新的超参数集上的目标函数后,代理模型会根据贝叶斯推理进行更新,纳入新的观测值,以完善其对真实目标函数的估计。
  4. 探索-利用权衡(Exploration-Exploitation Trade-off):贝叶斯优化巧妙地平衡了探索和利用,以有效地搜索超参数空间。在早期阶段,它会探索广泛的超参数范围,以建立对目标函数的初步了解。随着优化的进展,它会逐渐转向利用,专注于可能产生更高整体性能的区域。

贝叶斯优化如何工作?

贝叶斯优化采用迭代过程,建立目标函数(通常是机器学习模型的性能指标)的概率模型,然后利用该模型来决定在哪里采样下一组超参数。该过程包含几个关键步骤:

  • 启动优化:在贝叶斯优化方法中,首先选择一组超参数来评估目标函数。这可以通过随机过程或启发式方法来完成。
  • 代理模型:将找到的数据点拟合到一个概率模型(超参数和对应的目标函数值),通常是高斯过程(GP)。GP 提供对目标函数的平滑且灵活的估计,并提供不确定性估计。
  • 采集函数:使用采集函数来决定下一组要评估的超参数。采集函数平衡了探索(在不确定性高的区域采样)和利用(在可能产生高整体性能的区域采样)。常用的采集函数包括置信上限(UCB)、期望改进(EI)和改进概率(PI)。
  • 选择下一个评估点:采集函数指导搜索过程,选择最大化期望改进或利用的超参数。在此步骤中,优化采集函数以找到最有希望的超参数集进行进一步评估。
  • 评估目标函数:使用目标函数评估选定的超参数集,并记录其性能指标。
  • 更新代理模型:使用贝叶斯推理,用新的数据点(超参数和目标函数值)更新代理模型。这次更新通过考虑新数据来改进模型对目标函数的估计。
  • 重复:重复步骤 3-6,直到满足终止条件(例如,达到最大迭代次数或优化器收敛)。采集函数将搜索引向最有可能产生高整体性能的超参数空间区域,并且代理模型随着每次新的观测而得到改进。

与传统的网格搜索或随机搜索等方法相比,贝叶斯优化通过迭代更新基于观测到的数据点的代理模型并智能地选择下一个采样点,有效地探索超参数空间并收敛到最佳超参数集,从而以更少的对象函数评估次数提高了模型性能。

贝叶斯超参数优化实现

Python 可以使用 BayesianOptimisation 库轻松实现贝叶斯超参数优化。这是一个多步骤过程,首先创建代理模型,定义采集函数,选择初始超参数集,然后迭代更新模型。下面是贝叶斯超参数优化的简单实现:

输出

|   iter    |  target   | learni... | n_esti... |
-------------------------------------------------
| 1         | -9.04e+03 | 2.996     | 195.1     |
| 2         | -3.599e+0 | 5.856     | 159.9     |
| 3         | -243.9    | 1.248     | 115.6     |
| 4         | -7.505e+0 | 0.4647    | 186.6     |
| 5         | -5.022e+0 | 4.809     | 170.8     |
| 6         | -9.411e+0 | 0.1647    | 197.0     |
| 7         | -472.6    | 6.66      | 121.2     |
| 8         | -336.7    | 1.455     | 118.3     |
| 9         | -2.754e+0 | 2.434     | 152.5     |
| 10        | -850.3    | 3.456     | 129.1     |
| 11        | -36.0     | 8.0       | 100.0     |
| 12        | -4.0      | 0.0       | 100.0     |
| 13        | -9.381    | 3.035     | 102.9     |
| 14        | -1.14     | 3.068     | 100.0     |
| 15        | -7.515    | 0.02876   | 101.9     |
| 16        | -0.09195  | 2.303     | 100.0     |
| 17        | -0.03605  | 2.19      | 100.0     |
| 18        | -0.01331  | 2.115     | 100.0     |
| 19        | -0.004132 | 2.064     | 100.0     |
| 20        | -0.000839 | 1.971     | 100.0     |
=================================================
Optimal hyperparameters: {'learning_rate': 1.9710193674197325, 'n_estimators': 100.0}
Maximum objective value: -0.0008398770647524624

可以使用 pip 命令安装 bayesian-optimisation 库来实现贝叶斯超参数优化。

创建一个名为 object_func() 的函数,其中定义了学习率、估计器数量和贝叶斯参数。该函数返回需要最大化的目标值。您需要用实际的目标函数更新此函数。然后,使用 pbounds 字典定义搜索空间,指定每个超参数的范围。使用 BayesianOptimization 类初始化贝叶斯优化,将目标函数和搜索空间作为参数传递。使用 maximize 函数来评估贝叶斯优化,该函数指定初始点的数量(init_points)和迭代次数(n_iter)。最后,从优化器的 max 属性中检索最佳超参数和最大目标值。

贝叶斯超参数优化的应用

  • 超参数调优:贝叶斯优化广泛用于各种机器学习算法的超参数调优,包括支持向量机、随机森林、神经网络和梯度提升机。
  • AutoML:自动化机器学习(AutoML)平台利用贝叶斯优化自动搜索给定数据集的最佳模型架构和超参数,从而简化了从业者的模型开发过程。
  • 实验设计:除了超参数优化,贝叶斯优化还可以应用于科学研究中的实验设计,其目标是在进行最少实验的情况下最大化某个目标。

贝叶斯超参数优化的优势

  • 效率:贝叶斯优化计算效率高,因为它使用概率模型并主动从先前的观测中学习,比其他方法需要更少的目标函数评估。
  • 鲁棒性:由于贝叶斯优化在做出决策时会考虑不确定性,因此它对嘈杂或随机的目标函数具有鲁棒性。这意味着它可以处理目标函数可能嘈杂或难以准确评估的现实世界场景。
  • 并行化:由于其易于并行化,贝叶斯优化可以同时评估多组超参数。这加快了搜索过程并进一步提高了效率。

结论

贝叶斯超参数优化为机器学习模型的超参数调优提供了一种严谨高效的方法。通过将贝叶斯推理与优化技术相结合,它智能地探索超参数空间,从而以更少的计算资源提高了模型性能。随着机器学习的不断发展,模型也日益复杂,贝叶斯优化将在优化模型性能和加速该领域创新步伐方面发挥至关重要的作用。