当前的场景中,会面临很多设计选择问题。比如说在工程师进行方案设计的时候,需要考虑多种细节选择,才能做出一个稳定可靠的方案。糕点师傅在做蛋糕时,会决定各种配料应该使用多少才能做出好吃的蛋糕……在如此多的需要设计选择的场景中,往往需要从多个维度,多个方面去考虑。有时候需要面对很多种选择。对于资深有经验的人,可以从多种选择中快速选择出能够满足要求的方案,比如专业的糕点师很快能知道,要做出一款美味的蛋糕,需要使用几勺糖,多少毫升牛奶,多少克面粉……而对于我这种小白,我可能需要不断去尝试,首先根据自己的尝试任意进行配比,然后做出蛋糕之后品尝一下,看看是否好吃。如果觉得不好吃,还需要重新再组合一个方案,然后再把蛋糕做出来试吃。经过多次迭代后,在浪费了大量的时间和食材(简直惨绝人寰)之后,终于做出了好吃的蛋糕。
然而在很多其他场景中,进行一次方案可行性测试的成本可能非常高。比如说我们不是做蛋糕,是对机器学习模型的参数进行调试,模型的效果怎么样需要运行实际的任务才能知道。但是运行一个要两周才能运行出结果的任务(这种需要较长时间运行的任务是存在的),那么明显按照我做蛋糕那种方法去运行任务,那在得出较好的参数方案的时候需要无法忍受的时间,因此显然是不可取的。另一方面,刚才我们做蛋糕,可能只需要对面粉量、牛奶量、糖量等几个维度进行选择。但是有的场景下,需要对上百个维度进行选择,同时各个维度可选的候选空间也非常大。此外,各个维度属性可能有内部的相互影响。那么靠人工的方法,几乎很难找到最优的维度组合方案。因此在这种情形下,贝叶斯优化算法(BOA)就可以派上用场了。当前BOA运用很广泛,包括用于组合优化、自动机器学习、增强学习、气象、机器人等等
首先为了便于讨论问题,我们形式化一下。贝叶斯优化算法(BOA)主要面向的问题场景是:
公式(1)中,S是x的候选集。目标是从S中选择一个x,使得 f(x) 的值最小或者最大。可能 f(x) 的具体公式形态无法得知,但是假如选择一个 x ,可以通过实验或者观察得出 f(x) 的值。 f(x) 是一个黑盒的函数。对应到背景中我们做蛋糕的例子,就是 S 是各个原料的组合候选集, x 就是其中的具体某一种方案(如白糖15g,牛奶13ml……)。而 f(x) 的结果就是蛋糕的味道。选择了一个原料组合方案 x ,那么可以通过实验的方法获得在该方案下蛋糕的口感 f(x) 。
那么,现在我们的目标就是从 S 中,找到一个 x 使得 f(x) 最大(最小)。其基本的思想是首选对 f(x) 有一个猜想的先验分布模型,然后利用后续新获取到的信息,来不断优化那个猜想模型,使模型越来越接近真实的分布。
上面这个图是个大致的简图。先不用太深入,我们先简单看看流程。
Step(1)
第一步首先是有一个先验的猜想。既然我们是需要求出满足条件的 x ,那么如果我们知道了 f(x) 的函数曲线图,是不是就可以直接算出 x 了呢?但是我们不知道 f(x) 长什么样,函数有什么分布特点。所以我们只能先猜一下。一般我们常见的假设是 f(x) 函数满足高斯分布(GP),就是正态分布,通俗地讲就是假如两个点 x1,x2 比较接近,那么对应的 y1,y2 也是比较接近。高斯分布回归.当然除了GP也还有其他分布,对于不同问题需要选用不同的分布假设。假如这里我们选用了高斯分布,现在我如果有两组(任意组)数据 [x0,f(x)0], [x1,f(x)1] ,将这两组数据输入GP模型中,两个真实值加入猜想模型,能够对模型进行修正,使其更接近目标函数真实的分布**。
Step(2)
第一步有了修正后的GP。我们根据某些方法,来从修正后的GP中,选择一个感兴趣的点 xi 。选择的标准是,相对于候选集中的其他点,假如给GP输入 [xi,f(xi)] ,会使得GP更快更准确地向目标函数的真实分布接近,也就是GP的收益最大。或者这个点相对于目标函数中的其他点,他的 f(xi) 更优。
Step(3)
选出了一个新的 xi 之后,利用实验或者观察或者什么方式,获取到 f(xi) 之后,判断选出的这个点是否是我们想找到的点。这个点可能是一个最优解,也可能是个较优解。假如符合我们的目标需求,比如选出的这个蛋糕配置方案做出来的蛋糕已经是还算好吃的了,那么就可以终止算法推出,得出我们想要的 x 。
Step(4)
反之,假如上一步找出的点还达不到我们的需求,那这个点也不能浪费,将其输入返回到GP模型,再次对其修正,重新开始Step(2)
经过上面的初步分析后,我们大概了解了贝叶斯优化的整个流程。从上面描述的流程可以看出,贝叶斯优化最核心的步骤是Step(1),Step(2)。在Step(1)中我们猜想的分布模型,以及Step(2)中支持我们做出选择新的点的方法,这里我们定义一下一般这个方法叫Acquisition function(后面简称AC函数)。这个收益(损失)函数指导我们选择下一个点。只要把这两个东西确定了,那么整个算法就确定了。从这里也可以看出BOA是一个迭代运行的算法框架,由两个组件组成,一个是先验模型,一个是AC函数。这两者的作用分别如下:
上面说了BOA最核心的两个组件Prior Function以及Acquisition Function(AC)。
上面说到,当我们不知道目标函数曲线是什么样的时候,我们就只能猜(概率)。主要的方式有含参、不含参、线性、非线形等。比如有高斯过程(GP),认为目标函数满足多变量高斯分布。当然也有存在其他的函数,在选择PF的时候,需要谨慎选择模型,不同的模型效果是不一样的。
在经历过PF的选择后,那么就要对PF模型进行进一步修正。让他修正的方法很简单,就是给他尽量滴提供更多的真实样本点 [xi,f(xi)] 呗。那么应该提供什么样本点呢?假如我们把所有候选集中的样本点都提供给模型,那么目标函数曲线其实就出来了。但是很明显,根据BOA的使用场景,我们无法将所有的样本点都提供出来,因为产生一个真实样本点的成本很高。那么我们就应该选择那种能够提供更多信息给模型的点。就像我们打游戏,假如我们血有限的话,那么就尽量去打得分多的怪。那么AC函数(Acquisition Function)就指导我们如何选点。那么AC函数也分很多种类。
Improvement-based policies
这种方法的基本思想是选择收益最高的点。包括如PI、EI等方式
[1] Taking the Human Out of the Loop: A Review of Bayesian Optimization
算法部分讲的很简单,后面再进行补充。文中有理解不正确的地方,欢迎各位大佬拍砖