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

以下是四种用于机器学习的超参数优化的常用方法,以提高效率:

1. 手动搜索

2. 网格搜索

3. 随机搜索

4. 基于贝叶斯模型的优化

(还有其他方法,如进化和基于梯度的。)

我很自豪我最近从手动搜索到随机搜索,直到我在Bergstra等人的论文中发现了这张图片。:

在LFW(左)和PubFig83(右)上比较随机搜索和基于模型的方法的验证错误

这些图比较了图像分类神经网络的超参数优化的验证误差与灰色中的随机搜索和绿色的贝叶斯优化(使用Tree Parzen Estimator或TPE)。越低越好:较小的验证集错误通常意味着更好的测试集性能,而较少数量的试验意味着更少的投入时间。显然,贝叶斯方法具有显着的优势,这些图表以及其他令人印象深刻的结果使我确信是时候采取下一步并学习基于模型的超参数优化。

一句话总结是:建立目标函数的概率模型,并用它来选择最有希望的超参数来评估真实的目标函数。

如果你想在非常高的水平上操作,那么这句话可能就是你所需要的。但是,如果您想了解详细信息,本文将尝试概述贝叶斯优化背后的概念,特别是使用Tree Parzen Estimator(TPE)的基于序列模型的优化(SMBO)。在你能够向别人解释这个概念之前,你不会理解这个概念,我写了几篇 ,并尝试以易于理解的格式传达结果。

虽然我们经常可以在不了解它们如何工作的情况下实现机器学习方法,但我想尝试了解正在发生的事情,以便尽可能有效地使用该技术。本文将为python实现提供概念基础!

超参数优化

机器学习中超参数优化的目的是找到给定机器学习算法的超参数,该算法返回在验证集上测量的最佳性能。

与模型参数相比,超参数是由机器学习工程师在训练之前设置的。随机森林中的树数量是超参数,而神经网络中的权重是训练期间学习的模型参数。

超参数优化以等式形式表示为:


这里f(x)表示最小化的目标 - 例如在验证集上评估的RMSE或错误率; x *是产生得分最低值的超参数集合,x可以取域X中的任何值。简单来说,我们希望找到在验证集度量上产生最佳得分的模型超参数。

超参数优化的问题在于评估目标函数以找到分数是非常昂贵的。每次我们尝试不同的超参数时,我们必须训练训练数据的模型,对验证数据进行预测,然后计算验证度量。由于大量的超参数和复杂的模型,如集合或深度神经网络,可能需要数天的训练,这个过程很快就变得难以手工完成!

网格搜索和随机搜索略好于手动调整,因为我们设置了一个模型超参数网格,并在循环中自动运行train-predict -evaluate循环,同时我们执行更高效的工作(如特征工程)。然而,这些方法效率也相对较低,因为它们不会根据以前的结果选择下一个超参数进行评估。网格和随机搜索完全不受过去评估的影响,因此,通常会花费大量时间来评估"坏"超参数。

例如,如果我们有以下图表,得分越低越好,集中搜索的意义何在?如果您说下面有200个估算器,那么您已经有了贝叶斯优化的想法!我们希望关注最有希望的超参数,如果我们有一个评估记录,那么将这些信息用于下一个选择是有意义的。


随机和网格搜索根本不关注过去的结果,并且会继续搜索估算器数量的整个范围,即使很明显最佳答案可能位于一个小区域!

贝叶斯优化

与随机或网格搜索相比,贝叶斯方法跟踪过去的评估结果,他们使用这些结果形成概率模型,将超参数映射到目标函数的得分概率:


该模型被称为目标函数的"代理",并表示为p(y | x)。代理比目标函数更容易优化,贝叶斯方法通过选择下一组超参数来评估实际目标函数,通过选择在代理函数上表现最佳的超参数来工作。换一种说法:

1. 建立目标函数的替代概率模型

2. 找到在代理上表现最佳的超参数

3. 将这些超参数应用于真正的目标函数

4. 更新包含新结果的代理模型

5. 重复步骤2-4,直到达到最大迭代次数或时间

通过在目标函数的每次评估之后不断更新替代概率模型来使这些方法。

在高层次上,贝叶斯优化方法是有效的,因为它们以明智的方式选择下一个超参数。基本思想是:花一点时间选择下一个超参数,以减少对目标函数的调用。实际上,与在目标函数中花费的时间相比,选择下一个超参数所花费的时间是无关紧要的。

通过评估过去结果看起来更有希望的超参数,贝叶斯方法可以在较少的迭代中找到比随机搜索更好的模型设置。

可以在更短的时间内找到更好的超参数,因为它们可以根据过去的试验推断出最佳的超参数集。

作为对贝叶斯优化中发生的事情的良好直观描述,请查看下面的图像。第一个是在两次评估后显示替代模型的初始估计 - 黑色,灰色相关的不确定性。显然,代理模型是实际目标(红色的)函数的近似值:


下一个图像显示了8次评估后的代理功能。现在,代理几乎完全匹配真正的功能。因此,如果算法选择使代理最大化的超参数,则它们可能会在真实评估函数上产生非常好的结果。


贝叶斯方法总是对我们非常有意义:我们形成了一个世界的初始视图(称为先验),然后我们根据新的经验更新我们的模型(更新的模型称为后验)。贝叶斯超参数优化采用该框架并将其应用于寻找模型设置的最佳值!

基于序列模型的优化

是贝叶斯优化的形式化。顺序是指一个接一个地运行试验,每次通过应用贝叶斯推理和更新概率模型(代理)来尝试更好的超参数。

基于模型的超参数优化有五个方面:

1. 要在其上搜索的超参数域

2. 一个目标函数,它接收超参数并输出我们想要最小化(或最大化)的分数

3. 目标函数的替代模型(代理)

4. 一种称为选择函数的标准,用于评估下一个从代理模型中选择的超参数

5. 由算法用于更新代理模型的(分数,超参数)对组成的历史记录

在步骤3-4有几种变体 ,即它们如何构建目标函数的代理以及用于选择下一个超参数的标准。代理模型的几种常见选择是高斯过程、随机森林回归和树Parzen估计(TPE),而步骤4的最常见选择是预期改进。在这篇文章中,我们将关注TPE和预期改进。

在随机搜索和网格搜索的情况下,我们搜索的超参数域是网格。随机森林的示例如下所示:

对于基于模型的方法,域由概率分布组成。与网格一样,这使我们可以通过在我们认为真正最好的超参数所在的区域中放置更大的概率来将域知识编码到搜索过程中。如果我们想将上面的网格表示为概率分布,它可能看起来像这样:




这里我们有一个统一的,对数正态的和正态的分布。这些是通过先前的实践/知识得知的(例如,学习速率域通常是几个数量级的对数正态分布)。

目标函数

目标函数采用超参数并输出我们想要最小化(或最大化)的单个实值得分。例如,让我们考虑为回归问题构建随机森林的情况。我们想要优化的超参数显示在上面的超参数网格中,最小化的分数是均方根误差。

虽然目标函数看起来很简单,但计算起来非常昂贵!如果可以快速计算目标函数,那么我们可以尝试每个可能的超参数组合(如在网格搜索中)。如果我们使用简单模型,小超参数网格和小数据集,那么这可能是最好的方法。但是,如果目标函数可能需要数小时甚至数天来评估,我们希望限制对它的调用。

基于贝叶斯模型的优化的整个概念是通过仅选择最有希望的超参数集来基于先前对评估函数的调用来减少目标函数需要运行的次数。基于称为代理项的目标函数的模型来选择下一组超参数。

代理功能(概率模型)

代理函数(也称为响应表面)是使用先前评估构建的目标函数的概率表示。这有时称为响应面,因为它是超参数与目标函数上得分概率的高维映射。下面是一个只有两个超参数的简单示例:

AdaBoost算法的响应面

代理函数有几种不同形式,包括高斯过程和随机森林回归。然而,在这篇文章中,我们将重点关注Bergstra等人在"超参数优化算法"一文中提出的树结构Parzen估计器。这些方法在构造代理函数方面有所不同,我们将在稍后解释一下。首先,我们需要谈谈选择特征。

选择特征

选择函数是从代理函数中选择下一组超参数的标准。最常见的标准选择是预期改进:


这里y *是目标函数的阈值,x是建议的超参数集,y是使用超参数x的目标函数的实际值,而p(y | x)是表示y的概率的替代概率模型给出x。如果这一切都有点多,简单来说,目标是最大化x的预期改进。这意味着在代理函数p(y | x)下找到最佳超参数。

如果p(y | x)在y < y *处到处为零,那么超参数x预计不会产生任何改进。如果积分是正的,则意味着超参数x预期产生比阈值更好的结果。

树形结构Parzen Estimator(TPE)

现在让我们回到代理函数。SMBO的方法在如何构建替代模型p(y | x)方面不同。树结构Parzen Estimator通过应用贝叶斯规则构建模型。它不是直接表示p(y | x),而是使用:

贝叶斯规则在行动!

p(x | y),即给定目标函数得分的超参数的概率,反过来表示:


其中y < y *表示目标函数的值低于阈值。这个等式的解释是我们为超参数做出两个不同的分布:一个是目标函数的值小于阈值l(x),另一个是目标函数的值大于阈值,g(x)。

让我们更新我们的随机森林图表以包含一个阈值:


现在我们为估计量的数量构建两个概率分布,一个使用在阈值以下产生值的估计量,一个使用产生高于阈值的值的估计量。


直观地,我们似乎想要从l(x)而不是从g(x)绘制x的值,因为这种分布仅基于x的值,其得分低于阈值。事实证明这正是数学所说的!使用贝叶斯规则和一些替换,预期的改进方程(我们试图最大化)变为:


最右边的术语是最重要的部分。这说明与比率l(x)/ g(x)成正比,因此,为了最大化预期改进,我们应该最大化这个比率。我们的直觉是正确的:我们应该绘制超参数的值,这些参数更可能在l(x)下而不是在g(x)下!

Tree-structured Parzen Estimator通过从l(x)绘制样本超参数,以l(x)/ g(x)的形式对它们进行评估,并返回在l(x)/ g(x)下产生最高值的集合。 )对应于最大的预期改进。然后在目标函数上评估这些超参数。如果代理函数是正确的,那么这些超参数在评估时应该产生更好的值!

预期的改进标准允许模型平衡勘探与开采。l(x)是分布而不是单个值,这意味着绘制的超参数可能接近但不完全处于预期改进的最大值。此外,因为代理只是对目标函数的估计,所以选择的超参数在评估时实际上可能不会产生改进,并且必须更新代理模型。该更新基于当前替代模型和目标函数评估的历史来完成。

历史

每次算法提出一组新的候选超参数时,它就会用实际的目标函数对它们进行评估,并将结果记录在一对(得分,超参数)中。这些记录构成了历史。该算法使用历史建立l(x)和g(x)以得出目标函数的概率模型,该模型随每次迭代而改进。

我们对目标函数的替代进行了初步估计,我们在收集更多证据时会对其进行更新。最终,通过对目标函数的充分评估,我们希望我们的模型准确地反映目标函数,并且产生最大预期改进的超参数对应于最大化目标函数的超参数。

汇总

基于序列模型的方法如何帮助我们更有效地搜索超参数空间?因为该算法提出了用于评估的更好的候选超参数,所以目标函数的得分比随机或网格搜索更快地改进,导致对目标函数的总体评估更少。

即使算法花费更多时间通过最大化预期改进来选择下一个超参数,但这在计算成本方面比评估目标函数便宜得多。作者报告说,找到下一组候选超参数需要几秒钟,而评估实际目标函数需要数小时。

如果我们使用更好的方法来选择下一个超参数,那意味着我们可以花更少的时间来评估不良的超参数选择。此外,使用树形结构Parzen估计器的基于序列模型的优化能够在相同数量的试验中找到比随机搜索更好的超参数。换句话说,我们得到了

  • 减少超参数调整的运行时间
  • 在测试集上获得更好的分数

希望这让您确信贝叶斯基于模型的优化是一项值得尝试的技术!

履行

对我们来说幸运的是,现在有许多库可以在Python中进行SMBO。留兰香和教育部使用高斯过程作为代理,Hyperopt使用树结构的Parzen估计,SMAC使用随机森林回归。这些库都使用预期改进标准从代理模型中选择下一个超参数。在后面的文章中,我们将看一下在Python中使用Hyperopt,并且已经有一些文章和代码示例供学习。

结论

基于贝叶斯模型的优化方法构建目标函数的概率模型,以便为下一组超参数提供更智能的选择以进行评估。SMBO是贝叶斯优化的形式化,它更有效地为机器学习模型找到最佳超参数而不是随机或网格搜索。

基于序列模型的优化方法在构建替代品方面存在差异,但它们都依赖于先前试验的信息来为下一次评估提出更好的超参数。Tree Parzen Estimator是一种使用贝叶斯推理构建代理模型的算法,可以使用预期改进选择下一个超参数。

本文转自:今日头条 - AI火箭营,转载此文目的在于传递更多信息,版权归原作者所有。

推荐阅读