贝叶斯优化简介

绪论

简要的说贝叶斯优化是一种基于贝叶斯方法的搜寻函数(特别是高维非线性非凸函数)全局极值的方法。一般来说作为被优化对象的函数的解析形式是未知的,但对于其定义域内的点我们有办法求其函数值。对于非线性非凸函数的优化问题,常规的方法包括:梯度下降(上升)法,通过计算或估计一阶的梯度决定搜索方向以迭代的方式寻找极值点;还有二阶的方法,比如牛顿法、BFGS算法,计算或估计二阶导数(如果是高维则计算或估计Hessian矩阵)和梯度结合决定搜索方向和步长以迭代方式寻找极值点。在常规方法中对象函数被认为是确定的,它可能是已知的也可能未知,但在迭代过程中它被认为是确定的对象,每一步迭代帮我们改进对此确定函数及其极值的估计。贝叶斯优化以另外一个角度看待作为优化对象的函数,函数不再被认为是确定的,而是被当成一个满足某种分布(prior,先验分布)的随机过程(下面将有详细介绍),通过在定义域内求其函数值我们以贝叶斯公式更新对分布的估计(posterior,后验分布),然后根据新的分布我们在定义域内找到最可能的极值点位置来求其函数值;通过重复上述过程我们对极值的估计会变得越来越精确。根据上述过程贝叶斯优化可以归纳为三步:1)更新:根据对函数值的观测历史更新随机过程的分布;2)测量点确定:根据新的分布找出最可能的极值点位置;3)测量:在上一步确定的位置计算待优化函数的值,形成新的观测历史,然后回到第一步。从上面的描述中我们可以看出贝叶斯优化和传统优化方法之间的关系类似于贝叶斯统计和频率统计的关系。

下面我对贝叶斯优化涉及的一些重要概念和实施步骤做进一步介绍。首先要对贝叶斯优化有更深的理解需要我们基本掌握概率和随机过程的概念;在这个基础上再来看我们如何将贝叶斯公式应用到随机过程概率分布的更新;有了新的概率分布我们会用优化的方法寻找新的最可能是极值点的测量点,注意这里有一个嵌套的优化问题,这个嵌套优化问题的目标函数被称为acquisition function,这里我把它翻译为收效函数(通过最大化收效函数找到最可能的目标函数极值点);最后介绍几个贝叶斯优化的应用实例。

概率空间与随机过程

随机过程的概念对我们准确理解贝叶斯优化致关重要,而概率空间对于我们理解随机过程又致关重要。在一般大学本科阶段非数学系概率统计课程中一般都不会有关于概率的正式的数学定义,而是依赖于我们对概率的直观理解。对于处理定义在数域上的随机变量,或是有限分离维度随机向量,直观的概率理解也就够用了。但对于随机过程,也就是将随机变量随机向量扩展到连续无限维度的函数空间,比较正式的概率定义有助于我们精确理解概念。

概率空间

正式的概率定义也一般称为概率空间,它要包含三个元素。首先是要有一个采样空间,也就是所有可能出现结果的集合( Ω \Omega Ω)。这个比较好理解,当我们提到概率那主语一定是某个可随机出现的结果,所有可能出现的结果构成的集合就是这个采样空间。第二个元素就比较抽象一些,是基于采样空间的一个特殊代数结构,被称为西格玛代数( σ \sigma σ-algebra)。这个西格玛代数是一个集合的集合( F \mathcal{F} F),它满足以下条件:

  1. F \mathcal{F} F的元素必须都是采样空间 Ω \Omega Ω的子集;
  2. 空集 ϕ \phi ϕ要属于这个集合( F \mathcal{F} F);
  3. 如果集合 A ⊆ Ω A\subseteq\Omega AΩ属于这个集合( F \mathcal{F} F),那么其补集 A ˉ = Ω \ A \bar{A}=\Omega\backslash A Aˉ=Ω\A也属于这个集合( F \mathcal{F} F);
  4. 如果任意个可数的采样空间子集都属于这个集合( F \mathcal{F} F),那么这些采样空间子集的并集也属于这个集合( F \mathcal{F} F)。

一个简单的西格玛代数就是采样空间所有子集的集合(英文叫power set)。在概率定义中引入西格玛代数的原因是在我们讨论概率时我们更关心各种集成事件(也就是某些结果集合)的发生概率。这些事件可能构成各种交集并集等关系,我们需要计算相应的概率,比如有时我们要计算条件概率。前两个元素给出了概率的定义域,最后一个元素就是概率函数 P P P,它定义在 F \mathcal{F} F上,将 F \mathcal{F} F中的每个元素映射到0到1之间的一个实数: P : F ↦ [ 0 , 1 ] P:\mathcal{F}\mapsto[0, 1] P:F[0,1]。概率函数 P P P是一种特殊函数,被称为测度(measure),简单讲就是衡量 F \mathcal{F} F中每个元素(是采样空间的一个子集)的大小。它需要满足一些条件比如: P ( ϕ ) = 0 P(\phi)=0 P(ϕ)=0 P ( Ω ) = 1 P(\Omega)=1 P(Ω)=1,对于 F \mathcal{F} F中的两个互不相交的元素 A 1 A_1 A1 A 2 A_2 A2 P ( A 1 ⋃ A 2 ) = P ( A 1 ) + P ( A 2 ) P(A_1\bigcup{A_2})=P(A_1)+P(A_2) P(A1A2)=P(A1)+P(A2)。所以概率正式定义是一个三元组 ( Ω , F , P ) (\Omega, \mathcal{F}, P) (Ω,F,P)

在概率空间的定义中,采样集合 Ω \Omega Ω是一个抽象集合,它可以是离散可数的,也可以是连续不可数的,可以是有限的也可以是无限的。其中的每个抽象元素可以映射到一个我们关心的具体元素。比如我们可以定义一个只有两个元素的采样空间 Ω = ω 1 , ω 2 \Omega={\omega_1, \omega_2} Ω=ω1,ω2, 两个元素分别对应0和1,那么加上概率函数我们就有了一个取值为0或1的离散随机变量。采样空间也可以是连续的集合,其每一个元素可以映射到实数轴上的一个实数,概率函数通过赋予采样空间的子集一个概率也就赋予实数轴上对应的一个集合(比如一个线段)相同的概率,于是我们得到一个定义于实数上的连续随机变量。

随机过程

如果我们关心的随机对象不再是一个数值而是某个函数集中的一个函数,那么采样空间中的元素对应的就是一个元素;而西格玛代数中的一个元素(采样空间的一个子集)对应将是一个函数集合(通常由满足某种条件的函数组成);定义在西格玛代数上的概率函数赋予了这些函数集相应的概率;总结起来就是我们定义了一个随机过程。

在随机过程中使用得最多的类型就是高斯过程,因为高斯分布有良好的数学特性,便于计算推理,另外由于大数定理,自然界很多随机过程也近似于高斯过程。高斯过程的采样空间对应的函数集包括定义于某个域上的所有函数。从函数定义域任意抽取一组点,得到的对应的函数值形成的向量都是满足高阶高斯分布的随机向量。对于仔细的读者,上面关于高斯过程的“定义”并不准确。不能说自然语言完全无法定义清楚高斯过程,只是如果用自然语言要把高斯过程每个细节说清楚说确切可能需要很长一段复杂句式,以致没人看得懂。这就是为什么开始要引入正式的概率空间的定义。下面用基于概率空间的数学语言来定义高斯过程。首先高斯过程是一种概率空间, G P ≡ ( Ω , F , P ) \mathcal{GP}\equiv(\Omega, \mathcal{F}, P) GP(Ω,F,P),其中采样空间 Ω \Omega Ω被映射到了定义域某个域的所有函数的集合, { f : X ↦ R } \{f:\mathcal{X}\mapsto\mathcal{R}\} {f:XR},一般来说定义域是某个维度的实数空间, X ⊆ R D \mathcal{X}\subseteq\mathcal{R}^D XRD。西格玛函数, F \mathcal{F} F,就是采样空间所有子集的集合,对应的也就是定义于 X \mathcal{X} X上所有函数集合子集的集合。高斯过程区别于其它随机过程主要是要满足如下条件: P ( { ω : f ω ( x 1 ) ∈ [ y 1 − d y 1 / 2 , y 1 + d y 1 / 2 ] , . . . , f ω ( x N ) ∈ [ y N − d y N / 2 , y N + d y N / 2 ] , ω ∈ Ω } ) = N μ ( x ) , K ( x , x ) ( y 1 , . . . , y N ) d y 1 . . . d y N , ∀ { x n ∈ X } n = 1 N P(\{\omega:f_\omega(x_1)\in[y_1-dy_1/2, y_1+dy_1/2],...,f_\omega(x_N)\in[y_N-dy_N/2,y_N+dy_N/2],\omega\in\Omega\})=\mathcal{N}_{\mu(\textbf{x}),K(\textbf{x},\textbf{x})}(y_1,...,y_N)dy_1...dy_N,\quad \forall \{x_n\in\mathcal{X}\}_{n=1}^N P({ω:fω(x1)[y1dy1/2,y1+dy1/2],...,fω(xN)[yNdyN/2,yN+dyN/2],ωΩ})=Nμ(x),K(x,x)(y1,...,yN)dy1...dyN,{xnX}n=1N,其中 N μ ( x ) , K ( x , x ) \mathcal{N}_{\mu(\textbf{x}),K(\textbf{x},\textbf{x})} Nμ(x),K(x,x)代表以均值函数 μ ( x ) \mu(\textbf{x}) μ(x)和方差函数 K ( x , x ) K(\textbf{x},\textbf{x}) K(x,x)为参数的高斯分布。这里方差函数 K K K是一个 N × N N\times N N×N的对称非负定矩阵函数,它的一个元素 K i j = k ( x i , x j ) K_{ij}=k(x_i, x_j) Kij=k(xi,xj),其中二元函数 k k k决定两个位置上高斯过程值的协方差,它可被称为核函数(参考核方法)。我们如果给定了均值函数和方差函数的形式,我们也就给定了这个高斯过程的分布。在很多问题中作为高斯过程的先验分布,我们会把均值函数设为常数 m m m,而核函数使用平方指数核(squared exponential kernel): k S E ( x , x ′ ) = θ 0 e x p { − 1 2 r 2 ( x , x ′ ) } , r 2 ( x , x ′ ) = ∑ d = 1 D ( x d − x d ′ ) 2 / θ d 2 k_{SE}(x, x')=\theta_0 exp\{-\frac{1}{2}r^2(x, x')\}, \quad r^2(x, x')=\sum_{d=1}^D(x_d-x_d')^2/\theta_d^2 kSE(x,x)=θ0exp{21r2(x,x)},r2(x,x)=d=1D(xdxd)2/θd2。 平方指数核的参数 θ 0 , . . . , θ D \theta_0,...,\theta_D θ0,...,θD决定从高斯过程中随机抽取出来的函数样本的光滑程度,这几个参数越大,从高斯过程中随机抽取出非常光滑的可能性越大。

高斯过程概率分布的更新

贝叶斯优化过程本质上就是通过不断对未知的函数(我们认为它是从某个函数空间内按高斯过程分布随机抽取的)在定义域内不同的点进行测量,进而根据观测历史对高斯过程分布进行更新,找出最可能的那个函数和它的极值点。所以在这个过程中我们需要求基于观测历史和新的测量位置( x x x)的函数值( y y y)的条件概率 P ( { x , y } ∣ { x i , y i } i = 1 n , θ ) P(\{x, y\}|\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta}) P({x,y}{xi,yi}i=1n,θ),其中 θ \boldsymbol{\theta} θ是初始先验高斯过程分布的参数(注意,在概率表达式中所有测量位置不被认为是随机变量)。对于高斯过程上述条件概率也满足高斯分布,其均值函数 μ ( x ; { x i , y i } i = 1 n , θ ) \mu(x;\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta}) μ(x;{xi,yi}i=1n,θ), 方差函数 σ ( x ; { x i , y i } i = 1 n , θ ) \sigma(x;\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta}) σ(x;{xi,yi}i=1n,θ)可帮助我们寻找下一个最可能是极值点的测量位置。上面的条件概率可表示为: P ( { x , y } ∣ { x i , y i } i = 1 n , θ ) = P ( { x , y } , { x i , y i } i = 1 n , θ ) P ( { x i , y i } i = 1 n , θ ) P(\{x, y\}|\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})=\frac{P(\{x, y\},\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})}{P(\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})} P({x,y}{xi,yi}i=1n,θ)=P({xi,yi}i=1n,θ)P({x,y},{xi,yi}i=1n,θ)。上面分子分母都是高斯分布,求两个高斯分布的商需要用到一些涉及方块矩阵求逆的定理来获得分子分母的协方差矩阵逆。

上式分子作为历史测量值 y i = 1 n y_{i=1}^n yi=1n和下一个测量值 y y y的联合概率分布为一多变量高斯分布,测量位置和初始先验参数都可看成此分布的参数。也就是说上面分子是关于随机向量 [ y i = 1 n y ] \begin{bmatrix}y_{i=1}^n\\ y\end{bmatrix} [yi=1ny]的联合分布,并且它具有高斯分布形式: [ y i = 1 n y ] ∼ N ( ( 0 ) , [ K θ ( x i = 1 n , x i = 1 n ) , K θ ( x i = 1 n , x ) K θ ( x , x i = 1 n ) , K θ ( x , x ) ] ) \begin{bmatrix}y_{i=1}^n\\ y\end{bmatrix}\sim \mathcal{N}\bigg(\textbf(0), \begin{bmatrix}K_{\boldsymbol{\theta}}(x_{i=1}^n, x_{i=1}^n), K_{\boldsymbol{\theta}}(x_{i=1}^n, x)\\ K_{\boldsymbol{\theta}}(x, x_{i=1}^n), K_{\boldsymbol{\theta}}(x, x)\end{bmatrix}\bigg) [yi=1ny]N((0),[Kθ(xi=1n,xi=1n),Kθ(xi=1n,x)Kθ(x,xi=1n),Kθ(x,x)])

其中 K θ ( x i = 1 n , x i = 1 n ) K_{\boldsymbol{\theta}}(x_{i=1}^n, x_{i=1}^n) Kθ(xi=1n,xi=1n)是一个 n × n n\times n n×n的矩阵,代表在历史测量位置上测量值向量之间的协方差矩阵, K θ ( x i = 1 n , x ) K_{\boldsymbol{\theta}}(x_{i=1}^n, x) Kθ(xi=1n,x) n × 1 n\times 1 n×1的矩阵,代表历史测量值和在位置 x x x上的测量值之间的协方差矩阵, K θ ( x , x i = 1 n ) K_{\boldsymbol{\theta}}(x, x_{i=1}^n) Kθ(x,xi=1n) 1 × n 1\times n 1×n的矩阵, 是前一个矩阵的转置,最后 K θ ( x , x ) K_{\boldsymbol{\theta}}(x, x) Kθ(x,x)是一个标量,为位置 x x x上的测量值的方差。

上面条件概率公式中的分母即为历史测量值 y i = 1 n y_{i=1}^n yi=1n的联合概率分布,同样是多变量高斯分布。其形式为: y i = 1 n ∼ N ( ( 0 ) , K θ ( x i = 1 n , x i = 1 n ) ) y_{i=1}^n\sim \mathcal{N}(\textbf(0), K_{\boldsymbol{\theta}}(x_{i=1}^n, x_{i=1}^n)) yi=1nN((0),Kθ(xi=1n,xi=1n))

上面两个高斯函数相除对于变量 y y y还是一个高斯函数,也就是说概率分布 P ( { x , y } ∣ { x i , y i } i = 1 n , θ ) P(\{x, y\}|\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta}) P({x,y}{xi,yi}i=1n,θ)是高斯分布,其中历史测量值作为条件,测量位置和先验参数作为参数共同决定这个高斯分布的均值和方差。这里不做具体推导,直接给出其均值和方差:

μ ( x ; { x i , y i } i = 1 n , θ ) = K θ ( x , x i = 1 n ) K θ ( x i = 1 n , x i = 1 n ) − 1 y i = 1 n \mu(x;\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})=K_{\boldsymbol{\theta}}(x, x_{i=1}^n)K_{\boldsymbol{\theta}}(x_{i=1}^n, x_{i=1}^n)^{-1}y_{i=1}^n μ(x;{xi,yi}i=1n,θ)=Kθ(x,xi=1n)Kθ(xi=1n,xi=1n)1yi=1n σ 2 ( x ; { x i , y i } i = 1 n , θ ) = K θ ( x , x ) − K θ ( x , x i = 1 n ) K θ ( x i = 1 n , x i = 1 n ) − 1 K θ ( x i = 1 n , x ) \sigma^2(x;\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})=K_{\boldsymbol{\theta}}(x, x)-K_{\boldsymbol{\theta}}(x, x_{i=1}^n)K_{\boldsymbol{\theta}}(x_{i=1}^n, x_{i=1}^n)^{-1}K_{\boldsymbol{\theta}}(x_{i=1}^n, x) σ2(x;{xi,yi}i=1n,θ)=Kθ(x,x)Kθ(x,xi=1n)Kθ(xi=1n,xi=1n)1Kθ(xi=1n,x)

有了上面两个函数我们可以寻找最可能的优化位置的 x x x,使得在这个位置待优化函数的值 y y y是最优的。搜寻合适的 x x x将使用收效函数(acquisition function)。

收效函数(acquisition function)

通过在不同位置反复测量待优化函数,我们可以获得越来越多的信息帮助我们估计在新的位置待优化函数值的分布。通过这个分布,我们可以搜寻最佳的测量位置以期能得到最优化(最大或最下,取决于优化问题类型)的函数值。为了衡量一个位置是否为最佳,我们需要收效函数,在最佳位置收效函数有最大值。收效函数的构建有多种方式,主要有如下三种。

增益概率(probability of improvement)

一个比较直观的构造收效函数的策略是选择新测量值优于历史最优测量值的概率为收效函数,通过选择新的测量位置 x x x最大化收效函数即为最大化测量值的增益概率。此收效函数的数学形式为:

a P I ( x ; { x i , y i } i = 1 n , θ ) = Φ ( γ ( x ) ) , γ ( x ) = ± f ( x b e s t ) − μ ( x ; { x i , y i } i = 1 n , θ ) σ ( x ; { x i , y i } i = 1 n , θ ) a_{PI}(x; \{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})=\Phi(\gamma(x)), \gamma(x)=\pm\frac{f(x_{best})-\mu(x; \{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})}{\sigma(x;\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})} aPI(x;{xi,yi}i=1n,θ)=Φ(γ(x)),γ(x)=±σ(x;{xi,yi}i=1n,θ)f(xbest)μ(x;{xi,yi}i=1n,θ)

γ ( x ) \gamma(x) γ(x)定义前的 ± \pm ±取决于优化类型,如果优化是指最小化则取 + + +,否则取 − - Φ \Phi Φ在此代表累积高斯分布函数。

增益期望(expected improvement)

与增益概率收效函数的目标不同,构造增益期望收效函数的目的的最大化在新测量值相较于历史最优值的增益的期望值。其数学形式更复杂一点:

a E I ( x ; { x i , y i } i = 1 n , θ ) = σ ( x ; { x i , y i } i = 1 n , θ ) ( γ ( x ) Φ ( γ ( x ) ) + N ( γ ( x ) ; 0 , 1 ) ) a_{EI}(x; \{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})=\sigma(x;\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})(\gamma(x)\Phi(\gamma(x))+\mathcal{N}(\gamma(x); 0, 1)) aEI(x;{xi,yi}i=1n,θ)=σ(x;{xi,yi}i=1n,θ)(γ(x)Φ(γ(x))+N(γ(x);0,1))

其中 N ( x ; 0 , 1 ) \mathcal{N}(x; 0, 1) N(x;0,1)为标准高斯分布函数。

置信度上/下限(upper/lower confidence bound)

当优化问题是最大化时取上限,反之取下限。通过最大化置信度上/下限收效函数搜索最佳测量点近似等价于最小化整个优化过程的遗憾。在这里每次测量的遗憾定义为测量值和待优化函数真实最优值的差。换句话说,优化过程的遗憾最小化意味着尽快的使测量值接近真实最优值。要做到这一点,我们希望在优化过程中能做好两件事:一是通过测量尽可能多的获取待优化函数的信息,二是让每次测量值尽可能优(大或小,取决于优化类型)。如何做好第二件事很直观,上面说到根据历史测量值我们有更新的均值函数,我们在均值最优的点测量就可以了;最好第一件事涉及一些信息论的知识,但直观也告诉我们在方差最大的地方测量最能消除不确定性,也就是获得最多关于待优化函数的信息。但显然两者经常不能同时做到,它们之间要有一些权衡。一般来说找最优均值被称为开发(exploitation),找方差最大的地方被称为探索(exploration)。平衡开发和探索是非线性优化的基本哲学。此种收效函数的数学定义为:

a G P − C B ( x ; { x i , y i } i = 1 n , θ ) = ± μ ( x ; { x i , y i } i = 1 n , θ ) + κ σ ( x ; { x i , y i } i = 1 n , θ ) a_{GP-CB}(x; \{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})=\pm\mu(x; \{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta})+\kappa\sigma(x;\{x_i, y_i\}_{i=1}^n, \boldsymbol{\theta}) aGPCB(x;{xi,yi}i=1n,θ)=±μ(x;{xi,yi}i=1n,θ)+κσ(x;{xi,yi}i=1n,θ)

其中参数 κ \kappa κ用来平衡开发与探索。当 κ \kappa κ大时,整个优化过程不急于去找在现有信息下最可能的优化点,而是更多的搜集关于待优化函数的信息,以期找到更好的优化点。更多的探索增加了得到真正全局最优的可能性,但可能使整个优化过程变得很长。

总结

基于高斯过程的贝叶斯优化将贝叶斯思想应用于优化过程。首先它将待优化的函数看成来自先验的高斯过程分布的一个采样,通过反复的对这个函数进行测量获得关于此函数的信息,更新此函数的分布,即为后验分布,再根据后验分布确定新的测量点逼近函数的最优点。在这里我们选择高斯过程分布作为待优化函数的先验分布是因为高斯过程具有良好的数学特性,使得基于贝叶斯推导的分布更新有解析解,方便算法构建。需要注意的是在贝叶斯优化过程中,新测量点的选择涉及到最大化收效函数,这本身就是一个非线性优化问题有相当的计算成本。所以贝叶斯优化并不适合所有的优化问题,比如当待优化函数的函数值在整个定义域都很容易计算时,贝叶斯优化就不是一个有效的方法。其大部分时间都花在反复用传统方法优化收效函数上面,因而更有效的方式是使用传统非线性优化算法直接优化待优化函数本身。对于某些优化问题,计算待优化函数的函数值代价非常大,相比之下收效函数的优化变得微不足道,那么贝叶斯优化就是一个高效的全局优化方法。这种优化问题的典型例子就是深度学习的元学习。这个优化问题是要找到最好的网络结构或是超参数,在这个结构或超参数下我们能训练出针对某个任务的最佳模型。所以这里待优化函数的输入是网络结构或是超参数,输出的函数值是在这个结构或超参数下得到的模型的性能。这个函数值的获得需要训练一个模型,是非常昂贵的,所以这是一个应用贝叶斯优化的比较好的场景。

你可能感兴趣的:(技术)