MCMC(Markov Chain Monte Carlo)是一种经典的概率分布采样方法。本文对其概念和常见算法做简单梳理。
解决什么问题?
我们常常遇到这样的问题:模型构建好之后,有一个概率 p ( x ) p(x) p(x)(称为目标分布),不能显式的给出其表达,只能生成一系列符合这个分布的 x x x。这种问题称为“采样”。
特别地,在贝叶斯方法中,关注的是后验概率 p ( x ∣ D ) p(x|D) p(x∣D)。在给定观测 D D D的情况下,需要估计系统参数 x x x。如果后验概率没有明确表达,或者由于多重积分难以计算,则无法直接求解 x x x,但是可以生成一系列符合此概率的分布。
常见的情况是,后验概率难以明确表达。在已知观测数据x的情况下,利用 p ( x ∣ D ) = p ( x ) ⋅ p ( D ∣ x ) / p ( D ) ∝ p ( D ∣ x ) p(x|D) = p(x) \cdot p(D|x) / p(D) \propto p(D|x) p(x∣D)=p(x)⋅p(D∣x)/p(D)∝p(D∣x)。对似然函数进行采样。
名字解析
Monte Carlo方法:用多次随机求平均的方法来逼近一个值。实际是采样方法的核心。
举例:落球箱(模型)给定。可以通过累加每个针处的概率来计算最终的落球分布,也可以多次投球来逼近这个分布。
Markov Chain方法:用 x x x的转移概率逼近平稳概率。
构建一系列 x x x,后一个的取值通过前一个取值以及状态转移概率获得。Monte Carlo方法的每一个采样是独立的,而Markov Chain Monte Carlo的采样是前后关联的。
举例:已知 p ( 阴 转 晴 ) p(阴转晴) p(阴转晴)和 p ( 晴 转 阴 ) p(晴转阴) p(晴转阴),则可以构建MC链获得晴天和阴天的概率。
最初的一段MC链往往混合不够充分,不符合稳态分布,不能使用。这一阶段称为burn-in。
为了降低MC链采样的相关性,有些文献采用thinning的方法:每隔N个样本接受一个。
使用这种方法,往往需要另外设置一些隐变量来帮助构建状态转移关系。
举例:最简单的神经网络,由一个显结点和一个隐结点构成。已知 p ( h ∣ v ) , p ( v ∣ h ) p(h|v), p(v|h) p(h∣v),p(v∣h),可以构建MC链获得 p ( v ) p(v) p(v)。
设计MCMC方法的一个难处,在于如何设计合理的转移概率函数,使得MC链的稳态分布等于要求的概率分布。
MCMC的另一个问题是混合速度,在这篇博客中有所讨论。
MCMC是一个大类,有许多种具体算法,以下举例几种最为著名的。
Gibbs Sampling
Gibbs Sampling处理这样的问题:对于一个高维随机变量 x = [ x 1 , x 2 , x 3 ] \textbf{x}=[x^1,x^2,x^3] x=[x1,x2,x3],不能写出其各分量的联合概率 p ( x ) p(x) p(x),但是可以写出各个分量之间的条件概率。
首先任取初始值 x 0 \textbf{x}_0 x0。在已知当前采样 x t \textbf{x}_t xt时,按照如下方法生成t+1时刻采样。
- 根据 x 2 x^2 x2, x 3 x^3 x3采样 x 1 x^1 x1: x t + 1 1 ∝ p ( x 1 ∣ x t 2 , x t 3 ) x_{t+1}^1 \propto p(x^1|x^2_t, x^3_t) xt+11∝p(x1∣xt2,xt3)
- 根据 x 1 x^1