蒙特卡洛-马尔科夫链(MCMC)初步

MCMC(Markov Chain Monte Carlo)是一种经典的概率分布采样方法。本文对其概念和常见算法做简单梳理。

解决什么问题?

我们常常遇到这样的问题:模型构建好之后,有一个概率$p(x)$(称为目标分布),不能显式的给出其表达,只能生成一系列符合这个分布的$x$。这种问题称为“采样”。

特别地,在贝叶斯方法中,关注的是后验概率$p(x|D)$。在给定观测$D$的情况下,需要估计系统参数$x$。如果后验概率没有明确表达,或者由于多重积分难以计算,则无法直接求解$x$,但是可以生成一系列符合此概率的分布。
常见的情况是,后验概率难以明确表达。在已知观测数据x的情况下,利用$p(x|D) = p(x) \cdot p(D|x) / p(x) \propto p(D|x)$。对似然函数进行采样。

名字解析

Monte Carlo方法:用多次随机求平均的方法来逼近一个值。实际是采样方法的核心。

举例:落球箱(模型)给定。可以通过累加每个针处的概率来计算最终的落球分布,也可以多次投球来逼近这个分布。

Markov Chain方法:用$x$的转移概率逼近平稳概率。
构建一系列$x$,后一个的取值通过前一个取值以及状态转移概率获得。Monte Carlo方法的每一个采样是独立的,而Markov Chain Monte Carlo的采样是前后关联的。

举例:已知$p(阴转晴)$和$p(晴转阴)$,则可以构建MC链获得晴天和阴天的概率。

最初的一段MC链往往混合不够充分,不符合稳态分布,不能使用。这一阶段称为burn-in。
为了降低MC链采样的相关性,有些文献采用thinning的方法:每隔N个样本接受一个。

使用这种方法,往往需要另外设置一些隐变量来帮助构建状态转移关系。

举例:最简单的神经网络,由一个显结点和一个隐结点构成。已知$p(h|v), p(v|h)$,可以构建MC链获得$p(v)$。

设计MCMC方法的一个难处,在于如何设计合理的转移概率函数,使得MC链的稳态分布等于要求的概率分布。
MCMC的另一个问题是混合速度,在这篇博客中有所讨论。

MCMC是一个大类,有许多种具体算法,以下举例几种最为著名的。

Gibbs Sampling

Gibbs Sampling处理这样的问题:对于一个高维随机变量$\textbf{x}=[x^1,x^2,x^3]$,不能写出其各分量的联合概率$p(x)$,但是可以写出各个分量之间的条件概率。

首先任取初始值$\textbf{x}_0$。在已知当前采样$\textbf{x}_t$时,按照如下方法生成t+1时刻采样。

  1. 根据$x^2$,$x^3$采样$x^1$:$x_{t+1}^1 \propto p(x^1|x^2_t, x^3_t)$
  2. 根据$x^1$,$x^3$采样$x^2$:$x_{t+1}^2 \propto p(x^2|x^1_{t+1}, x^3_t)$
  3. 根据$x^1$,$x^2$采样$x^3$:$x_{t+1}^3 \propto p(x^3|x^1_{t+1}, x^2_{t+1})$

每一次采样,都尽可能利用其他分量的最新结果。Gibbs Sampling特别适用于贝叶斯网络的采样,因为该网络本身就包含一系列条件概率。

Metropolis-Hastings(MH)

MH方法的一个优点是,即使不能写出概率密度函数$p(x)$,可以用一个和其成正比的函数$f(x)$来采样。如前所述,这在贝叶斯方法中非常方便。
首先任取初始值$x_0$。在已知当前采样$x_t$时,按照如下方法生成t+1时刻采样。

  1. 根据一个概率分布$Q(x_{t+1}|x_t)$生成一个候选采样$x_{t+1}$。
    其中$Q$称为proposal density或者jumping distribution。可以取以$x_t$为中心的高斯分布。
  2. 比较新旧采样的概率密度函数
    如果$f(x_{t+1})>f(x_t)$,接受$x_{t+1}$为新采样;
    否则,按照$p=f(x_{t+1})/f(x_t)$选择$x_{t+1}$为新采样,或者维持$x_t$为新采样。

一种常见的情况,如果待求概率是一个后验$p(x|D)$,且其先验是高斯,则可以做如下变换:
$$p(x|D) \propto p(x)\cdot p(D|x) = N(x; 0, \Sigma) \cdot p(D|x)$$
直接使用以下方法生成候选样本
$$x_{t+1} = \sqrt{1-\epsilon^2}x_t + \epsilon \nu$$

其中$\nu \sim N(0,\Sigma)$,$\epsilon\in[-1,+1]$是扰动步长。新样本等于当前样本和先验的加权和。另一种表达方法是
$$x_{t+1} = \cos{\theta} \cdot x_t + \sin{\theta} \cdot \nu$$

不同的$\epsilon$对应的新采样的轨迹是半个椭圆圆周。椭圆的两轴分别为$x_t$和$\nu$。如果$\epsilon=0$,则新采样和旧采样相同(红色)。$\epsilon或者\theta$控制扰动幅度。

对于某些高斯过程分类器,MH方法比Gibbs Sampling快。且实现简单。缺点是$Q$的参数(例如叠加的高斯的方差,或者$\epsilon$)
需要手工调整。

Slice Sampling

Slice Sampling方法利用一种几何思路:根据概率密度函数曲线高度来采样,越高的地方slice越宽,采样越多。同样可以对和概率密度函数成正比的任一函数$f(x)$来进行采样。
首先任取初始值$x_0$。在已知当前采样$x_t$时,按照如下方法生成t+1时刻采样。

  1. 在$[0, f(x_t)]$之间均匀采样,得到$y$
  2. 过$y$做一条平行于$x$轴的直线,在其位于$y=f(x)$曲线内部的范围内(slice),均匀采样得到$x_{t+1}$

曲线越高,截取的横线越宽,x采样的概率越大。
在求曲线内部线段时,需要求$x=f^{-1}(y)$。如果$f$的反函数不好求,可能需要用一维采样方法找出$x$。
Slice Sampling的一个优点是:不需要手工调整参数。

Elliptical Slice Sampling

此方法是Slice Sampling的进化版本,不需要求$f$的反函数;同时结合了Metropolis-Hastings方法中在椭圆上采样的思想,但不再需要人工设定$\theta$。
此方法要求目标概率为一后验概率,其先验为高斯,似然函数用$L$表示。
$$p(x|D) \propto p(x)\cdot p(D|x) = N(x; 0, \Sigma) \cdot L(x)$$

首先任取初始值$x_0$。在已知当前采样$x_t$时,按照如下方法生成t+1时刻采样。

  1. 按照先验随机生成$\nu \sim N(0,\Sigma)$。$\nu$和$x_t$的组合构成一个椭圆。
  2. 随机生成一个比原来似然函数略低的门限
    $$thresh = \log {p(D|x)} + \log u, 其中u\sim U[0,1]$$
  3. 随机生成一个$\theta \sim U[0,2\pi]$,设定$\theta$的初始搜索范围
    $$\theta_{min} = \theta - 2\pi, \theta_{max} = \theta$$
  4. 生成候选新采样$x_{t+1} = x_t cos\theta+\nu sin\theta$
  5. 如果候选新采样比门限好,$\log L(x_{t+1}) > thresh$,接受$x_{t+1}$。返回。
  6. 否则,缩小$\theta$的搜索范围
    $$如果\theta<0, \theta_{min} = \theta; 否则\theta_{max} = \theta$$
  7. 重新采样$\theta \sim U[\theta_{min}, \theta_{max}]$,返回步骤4。

在步骤6,7中,$\theta$的范围逐渐围绕着0缩小。新生成的候选采样逐渐接近于上一个采样$x_t$,步骤4中的条件越来越容易满足。

你可能感兴趣的:(算法,概率,贝叶斯,MCMC)