参考资料:
Expected Improvement formula for Bayesian Optimisation
通俗科普文:贝叶斯优化与SMBO、高斯过程回归、TPE
理解贝叶斯优化
A Tutorial on Bayesian Optimization
贝叶斯优化是一种求解函数最优值的算法,它最普遍的使用场景是在机器学习过程中对超参数进行调优。贝叶斯优化算法的核心框架是SMBO (Sequential Model-Based Optimization),而贝叶斯优化(Bayesian Optimization)狭义上特指代理模型为高斯过程回归模型的SMBO。
问题介绍
\[\max_{x\in A}f(x) \]
- 输入:\(x\in R^d\) ,一般\(d\le20\),即参数在20个以内。
- 可行集(feasible set)\(A\): 一般是超多边形(\(x\in R^d: a_i\le x_i \le b_i\))或d维的simplex(\(x\in R^d: \sum_ix_i=1\))
- 在使用贝叶斯优化时,目标函数\(f\):
- 需要是连续函数
- 评估成本昂贵,能允许执行的次数有限
- 是黑盒,公式/特征未知,例如:不是凹函数、线性函数之类的。
- 因为不对函数做任何假设,所以只能访问f,不能访问其一阶、二阶导数。
- 可以有噪声,但需要假设每个观测值的噪声是独立同分布,均值为0,方差恒定。
SMBO (Sequential Model-Based Optimization)
SMBO是一套优化框架,也是贝叶斯优化所使用的核心框架。它有两个重要组成部分:
- 一个代理模型(surrogate model) ,用于对目标函数进行建模。代理模型通常有确定的公式或者能计算梯度,又或者有已知的凹凸性、线性等特性,总之就是更容易用于优化。更泛化地讲,其实它就是一个学习模型,输入是所有观测到的函数值点,训练后可以在给定任意\(x\)的情况下给出对\(f(x)\)的估计。
- 一个优化策略(optimization strategy) ,决定下一个采样点的位置,即下一步应在哪个输入\(x\)处观测函数值\(f(x)\)。通常它是通过采集函数(acquisition function) 来实现的:
采集函数通常是一个由代理模型推出的函数,它的输入是可行集(feasible set)\(A\)上的任意值,输出值衡量了每个输入\(x\)有多值得被观测。通常会从以下两方面考虑:- 有多大的可能性在x处取得最优值
- 评估x是否能减少贝叶斯统计模型的不确定性
采集函数通常也是容易求最优值的函数(例如:有公式/能算梯度,等),下一个采样点就是可行集上的最大值点,即使采集函数的取最大值的点。
该框架的主要流程是:
代理模型(Surrogate Model)
代理模型可以有很多,高斯过程、随机森林......等等。其中,贝叶斯优化(Bayesian Optimization) 狭义上特指代理模型为高斯过程回归模型的SMBO。
随机过程
随机过程(Stochastic/Random Process)可以理解为一系列随机变量的集合。更具体地说,它是概率空间上的一族随机变量\(\{X(t),t\in T\}\), 其中是t参数,而T又被称作索引集(index set),它决定了构成随机过程的随机变量的个数,大部分情况下,随机变量都是无限个的。
- 当\(T=\{0,1,2,...\}\)时称之为随机序列或时间序列
- 参数t经常被解释为时间。
- 参数空间T是向量集合时,随机过程\(\{X(t),t\in T\}\)称为随机场。
- 随机过程有时也被称为随机函数(Random Function),因为它也可以被理解为函数值是随机变量的函数。
\(X(t)\)表示系统在时刻t所处的状态。的所有可能状态构成的集合为状态空间,记为S。
随机过程的直观理解
随机过程的直观含义是我们在 t=0 时刻(此时此刻)来考虑未来每个时间点会发生的情况。
例如,当我们把\(t\)解释为时间,而\(X(t)\)解释为粒子位置时,随机过程就可以被直观地理解为粒子的一种随机运动,它在每个时刻下的位置都是随机的,并且不同时刻\(t_1\)和\(t_2\)\(X(t_1)\)\(X(t_2)\)是相关的,它们的相关性由协方差\(cov[X(t_1),X(t_2)]\)定义。
辨析随机变量和随机函数
假设:
- \(x\)是一个变量
- \(X\)是一个随机变量,它服从一个概率分布\(P(X<t)=p(t)\)
- \(f\)是一个函数,例如:\(f(x)=x+1\)
- \(g\)是一个随机函数
那么有:
- \(f(x)\)代表一个因变量,当\(x\)确定时,也确定。例如:\(f(x)=x+1\),\(f(1)=2\)
- \(f(X)\)代表一个随机变量,它的随机性是随机变量\(X\)带来的,所以它的概率分布也跟的概率分布有关。例如:\(f(x)=x+1\),\(P(f(X)<t)=P(X+1<t)=P(X<t-1)\)
- \(g(x)\)也代表一个随机变量,但它的随机性是随机过程\(g\)带来的。
高斯过程
高斯过程(Gaussian Process) 是一类随机过程\(\{F(x),x\in A\}\) ,它的任意n维分布\(\{F(x_1),...,F(x_n)\}\)(n也是任意的)都服从多元正态分布,即:对任意 有限个\(x_1,...,x_n\in A\),\(F(x_1),...,F(x_n)\)的任意 线性组合\(a_1F(x_1)+...+a_nF(x_n)\)都是一个正态分布。
正如一个正态分布可以通过指定均值和方差来确定,一个高斯过程可以通过指定均值函数 \(m(x)\) 和协方差函数 \(K(x,x')\)唯一确定:
\[\begin{align*} m(x)&=E[F(x)] \\ K(x,x')&=E[(F(x)-m(x))(F(x')-m(x'))] \end{align*} \]
则高斯过程可以表示为:
\[F(x)\sim GP(m(x), K(x, x')) \]
均值函数定义了每个索引\(x\)对应的随机变量(同时也是正态分布变量)\(F(x)\)的均值;而协方差函数不仅定义了每个索引的方差\(K(x,x')\),还定义了任意两个索引\(x_1\)、\(x_2\)对应的随机变量\(F(x_1 )\)\(F(x_1)\)\(F(x_2)\)之间的相关性\(K(x_1, x_2)\)。
在高斯过程模型里,协方差函数也被称作核函数(Kernel function)。
高斯过程回归
高斯过程回归(Gaussian Process Regression)就是使用高斯过程模型\(F(x)\)去拟合目标函数\(f(x)\)。
让我们先回顾一下,使用正态分布\(N(\mu,\sigma^2)\)去拟合一个随机变量X的步骤:
- 建模前,我们知道正态分布的均值和方差都是常数,分别假设为\(\mu\) 和\(\sigma\)。
- 对随机变量X进行t次采样,得到观测值\(x_1,...,x_t\)(简记为\(x_{1:t}\))
- 根据观测值计算出最优的\(\mu\) 和\(\sigma\)值,由此确定最终正态分布的样子,从而完成对X的拟合
高斯过程回归也是类似的:
- 建模前,我们需要事先指定好均值函数 \(m(x)\) 和协方差函数 \(K(x,x')\) ,它定义了高斯过程\(F(x)\)的先验分布。
- 有一些超参数会存在于均值函数和协方差函数中。前面提到的正态分布拟合就像是一种简化:\(m(x)=\mu\),\(K(x,x')=\sigma^2\),这里\(\mu\) 和\(\sigma\)可以被理解为是两个超参数。
- 选择t个采样索引\(x_1,...,x_t\)(简记为\(x_{1:t}\)),得到目标函数的观测值\(f(x_1),...,f(x_t)\)(简记为\(f(x_{1:t})\)),它们同样也是高斯过程里对应的随机变量\(F(x_1),...,F(x_t)\) \(F(x_1),...,F(x_t)\)\(F(x_{1:t})\))的观测值
- 根据观测值调整均值函数和协方差函数里的超参数 ,由此确定最终高斯过程的样子,从而完成对函数\(f(x)\)的拟合。
常用均值函数
-
常数函数
\[m(x)=\mu \]
这里\(\mu\)是一个超参数。即使将均值统一设置为常数,因为有方差的作用,依然能够对数据进行有效建模。
-
parametric function
\[m(x)=\mu + \sum_{i=1}^P\beta_i\Psi_i(x) \]
这里\(\mu\),\(\beta_i\)都是超参数。
常用协方差函数
在回归任务里,由于目标函数f是连续函数,因此对协方差函数最基础的要求是有该性质:
x与x'距离越近时,f(x)与f(x')相关性越大。即:
\[K(x,x_1)>K(x,x_2), \text{ if } ||x-x_1||<||x-x_2|| \]
常用协方差函数有:
-
Power exponential / Gaussian
\[K(x,x')=\alpha_0 e^{-||x-x'||^2} \]
这里\(||x-x'||^2=\sum_{i=1}^d\alpha_i(x_i-x'i)^2\),不是标准的L2范式的写法,d是自变量x的维度数量,即参数的个数。\(\alpha{0:d}\)是d+1个超参数。
-
Màtern
\[K(x,x')=\alpha_0 \frac{2^{1-\nu}}{\Gamma(\nu)}(\sqrt{2\nu}||x-x'||)^\nu K_\nu(\sqrt{2\nu}||x-x'||) \]
\(K_\nu\)是modified Bessel functions of the second kind。
如何计算超参数
采用最大后验估计(MAP,Maximum A Posterior estimate),选择在观测值已知的情况下最可能的超参数值。
\[\hat{\eta}=\text{argmax}{\eta}{P(\eta|F(x{1:t})=f(x_{1:t}))} \]
\(\eta\)代表超参数集合,\(P(\eta|F(x_{1:t})=f(x_{1:t}))\)代表在得到所有观测值的情况下,超参数的概率分布。
使用贝叶斯公式进行转换:
\[P(\eta|F(x_{1:t})=f(x_{1:t}))=\frac{P(F(x_{1:t})=f(x_{1:t})|\eta)P(\eta)}{P(F(x_{1:t})=f(x_{1:t}))} \]
这也是以高斯过程为代理模型的SMBO又被叫做贝叶斯优化的原因。
由于分母与超参数无关,因此只需要最大化分子:
\[\hat{\eta}=\text{argmax}{\eta}{P(F(x{1:t})=f(x_{1:t})|\eta)P(\eta)} \]
\(P(F(x_{1:t})=f(x_{1:t})|\eta)\)是给定参数的情况下,得到所有观测值的概率。
\(P(\eta)\)是超参数取值的先验概率,在某些问题,可以假设某些参数更可能被使用。但更常见的情况是假设其为等概率分布,那么MAP就是退化为最大似然估计(MLE, Maximum Likelihood Estimate),即选择使观测值最可能出现的超参数值:
\[\hat{\eta}=\text{argmax}{\eta}{P(F(x{1:t})=f(x_{1:t})|\eta)} \]
由于在高斯过程中,观测点\(x_{1:t}\)对应的随机变量构成的多维随机变量[\(F(x_1),...,F(x_t)\)](简记作\(F(x_{1:t})\))服从多元正态分布。其中,
-
分布的均值是一个t维向量:\(\mathbf{\mu_t}=[m(x_1),...,m(x_t)]\)。其中,\(m(x_i)\)代表第i个随机变量\(F(x_i)\)的期望/均值\(E[F(x_i)]\)。
-
分布的协方差矩阵是一个\(t\times t\)的矩阵,记作:
\[\mathbf{\Sigma_t} =\begin{bmatrix} K(x_1,x_1)&...&K(x_1,x_t) \\ ...&...&... \\ K(x_t,x_1)&...&K(x_t,x_t) \\ \end{bmatrix} \]
概率密度函数为
\[L(x_{1:t}|\eta)=\frac{1}{\sqrt{(2\pi)^t|\mathbf{\Sigma_t}|}}e^{-\frac{1}{2}(x_{1:t}-\mathbf{\mu_t})^T\mathbf{\Sigma_t}^{-1}(x_{1:t}-\mathbf{\mu_t})} \]
由于观测点\(x_{1:t}\)是已知的,因此,它是一个以超参数为变量的函数,我们可以选择使该概率(密度)最大化的超参数值。
转化为对数似然函数:
\[\ln{L(x_{1:t}|\eta)}=-\frac{1}{2}[t\ln{2\pi}+\ln{|\mathbf{\Sigma_t}|}+(x_{1:t}-\mathbf{\mu_t})^T\mathbf{\Sigma_t}^{-1}(x_{1:t}-\mathbf{\mu_t})] \]
要最大化它,即是最小化:
\[M(x_{1:t}|\eta)=\ln{|\mathbf{\Sigma_t}|}+(x_{1:t}-\mathbf{\mu_t})^T\mathbf{\Sigma_t}^{-1}(x_{1:t}-\mathbf{\mu_t}) \]
它是一个已知公式可以求梯度的函数,因此在编程中可以通过梯度下降等方法去求解其最优值。
预测\(f(x)\)
在SMBO框架下,代理模型预测的不仅仅是函数值\(f(x)\),而是它的后验分布\(F(x)|F(x_{1:t})=f(x_{1:t})\),即,在已知t个观测点的值的情况下,\(f(x)\)取不同值的概率。
由于在高斯过程里,也符合多元正态分布,因此就是多元正态分布的条件分布(或边缘分布)。这个分布服从正态分布,其均值和方差如下:
\[\begin{align*} F(x)|F(x_{1:t})=f(x_{1:t})&\sim N(\mu, \sigma^2) \\ \mu(x) &= K(x,x_{1:t})K(x_{1:t},x_{1:t})^{-1}(f(x_{1:t})-m(x_{1:t}))+m(x)\\ \sigma^2(x)&=K(x,x)-K(x,x_{1:t})K (x_{1:t}, x_{1:t})^{-1}K(x_{1:t},x)\end{align*} \]
其中,
\[m(x_{1:t})=[m(x_1),...,m(x_t)] \]
\[K(x_{1:t}, x_{1:t}) =\begin{bmatrix} K(x_1,x_{1:t}) \\ ... \\ K(x_t,x_{1:t}) \end{bmatrix} =\begin{bmatrix} K(x_1,x_1)&...&K(x_1,x_t) \\ ...&...&... \\ K(x_t,x_1)&...&K(x_t,x_t) \\ \end{bmatrix} \]
由于均值函数\(m(x)\)、协方差函数\(K(x,x')\)都是确定公式的函数,公式里的超参数也确定下来了,因此\(\mu (x)\)和\(\sigma^2(x)\)都是确定的函数,对任意给定的\(x\),都可以计算出值来。
通常,我们使用这个后验分布的期望/均值来作为函数值\(f(x)\)的预测值:
\[f(x)\leftarrow E[F(x)|F(x_{1:t})=f(x_{1:t})]=\mu(x) \]
【命题1】对任意\(A=[a_1,...,a_t]^T\),\(i=1,...,t\),都有\(K(x_i,x_{1:t})K(x_{1:t},x_{1:t})^{-1}A=a_i\)。证明见附录。
因此,对于已经观测到的点\(x_i,i=1,...,t\),我们就有:
\[\begin{align*} \mu(x_i)&=f(x_i)-m(x_i)+m(x_i)=f(x_i)\\ \sigma^2(x_i)&=K(x_i,x_i)-K(x_i,x_i)=0 \\ \end{align*} \]
因此,拟合出来的模型就像这样:
红色阴影部分是预测的95%置信区间。
采集函数(Acquisition Function)
由于代理模型输出了函数f的后验分布\(F(x)|F(x_{1:t})=f(x_{1:t})\),我们可以利用这个后验分布去评估下一个采样点应该在哪个位置。由于在采集函数阶段我们讨论的都是后验分布,因此后文中将省略条件部分,提到\(F(x)\)时指的都是\(F(x)|F(x_{1:t})=f(x_{1:t})\)。
通常做法是设计一个采集函数\(A(x, F(x)|F(x_{1:t})=f(x_{1:t}))\),它的输入相当于对每个采样点x进行打分,分数越高的点越值得被采样。
一般来说,采集函数需要满足下面的要求:
- 在已有的采样点处采集函数的值更小,因为这些点已经被探索过,再在这些点处计算函数值对解决问题没有什么用
- 在置信区间更宽(方差更大)的点处采集函数的值更大,因为这些点具有更大的不确定性,更值得探索
- 对最大(小)化问题,在函数均值更大(小)的点处采集函数的值更大,因为均值是对该点处函数值的估计值,这些点更可能在极值点附近。
有非常多种采集函数可供选择,这里简单介绍一些作为例子。
Expected Improvement (EI)
当我们已经采样过t个点之后,总会有一个最优点\(x_m\),使得:
\[f^*t=max{i<t}f(x_i)=f(x_m) \]
假设我们还可以再观测一轮,得到\(F(x)=f(x)\),最优点将在\(f(x)\)和\(f^*_t\)之间产生。不妨令
\[[F(x)-f^*_t]^+=\max(0, F(x)-f^*_t) \]
由于现在\([F(x)-f^*_t]^+\)是一个随机变量,因此我们可以计算它的期望:
\[\begin{align*} EI_t(x)&=E[[F(x)-f^*_t]^+] \\ &=\sigma(x)\phi(\frac{\mu(x)-f^*_t}{\sigma(x)})+(\mu(x)-f^*_t)\Phi(\frac{\mu(x)-f^*_t}{\sigma(x)}) \\ \end{align*} \]
其中,\(\mu(x)\)和\(\sigma(x)\)是正态分布\(F(x)\)的均值和标准差,即后验均值和标准差\(\sqrt{\sigma^2(x)}\)。
\(\varphi(x)\)为标准正态分布的概率密度函数:
\[\varphi(x)=-\frac{1}{\sqrt{2\pi}}g(x)=\frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}} \]
而\(\Phi(x)\)为标准正态分布的分布函数:
\[\Phi(x)=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^xe^{-\frac{t^2}{2}}dt \]
\(EI_t(x)\)也是一个仅以x为自变量的函数,它的最大值点就是下一个采样点。
\[\hat{x}=\text{argmax}_{x}{EI_t(x)} \]
由于\(EI_t(x)\)有公式,计算不费劲,也可以求梯度,找到它的最大值/极大值有很多种现成的方案可以做到,相比于求原目标函数\(f(x)\)的最值要简单得多。
-
\(EI_t(x)\)推导过程
由于\(F(x)\)是正态分布,因此可以通过其概率密度计算出期望:
\[\begin{align*} EI_t(x)&=E[[F(x)-f^*t]^+] \\ &=\frac{1}{\sigma\sqrt{2\pi}}\int{-\infty}^{\infty}[z-f^*t]^+e^{-\frac{(z-\mu)^2}{2\sigma^2}}dz \\ &=\frac{1}{\sigma\sqrt{2\pi}}\int{f_t^*}^{\infty}(z-f^*_t)e^{-\frac{(z-\mu)^2}{2\sigma^2}}dz \end{align*} \]
令\(k=\frac{z-\mu}{\sigma}\)(也是把随机变量\(F(x)\)标准化),通过换元法可以得到:
\[\begin{align*} EI_t(x)&=\frac{1}{\sigma\sqrt{2\pi}}\int_{f_t^*}^{\infty}(z-f^*t)e^{-\frac{(z-\mu)^2}{2\sigma^2}}dz \\ &=\frac{1}{\sqrt{2\pi}}\int{\frac{f_t^*-\mu}{\sigma}}^{\infty}(\sigma k+\mu-f^*t)e^{-\frac{k^2}{2}}dk \\ &=\frac{\sigma}{\sqrt{2\pi}}\int{\frac{f_t^*-\mu}{\sigma}}^{\infty}ke^{-\frac{k^2}{2}}dk+(\mu-f^*t)(1-\frac{1}{\sqrt{2\pi}}\int{-\infty}^{\frac{f_t^*-\mu}{\sigma}}e^{-\frac{k^2}{2}}dk) \end{align*} \]
由于对\(g(x)=-e^{-\frac{x^2}{2}}\),有\(g'(x)=xe^{-\frac{x^2}{2}}\)。因此
\[\int_{\frac{f_t^*-\mu}{\sigma}}^{\infty}ke^{-\frac{k^2}{2}}dk=g(\infty)-g(\frac{f_t^*-\mu}{\sigma})=-g(\frac{f_t^*-\mu}{\sigma}) \]
继续化简:
\[\begin{align*} EI_t(x)&=E[[F(x)-f^*_t]^+] \\ &=-\frac{\sigma}{\sqrt{2\pi}}g(\frac{f_t^*-\mu}{\sigma})+(\mu-f^*_t)(1-\Phi(\frac{f^*_t-\mu}{\sigma})) \\ &=\sigma\phi(\frac{f^*_t-\mu}{\sigma})+(\mu-f^*_t)[1-\Phi(\frac{f^*_t-\mu}{\sigma})] \\ \end{align*} \]
由于\(\varphi(x)\)是偶函数,且\(\Phi(x)+\Phi(-x)=1\),则有
\[\begin{align*} EI_t(x)&=E[[F(x)-f^*_t]^+] \\ &=\sigma\phi(\frac{\mu-f^*_t}{\sigma})+(\mu-f^*_t)\Phi(\frac{\mu-f^*_t}{\sigma}) \end{align*} \]
置信区间边界(Confidence Bound)
对于标准正态分布\(X\sim N(0,1)\),给定任意关于\(x=0\)对称的区间\([-z,z]\),可以通过对概率密度进行积分计算出一个概率p,表示符合标准正态分布的随机变量的值落在该区间的概率为p。
z和p是一一对应的,可以令\(z=\delta(p)\),由正态分布的性质可知,显然
\[p=\delta^{-1}(z)=P(X<z)=\int_{-\infty}^z\varphi(t)dt=\frac{1+p}{2},\ z\ge 0 \]
\(\delta^{-1}(z)\)就是\(\delta(p)\)的反函数。
假设对于给定置信水平p,随机变量\(X\)落在置信区间\([-z,z]\)的概率为p,\(z=\delta(p)\)。
由于\(F(x)\sim N(\mu,\sigma)\),它可以由标准正态分布转化过来:
\[F(x)=\sigma X+\mu \]
那么对于\(F(x)\sim N(\mu,\sigma)\),当给定置信水平p时,其置信区间就为\([-\mu-z\sigma,\mu+z\sigma]\)。
可以采用该置信区间的边界作为采集函数。例如,在本文中我们讨论**最大化f(x)**的优化问题,通常就会使用区间的右边界UCB(Upper Confidence Bound):
\[UCB_t(x)=\mu(x)+z\sigma(x) \]
其中z是超参数,由想要的置信水平p决定:\(z=\delta(p)\)。
UCB越大,说明在该位置有更高的可能性找到更大的值。
同理,在最小化问题中,通常就会使用区间左边界LCB(Low Confidence Bound):
\[LCB_t(x)=-\mu(x)-z\sigma(x) \]
Appendix
命题1证明
【命题1】对任意\(A=[a_1,...,a_t]^T\),\(i=1,...,t\),都有\(K(x_i,x_{1:t})K(x_{1:t},x_{1:t})^{-1}A=a_i\)。
令\(K(x_i,x_{1:t})K(x_{1:t},x_{1:t})^{-1}=[z_1,...,z_t]\),那么有
\[\begin{align*} K(x_i,x_{1:t})K(x_{1:t},x_{1:t})^{-1}K(x_{1:t},x_{1:t})&=[z_1,...,z_t]K(x_{1:t},x_{1:t}) \\ K(x_i,x_{1:t})&=[\sum_{j=1}^t{z_jK(x_j,x_1)},...,\sum_{j=1}^t{z_jK(x_j,x_t)}] \\ \end{align*} \]
上述式子需对任意\(K(x,x')\)都成立。列出方程组,得:
\[\left\{\begin{align*} \sum_{j=1}^t{z_jK(x_j,x_1)}&=K(x_i,x_1) \\ ... \\ \sum_{j=1}^t{z_jK(x_j,x_t)}&=K(x_i,x_t) \end{align*}\right. \]
由于\(K(x_{1:t},x_{1:t})\)可以求逆,因此它是满秩的,这意味着上面的方程组一定有唯一解。
经过变换得出:
\[\left\{\begin{align*} \sum_{j\neq i}{z_jK(x_j,x_1)}&=(1-z_i)K(x_i,x_1) \\ ... \\ \sum_{j\neq i}{z_jK(x_j,x_t)}&=(1-z_i)K(x_i,x_t) \end{align*}\right. \]
由于右侧的项都是一样的,而左侧\(K(x_i,x_j),j=1,...t\)各有不同,要想使他们相等,就必须等于0。因此解得:
\[\left\{\begin{align*} z_i&=1& \\ z_j&=0&, j\neq i,j=1,...t \end{align*}\right. \]
故有:对任意\(A=[a_1,...,a_t]^T\),\(i=1,...,t\),都有\(K(x_i,x_{1:t})K(x_{1:t},x_{1:t})^{-1}A=a_i\)。