贝叶斯优化应用背景
如果待解决问题为中输入 x x x,输出 f ( x ) f(x) f(x)具有如下的特点:
- 函数 f ( x ) f(x) f(x)计算量特别大,每次计算都特别耗时、耗资源,甚至 f ( x ) f(x) f(x)可能都没有解析式表达式。
- 无法知道函数 f ( x ) f(x) f(x)对于 x x x的梯度应该如何计算。
- 需要找到函数 f ( x ) f(x) f(x)在 x x x自变量上的全局最优解(最低点对应的取值)。
什么是贝叶斯优化
有一个目标函数c(x),代表输入为x下的代价为c(x)。优化器是无法知道这个c(x)的真实曲线是如何的,只能通过部分(有限)的样本x和对应的c(x)值。假设这个c(x)如图所示
贝叶斯优化器为了得到c(x)的全局最优解,首先要采样一些点x来观察c(x)长什么样子,这个过程又可以叫surrogate optimization(替代优化),由于无法窥见c(x)的全貌,只能通过采样点来找到一个模拟c(x)的替代曲线,如图所示:
得到这个模拟的/替代的曲线之后,我们就能找到两个还算不错的最小值对应的点了(上图中标注的是promising minima),于是根据当前观察到的这两个最小点,再采样更多的点,用更多的点模拟出一个更逼真的c(x)再找最小点的位置,如图所示
然后我们重复上面这个过程,每次重复的时候我们干以下几件事情:先找到可拟合当前点的一个替代函数,然后根据替代函数的最小值所在的位置去采样更多的 ,再更新替代函数,如此往复。
函数替代的例子: 给定x的取值范围,那么一个复杂的函数y = arcsin(( 1- cos(x) * cos(x)) / sinx) 则可以用y=x来替代。
如果我们的c(x)不是特别奇怪的话,一般来说经过几次迭代之后,我们就能找到c(x)的最优解。再回头来看上面这个过程,贝叶斯优化的厉害的地方:几乎没有对函数c(x)做任何的假设限定,也不需要知道c(x)的梯度,也不需要知道c(x)到底是个什么解析表达式,就直接得出了c(x)的全局最优。
以上例子中有两个重要的点:
1、用什么函数作为替代函数(选择函数进行curve-fiting的过程),对应Gaussian Processes;
2、如何根据当前信息和替代函数的局部最优点继续采样x,对应acquisition function。
为什么可以用Gaussian Processes对曲线进行拟合呢?
(总共4个黑色的点,代表4个数据点。左边是Gaussian process产生的多个函数曲线(红、蓝、黄等曲线);右边的图显示的是左图的那些函数都会经过黑点,以及函数值的波动范围(灰色部分)。)
Gaussian Processes的一个非常大的优点:“先验知识”可以根据新观测量更新,而Gaussian Processes又可以根据这个更新后的“先验知识”得到新的function的分布,从而更好的拟合数据点。也就是:如果我们观测了3个函数值,那么有一种高斯分布和这三个观测的数据点对应,而如果我们观测了4个点,又可以新计算一个对应的高斯分布。
这里简单以下图为例描述一下:Gaussian Process是如何根据拟合数据,然后对新的数据做预测?
如图所示,假设现已观测到3个点(左边黑色的3个圈),假设这计算得到3个函数值分布是
f
∽
N
(
0
,
K
)
f\backsim N(0,K)
f∽N(0,K) ,Gaussian Process的理论告诉我们(具体理论先略了)给定一个新的输入
x
∗
x_*
x∗ (左图蓝色
x
∗
x_*
x∗),我们可以按照左下角的方式计算出与蓝色
x
∗
x_*
x∗对应的
f
(
x
∗
)
f(x_*)
f(x∗) 的均值和方差,也就是输出的范围。
**acquisition function在决定如何选取新的采样点是面临两个经典问题:exploitation和exploration,称之为深度和广度。**以下图例子来看,
exploitation意味着尽可能顺着当前已知的信息,比如顺着黑色点的地方来采样更多的点,也就是深度。当已知信息利用到一定程度,这种exploitation方向的采样会很少有信息增益。
exploration顾名思义就是更趋向探索性质,比如顺着图右边的灰色区域较大的地方探索,也就是广度,探索更多未知的地方。
(总共4个黑色的点,代表4个数据点。左边是Gaussian process产生的多个函数曲线(红、蓝、黄等曲线);右边的图显示的是左图的那些函数都会经过黑点,以及函数值的波动范围(灰色部分)。)
假设我们把acquisition functin简写为aq(x),整个贝叶斯优化可以概括为:
(1)基于Gaussian Process,初始化替代函数的先验分布;
(2)根据当前替代函数的先验分布和aq(x),采样若干个数据点。
(3)根据采样的x得到目标函数c(x)的新值。
(4)根据新的数据,更新替代函数的先验分布。
(5)并开始重复迭代2-4步。
(6)迭代之后,根据当前的Gaussian Process找到全局最优解。
也就是说贝叶适优化实际上是:由于目标函数无法/不太好 优化,那我们找一个替代函数来优化,为了找到当前目标函数的合适替代函数,赋予了替代函数概率分布,然后根据当前已有的先验知识,使用acquisition function来评估如何选择新的采样点(trade-off between exploration and exploitation),获得新的采样点之后更新先验知识,然后继续迭代找到最合适的替代函数,最终求得全局最优解。
贝叶斯优化偏公式的定义
结合上面的形象描述和公式定义描述,总结以下贝叶斯优化的两个重点:
- **定义一种关于要优化的函数/替代函数的概率分布,这种分布可以根据新获得的数据进行不断更新。**我们常用的是Gaussian Process。
- **定义一种acquisition function。**这个函数帮助我们根据当前信息决定如何进行新的采样才能获得最大的信息增益,并最终找到全局最优。
贝叶斯优化的应用
用python来跑几个例子看看。以下例子需要安装Gpy和GpyOpt这两个python库。
假设我们的目标函数是:这个函数定义在[-1,1]之间,通常也叫domain。这个函数在定义区间的最优点是:x 。于是代码为
import GPyOpt
def myf(x):
return x ** 2
bounds = [{'name': 'var_1', 'type': 'continuous', 'domain': (-1,1)}]
# 变量名字,连续变量,定义区间是-1到1
max_iter = 15
# 最大迭代次数
myProblem = GPyOpt.methods.BayesianOptimization(myf,bounds)
#用贝叶适优化来求解这个函数,函数的约束条件是bounds
myProblem.run_optimization(max_iter)
#开始求解
print(myProblem.x_opt)
#打印最优解对应的x为-0.00103
print(myProblem.fx_opt)
#打印最优解对应d的函数值为0.0004