Zen的小站

小舟从此逝,江海寄余生

0%

【算法】贝叶斯优化

这篇blog参考github上一个基于高斯过程回归的贝叶斯优化开源项目(python):https://github.com/fmfn/BayesianOptimization

AutoMLBOSMBO{GPR, TPE}

贝叶斯优化器的介绍

  贝叶斯优化在不知道目标函数(黑箱函数)长什么样子的情况下,通过猜测黑箱函数长什么样,来求一个可接受的最大值。和网格搜索相比,优点是迭代次数少(节省时间),粒度可以到很小,缺点是不容易找到全局最优解。
  贝叶斯优化流程图如下:

在这里插入图片描述

贝叶斯优化有两个核心过程,先验函数(Prior Function,PF)与采集函数(Acquisition Function,AC),采集函数也可以叫效能函数(Utility Funtcion),但一般还是称呼为采集函数,见下面引用论文A Tutorial on Bayesian Optimization of Expensive Cost Functions, with Application to Active User Modeling and Hierarchical Reinforcement Learning的话。PF主要利用高斯过程回归(GPR(高斯分布) vs. TPE(好成绩比坏成绩));AC主要包括EI,PI,UCB这几种方法,同时exploration与exploitation的平衡,也是通过AC来完成的。

采集函数(Acquisition Function,AC)

  常见的采集函数有下面三种,UCB,PI,EI,先介绍最好理解的UCB。

UCB(Upper confidence bound)

  $UCB=\mu (x)+k\sigma (x)$,k为调节参数,直观地理解为上置信边界。

PI(probability of improvement)

​ $P I(x)=P(f(x) \geq f(x^{+})+U)=\Phi(\frac{\mu(x)-f(x^{+})-v}{\sigma(x)})$
​ 超参数 $v$ 用于调节exploitation与exploitation,$v=0$ 更倾向于收敛到$f(x^{+})$附近,$\Phi(\cdot)$表示正态累计分布函数 ,$f(x^{+})$表示现有的最大值 。
 其原理就是找到未知点的函数值比$f(x^{+})$大的概率,取这些点中概率最大的点,具体比$f(x^{+})$ 大多少不考虑,这里通过Z-scores标准化法,让每个未知点函数值大于$f(x^{+})$ 的概率可以进行比较。

​ Z-scores标准化法,$ \frac{x \mu} \sigma$,x为观察点,$\mu$为所有观察点的均值,$\sigma$为所有观察点标准差,$ \frac{x \mu} \sigma$ 的概率密度函数符合标准正态分布。

EI(Expected improvement)

​ 后续再补上

贝叶斯优化的一个模拟实验

 假设我们想知道下面这个黑箱函数在(-2,10)的最大值,$f(x)=e^{-(x-2)^{2}}+e^{\frac{-(x-6)^{2}}{10}}+\frac{1}{x^{2}+1}$,最大值大概是14,我们假定找到一个点其函数值大于13,就已经可以接受了,返回该函数值。

img

探索(exploration)与利用(exploitation)

  探索(exploration):简单来说就是尽量选择远离已知点的点为下一次用于迭代的参考点,即尽量探索未知的区域,点的分布会尽可能的平均。
  利用(exploitation):简单来说就是尽量选择靠近已知点的点为下一次用于迭代的参考点,即尽量挖掘已知点周围的点,点的分布会出现一个密集区域,容易进入局部最大。

​ 在上文提到的github项目中,通过kappa这个参数平衡探索和利用,如上,上面的图kappa=0.1,下面的图kappa=10,我们下面的代码取kappa等于1.96,即U C B = μ ( x ) + 1.96 σ ( x ) UCB=\mu (x)+1.96\sigma (x)UCB=μ(x)+1.96σ(x),github示例中kappa取的是中间值5,这里取1.96是为了让下面演示贝叶斯优化过程中,UCB就是95%置信区间的上界,更好理解UCB是什么,详细请看下面的贝叶斯优化过程。

tt0.top-284371

虚线表示高斯回归过程求得的未知点的均值$\mu$ ,蓝色区域表示标准差$ \sigma$

贝叶斯优化的应用

  贝叶斯优化器用于调参,可以很快找到一个可以接受的超参数值,和网格搜索相比,优点是迭代次数少(节省时间),粒度可以到很小,缺点是不容易找到全局最优解。例如我们想调logistic回归的正则化超参数,就把黑箱函数设置成logistic回归,自变量为超参数,因变量为logistic回归在训练集准确度,设置一个可以接受的黑箱函数因变量取值,例如0.95,得到的超参数结果就是可以让logistic回归分类准确度超过0.95的一个超参数。

原文链接

通俗科普文:贝叶斯优化与SMBO、高斯过程回归、TPE - 知乎 (zhihu.com)

Acquisition function / Expected Improvement (EI)

python实现方法

python有3个库支持,bayes_opt、hyperopt、optuna,以下详细介绍bayes_opt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from bayes_opt import BayesianOptimization

def run(a, b, c): # 定义函数,可以输入多个数,输出保证一个
return a+b+c

# 定义输入值范围(名称要与函数用的相同)
inputs = {'a': (0,1), 'b': (2,3), 'c': (1,2)}

# 实例化贝叶斯对象
opt = BayesianOptimization(run, inputs)

# 优化器求解,返回
# 只支持求最大值
opt.maximize(init_points=5,
n_iter=30, acq=init_bayes.get('acq')) # AC方法

#优化完成,取出最佳参数与最佳分数
params_best = opt.max["params"]
score_best = opt.max["target"]

详细参考这篇

用sklearn高斯过程回归

1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.gaussian_process import GaussianProcessRegressor
import numpy as np

a=np.random.random(50).reshape(50,1)
b=a*2+np.random.random(50).reshape(50,1)
# 实例化高斯过程对象
gaussian=GaussianProcessRegressor()
# 高斯过程回归
gaussian.fit(a,b)

c=np.linspace(0.1,1,100)
d=gaussian.predict(c.reshape(100,1))

多想多做,发篇一作

-------------本文结束感谢您的阅读-------------
// 在最后添加