专栏首页数据派THU​独家 | 一文读懂贝叶斯优化

​独家 | 一文读懂贝叶斯优化

作者:Apoorv Agnihotri,Nipun Batra

翻译:王雨桐

校对:张一然

本文约6200字,建议阅读10+分钟。

本文将贝叶斯优化拆解为易于理解的小部分。

许多现代的机器学习算法都涉及大量的超参数。为了高效地使用这些算法,我们需要选择合适的超参数值。我们将在本文中讨论贝叶斯优化,它是一种常用于调整超参数的技术。更通俗地说,贝叶斯优化可用于任何黑盒函数的优化。

挖金子!

以开采金矿为例,我们的目标是在未知的土地上开采黄金。现在假设金子围绕一条线分布,由于开采的高额成本,我们希望通过尽量少的开采次数,沿着这条线找到最大金矿的位置。

假设金子的分布函数f(x)如下,该双峰曲线的最大值出现在x=5附近。让我们暂时忽略X轴和Y轴的单位。

最初我们对金子的分布一无所知,但可以通过在不同位置钻孔来了解金子的分布。 然而这种打钻的成本是非常高的。因此我们希望最大程度地减少所需的钻孔次数,同时仍能快速地找到最大的金矿位置。

现在我们将讨论金矿开采问题的两个共同目标。

  • 问题1:黄金分布的最佳估计(主动学习)

在这个问题中,我们要准确估算新土地上的金子分布。由于成本过高,我们无法在每个位置进行钻探。相反我们应该在能提供更多金矿分布信息的位置进行尝试。这个问题类似于主动学习。

  • 问题2:最大金矿的位置(贝叶斯优化)

在这个问题中,我们要找到最大金矿的位置,但同样不能在每个位置都进行钻探,而是应该重点关注金子含量高的位置。这个问题类似于贝叶斯优化。

我们将很快看到这两个问题是如何关联的,但他们并不是同一问题。

主动学习

在许多机器学习问题中,我们都可以轻易获得未标记的数据。但是标记(或查询)通常要花费很多精力。例如对于语音转文本的任务,注释需要专家手动标记单词和句子。同样在我们的金矿开采问题中,钻孔(类似于标记)也非常昂贵。

主动学习可最大程度地减少标记的成本,同时尽可能提高建模精度。尽管主动学习中有多种方法,但我们要着眼于减少不确定性。该方法建议标记模型不确定性最高的点,我们通常用方差来度量不确定性。

由于我们仅知道函数在几个点上的真实值,因此我们需要一个代理模型来确定函数在其他地方的取值。该代理模型应该能足够灵活以对真实函数进行建模。使用高斯过程(GP)是一种常见的选择,这既因为它具有灵活性,又可以为我们提供不确定性估计。

我们的代理模型以f(x)的先验开始——对于黄金,我们假设先验是平稳分布。在评估点(钻探)时,我们会获取更多数据供代理模型学习,并根据贝叶斯规则进行更新。

每个新数据点都会更新我们的代理模型,从而使模型更接近于真实情况。黑线和灰色阴影区域表示钻孔前后金子分布估算中的平均值(μ)和不确定性(μ±σ)。

上例中我们从均匀分布的不确定性开始。但是在我们第一次更新之后,后验肯定在x = 0.5附近并且不确定性降低。我们可以继续添加更多的训练点,并获得更准确的f(x)的估计。

但我们要尽量减少评估次数。因此我们应该使用主动学习“聪明地”选择下一个查询点。尽管有很多方法可以选择恰当的点,但我们将选择最不确定的点。

这为我们提供了以下主动学习程序:

  1. 选择不确定性最高的点并将其添加到训练集中(通过查询/标记该点);
  2. 在新的训练集上训练模型;
  3. 跳转回第一步,直到收敛或预算用尽。

现在让我们可视化此过程,并查看我们的后验在每次迭代(每次钻孔之后)如何变化。

可视化结果表明,我们可以在几次迭代中估算出真实的分布。此外最不确定的位置通常是距离当前评估点最远的点。 在每次迭代中,主动学习都会探索该领域,以使估算结果更好。

贝叶斯优化

在上一节中,我们选取了点以确定金矿预测的准确模型。但是如果我们的目标仅仅是找到最大金矿的位置,该怎么办?当然我们可以通过主动学习以准确估计真实函数,然后找到其最大值。但这听起来就很浪费精力——如果我们仅考虑最大值时,为什么要用评估来对函数中金子含量较低的区域进行改进?

这是贝叶斯优化的核心问题:“根据目前我们所知道的,我们接下来应该评估哪一个点?”请记住评估每个点的成本都很高,因此我们要谨慎选择!在主动学习的情况下,我们选择了最不确定的点以探索函数。但是在贝叶斯优化中,我们需要权衡探索不确定的区域(这些区域可能意外地具有较高的金子含量),而不是集中于我们已经知道具有较高金含量的区域(一种开采)。

我们通过采集函数(acquisition function)来做出此决定。采集函数是一种启发式方法,可根据我们当前的模型来评估一个点。更多有关采集函数的细节请参考该链接(https://botorch.org/docs/acquisition)我们将利用本节的大部分篇幅介绍采集函数的细节。

我们了解了贝叶斯优化的工作原理。在每个步骤中,我们都会通过优化采集函数来确定下一步要评估的最佳点。然后我们更新模型并重复此过程,以确定要评估的下一点。

如果我们只是优化这些采集函数,你可能会想贝叶斯优化的“贝叶斯”是什么。在每个步骤中我们都维护一个模型,来描述每个点的估计值和不确定性,并在每步根据贝叶斯规则对其进行更新。我们的采集函数就是基于此模型的,没有它们一切就不可能!

贝叶斯优化公式化

现在让我们正式介绍贝叶斯优化。我们的目标是找到位置(x∈Rd)对应于函数f的全局最大值(或最小值):f:Rd↦R。 我们提出贝叶斯优化中的一般约束,并将其与我们的金矿开采实例中的约束进行对比。以下内容基于Peter Fraizer在Uber有关贝叶斯优化的PPT/演说:

通用限制

挖金矿案例中的限制

f的可行集A很简单,例如边界约束。

我们在金矿开采问题中的域是一维边界约束:0≤x≤6。

f是连续的但缺乏特殊结构,例如凹面,这使其易于优化。

我们的真实函数既不是凸函数也不是凹函数,从而导致局部最优。

f无导数:评估不提供梯度信息。

我们对某个地点含金量的评估(通过钻探)并未提供任何梯度信息。

f的评估成本很高:我们可以评估它的次数非常有限。

钻孔成本很高。

f可能噪声很大。如果存在噪声,我们将假定它是独立的且呈正态分布,并且具有共同但未知的方差。

我们在模型中假设无噪声测量(尽管很容易将正态分布的噪声纳入GP回归)。

为了解决这个问题,我们将遵循以下算法:

  1. 我们首先选择一个代理模型来对真实函数f建模并定义其先验
  2. 给定一组观察值(函数评估),请使用贝叶斯规则获取后验
  3. 使用采集函数α(x),它是后验的一个函数,来确定下一个采样点:
  1. 将新采样的数据添加到观测值集中,然后执行步骤2,直到收敛或用尽预算。

采集函数

采集函数对贝叶斯优化至关重要,它有多种选择。我们将在下文介绍许多选项,以提供想法和示例。

  • PROBABILITY OF IMPROVEMENT(PI)

该采集函数选择下一个查询点作为最有可能提高当前最大

的查询点。 数学上我们如下选择下一点:

其中:

表示概率;

是一个小的正数;

, 其中

是第i步查找的位置。

仔细观察,我们只能得到代理后验的上尾概率(或累计概率分布(CDF))。而且如果我们使用GP作为替代,上面的表达式将转换为:

其中:

表示CDF。

下图显示了(x)的计算。 橙色线代表当前的最大值(加上一个ϵ)或。 紫色区域显示每个点的概率密度。灰色区域显示低于当前最大值的概率密度。 紫色区域在每个点上的“面积”表示“当前最大值提升的可能性”。通过PI标准评估的下一点(蓝色虚线所示)是x = 6。

  • PI中ϵ的

PI使用ϵ在勘探与开发之间取得平衡。ϵ的增加会导致倾向σ较大的位置,因为它们的概率密度分布更大。

现在让我们看看实际的PI采集函数。 我们从ϵ = 0.075开始。

从上图中,看到我们在几次迭代中达到了全局最大值。在前几次迭代中,我们的代理模型在x∈[2,4]中具有较大的不确定性。采集函数先探索具有高期望值的区域,这导致了区域x∈[2,4]具有高度不确定性。此观察结果还表明,我们无需构造黑盒函数的准确估计即可找到其最大值。

上图中的ϵ增加到了0.3,这使我们能够进行更多探索。但是似乎我们正在探索的已经超出了要求的范围。

如果再增加ϵ会怎样?

如图看到我们使情况变得更糟了!我们的模型现在使用 ϵ = 3,并且当我们接近在全局最大值附近时,我们将无法进一步探索。而且随着探索的深入,设置变得类似于主动学习。

上面的快速实验可以帮助我们得出结论:ϵ控制着PI采集函数中的探索程度。

  • EXPECTED IMPROVEMENT(EI)

Probability of improvement仅着眼于改善可能性有多大,而没有考虑我们可以改善程度。下一个标准称为“预期改进(EI)”,它正是利用了这种想法!这个想法很简单——如果某个点可以为当前最大

的带来最大期望的提升,将该点选定为下一个查询点,其中

,是第i步查询的位置。

在采集函数中,第t+1个查询点

是基于以下公式进行选择。

其中,f是真实的地质函数,

是t+1时间点的代理的后验均值,是训练数据

以及x*是f取最大值的实际位置。

从本质上讲,我们在尝试选择一个点,以最大程度地减少与目标物的距离。不幸的是,我们不知道真实函数f。Mockus提出了采集函数如下来克服该问题:

其中

是到目前所遇到的最大值。GP的替代方程如下所示:

其中

表示CDF,

表示pdf。

从上式可以看出,在以下情况下,预期的改进(EI)会很高:i)

的期望值很高 或者 ii)当一个点附近的不确定性很高。

像PI采集函数一样,我们可以通过修改ϵ来缓和EI采集函数的探索量。

对于ϵ = 0.01,我们经过几次迭代就接近了全局最大值。

现在,我们增加ϵ来探索更多。

正如我们预期的那样,将值增加到ϵ = 0.3会使采集函数进行更多的探索。与早期的评估相比,我们看到了更少的开发。我们看到它只评估全局最大值附近的两个点。

让我们进一步增加。

这比以前好吗?结果是肯定的,也是否定的。我们看到在给定ϵ = 3的情况下,我们在这里进行了过多的探索。我们很快达到了全局最大值,但却没有利用此方法在全局最大值附近获得更多收益。

汤普森采样

另一个常见的采集函数是汤普森采样。在每一步中,我们都会从代理的后验中抽取一个函数进行采样并对其进行优化。例如在采金的情况下,我们将根据证据对可能的金矿分布进行采样,并在可能性达到顶峰时进行评估(钻探)。

下图显示了从后验学习到的关于黄金开采问题的三个采样函数。训练数据由点x = 0.5和相应的函数值构成。

我们可以通过两个观测来理解汤普森采样背后的概念:

  • 具有高不确定性(σ(x))的位置在从替代后验采样的函数值中有较大方差。因此在高度不确定的区域中,样本很有可能有很高的值。优化此类样本可以帮助探索。

例如,三个样本(样本#1,#2,#3)在接近x = 6附近的方差较高。优化样本3将通过评估x = 6来帮助探索。

  • 采集的函数必须通过当前最大值,因为在评估过的位置不确定性为0。因此优化来自替代后验的样本可以确保开发行为。

作为此行为的一个示例,我们看到以上所有采样函数都通过x = 0.5处的当前最大值。如果x = 0.5接近全局最大值,那么我们能够利用并选择更好的最大值。

上图使用汤普森采样进行优化。同样我们可以在相对较少的迭代中达到全局最优。

随机性

到目前为止,我们一直在使用智能采集函数。我们可以通过随机采样x来创建随机采集函数。

上图显示随机采集函数的性能还不错!但是如果我们的优化更为复杂(更多维度),那么随机采集的效果可能会很差。

采集函数总结

现在让我们总结与采集函数相关的核心思想:

  • 它们是评估点效用的启发式方法;
  • 它们是替代后验的函数;
  • 他们将勘探与开发结合起来;
  • 评估费用不高。

其他采集函数

到目前为止,我们已经看到了各种采集函数。提出采集函数的一种简单方法是进行探索/利用。

  • 上置信界(UCB)

替代模型的均值和不确定性的线性组合就是一种能简单的权衡勘探/开发(exploration/exploitation)的采集函数。该模型的均值表示开发(我们模型的知识),而模型的不确定性则表示探索(由于我们的模型缺乏观测)。

UCB采集函数背后的思想是权衡代理的均值与代理的不确定性之间的重要性。上面的λ是可以控制开发和探索侧重的超参数。

我们可以通过组合现有的采集函数来进一步形成新的采集函数,尽管这种组合的现实解释性可能比较模糊。我们要结合两种方法的可能原因之一是要克服各个方法的局限性。

  • 改善概率(PI)+ λ×预期改善(EI-PI)

也可以是PI和EI的线性组合。我们知道PI着重于改善的可能性,而EI着重于预期的改善。基于λ的值,这样的组合可以帮助在两者之间进行权衡。

  • 高斯过程上置信界(GP-UCB)

在谈论GP-UCB之前,让我们快速谈谈regret。想象一下,如果最大黄金为a单位,而我们的优化取而代之的是在包含b <a单位的位置取样,那么我们的regret是a-b。如果我们在n次迭代中累积regret,我们将得到所谓的累积regret。

GP-UCB的公式如下:

其中t是时间步长。

Srinivas等制定了β的时间表,理论上证明了该时间表可最大程度地减少累积regret。

比较

现在我们比较不同采集函数在金矿开采问题上的表现。对于每个采集函数,我们都使用了最佳超参数。我们用不同的随机种子运行了几次随机采集函数,并绘制了每次迭代时感知到的平均金含量。

最初随机策略可与其他采集函数媲美或优于其他采集函数。但是通过随机策略感知的最大黄金增长缓慢。相比之下,其他采集函数可以在少量迭代中找到一个好的解决方案。实际上大多数采集函数仅需3次迭代就可以非常接近全局最大值。

超参数调整

在讨论贝叶斯优化超参数优化之前,我们简单地区分一下超参数和参数:超参数要在学习之前设置,然而参数要从数据中学习。为了说明差异,我们以Ridge回归为例。

在Ridge回归中,权重矩阵θ是参数,正则化系数

是超参数。如果我们通过梯度下降优化来解决上述回归问题,我们将进一步引入另一个优化参数,学习率a。

贝叶斯优化最常见的用例是超参数调整:在机器学习模型上找到性能最佳的超参数。

当训练模型并不昂贵且耗时的时候,我们可以进行网格搜索以找到最佳超参数。但是如果函数评估的成本很高,则网格搜索不可行,例如大型神经网络需要花费数天的时间进行训练。此外就超参数的数量而言,网格搜索的缩放比例很差。

我们转向贝叶斯优化,以抵消评估黑盒模型(准确性)的高额成本。

案例1-支持向量机(SVM)

在此示例中,我们使用SVM对sklearn的卫星数据集进行分类,并使用贝叶斯优化来优化SVM超参数。

  • γ-修改SVM内核的行为。直观地,它度量单个训练样本的影响;
  • C修改分类的松弛度,C越高,SVM对噪声越敏感。

现在让我们看一下有两个类和两个特征的数据集。

让我们用贝叶斯优化找到该分类任务学习的最佳超参数。注意:下图中的真实的准确率(Ground Truth Accuracies)是针对每个可能的超参数计算的,仅用于展示目的。在实际应用中我们没有这些值。通过运行高粒度网格搜索找到了<C,γ>的最佳值。

上图中的滑块,显示了“改善概率”(PI)采集函数在寻找最佳超参数方面的工作。

上图中的滑块,显示了在寻找最佳超参数时,“预期改进”(EI)采集函数的工作。

比较

下图比较了不同的采集函数。我们多次运行随机采集函数以求平均结果。

经过七次迭代,我们所有的采集都击败了随机采集函数。我们看到随机方法最初看起来似乎要好得多,但是它无法达到全局最优,而贝叶斯优化能够相当接近。贝叶斯优化最初性能不佳可能归因于初始探索。

结论与总结

在本文中,我们研究了用于优化黑盒函数的贝叶斯优化。贝叶斯优化非常适用于函数评估成本昂贵,从而使网格搜索或穷举搜索变得不切实际的情况。我们研究了贝叶斯优化的关键组成部分。

首先我们研究了使用替代函数(有目标函数空间的先验)对黑盒函数建模的过程。接下来我们学习了贝叶斯优化中的“贝叶斯”,函数评估被用作获取替代后验的数据。我们学习了采集函数,它是代理后验的函数,并按顺序进行了优化。这种新的顺序优化成本很低,因此对我们有用。我们还研究了一些采集函数,并展示了这些不同函数如何平衡勘探和开发。最后我们看了一些贝叶斯优化的实际示例,这些示例用于优化机器学习模型的超参数。

我们希望您喜欢本文,并希望您已准备好利用贝叶斯优化的力量。如果您想探索更多内容,请阅读下面的“进一步阅读”部分。我们还提供了repository

来复现整个文章。

附链接:

https://github.com/distillpub/post--bayesian-optimization

原文标题:

Exploring Bayesian Optimization

Breaking Bayesian Optimization into small, sizeable chunks.

原文链接:

https://distill.pub/2020/bayesian-optimization/

编辑:黄继彦

译者简介

王雨桐,UIUC统计学在读硕士,本科统计专业,目前专注于Coding技能的提升。理论到应用的转换中,敬畏数据,持续进化。

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

未经许可的转载以及改编者,我们将依法追究其法律责任。

本文分享自微信公众号 - 数据派THU(DatapiTHU),作者:Apoorv, Nipun

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 修改代码150万行!Apache Flink 1.9.0做了这些重大修改!(附链接)

    [ 导读 ] 8月22日,Apache Flink 1.9.0 正式发布。早在今年1月,阿里便宣布将内部过去几年打磨的大数据处理引擎Blink进行开源并向 Ap...

    数据派THU
  • 原创 | 杜绝舌尖上的浪费,大数据、人工智能、物联网能做些什么?

    今年,全球粮食生产面临着疫情、虫害等多种不利因素威胁。据联合国最新调查数据显示,在新冠肺炎冲击下,全球各国粮食产量、运输、储存等均受到较大影响,再加上蝗灾、极端...

    数据派THU
  • 独家 | 一文读懂Hadoop(二)HDFS(上)

    随着全球经济的不断发展,大数据时代早已悄悄到来,而Hadoop又是大数据环境的基础,想入门大数据行业首先需要了解Hadoop的知识。2017年年初apache发...

    数据派THU
  • 从内部自用到对外服务,配置管理的演进和设计优化实践

    本文将介绍阿里内部微服务配置中心,从集团自用、到阿里云的商业化、再到开源的整个发展历程中的实践,帮助技术同学了解在一个支持型技术团队转变成一个营收型、提供开源服...

    程序猿DD
  • 扩展和嵌入Python之C++程序中嵌入Python解释器

    在正式写代码之前,先唠叨几句环境的搭建。当时搭建环境的时候也是费了一番辛苦。【叹气】

    用户5908113
  • k8s源码-scheduler流程深度剖析

    入口函数里NewSchdulerCommand, kubernetes所有组件都使用common cli的形式,可参考cobra,NewSchedulerCom...

    ascehuang
  • 特征工程入门:应该保留和去掉那些特征

    在特征/列上执行的任何能够帮助我们根据数据进行预测的操作都可以称为特征工程。这将包括以下内容:

    deephub
  • 不完整数据库上的计数问题

    原文题目: Counting Problems over Incomplete Databases

    吴亚芳
  • Kubernetes 1.8.6 集群部署–部署Web UI界面(七)

    老七Linux
  • Selenium编写自动化用例的8种技巧

    在开始自动化时,您可能会遇到各种可能包含在自动化代码中的方法,技术,框架和工具。有时,与提供更好的灵活性或解决问题的更好方法相比,这种多功能性导致代码更加复杂。...

    FunTester

扫码关注云+社区

领取腾讯云代金券