概念:MCMC指的是马尔科夫链蒙特卡罗(Markov Chain Monte Carlo)
属于近似推断中的随机推断类别
- 蒙特卡罗方法
中心思想:用采样的平均值来代替求期望
蒙特卡罗原来是一个赌场的名称,用它作为名字大概是因为蒙特卡罗方法是一种随机模拟的 方法,这很像赌博场里面的扔骰子的过程。最早的蒙特卡罗方法都是为了求解一些不太好求解的求和或者积分问题。比如积分:
θ = ∫ a b f ( x ) d x \theta = \int_a^b f(x)dx θ=∫abf(x)dx
如果我们很难求解出f(x)的原函数,那么这个积分比较难求解。当然我们可以通过蒙特卡罗方法来模拟求解近似值。如何模拟呢?假设我们函数图像如下图:
则一个简单的近似求解方法是在[a,b]之间随机的采样一个点。比如 x 0 x_0 x0,然后用 f ( x 0 ) f(x_0) f(x0)代表在[a,b]区间上所有的 f ( x ) f(x) f(x)的值。那么上面的定积分的近似求解为:
( b − a ) f ( x 0 ) (b-a)f(x_0) (b−a)f(x0)
当然,用一个值代表[a,b]区间上所有的 f ( x ) f(x) f(x)的值,这个假设太粗糙。那么我们可以采样[a,b]区间的n个值: x 0 , x 1 , . . . x n − 1 {x_0,x_1,...x_{n-1}} x0,x1,...xn−1,用它们的均值来代表[a,b]区间上所有的 f ( x ) f(x) f(x)的值。这样我们上面的定积分的近似求解为:
b − a n ∑ i = 0 n − 1 f ( x i ) \frac{b-a}{n}\sum\limits_{i=0}^{n-1}f(x_i) nb−ai=0∑n−1f(xi)
虽然上面的方法可以一定程度上求解出近似的解,但是它隐含了一个假定,即
x
x
x在[a,b]之间是均匀分布的,而绝大部分情况,
x
x
x在[a,b]之间不是均匀分布的。如果我们用上面的方法,则模拟求出的结果很可能和真实值相差甚远。
怎么解决这个问题呢? 如果我们可以得到
x
x
x在[a,b]的概率分布函数
p
(
x
)
p(x)
p(x),那么我们的定积分求和可以这样进行:
θ
=
∫
a
b
f
(
x
)
d
x
=
∫
a
b
f
(
x
)
p
(
x
)
p
(
x
)
d
x
≈
1
n
∑
i
=
0
n
−
1
f
(
x
i
)
p
(
x
i
)
\theta = \int_a^b f(x)dx = \int_a^b \frac{f(x)}{p(x)}p(x)dx \approx \frac{1}{n}\sum\limits_{i=0}^{n-1}\frac{f(x_i)}{p(x_i)}
θ=∫abf(x)dx=∫abp(x)f(x)p(x)dx≈n1i=0∑n−1p(xi)f(xi)
上式最右边的这个形式就是蒙特卡罗方法的一般形式。当然这里是连续函数形式的蒙特卡罗方法,但是在离散时一样成立。
可以看出,最上面我们假设
x
x
x在[a,b]之间是均匀分布的时候,
p
(
x
i
)
=
1
/
(
b
−
a
)
p(x_i) = 1/(b-a)
p(xi)=1/(b−a),带入我们有概率分布的蒙特卡罗积分的上式,可以得到:
1
n
∑
i
=
0
n
−
1
f
(
x
i
)
1
/
(
b
−
a
)
=
b
−
a
n
∑
i
=
0
n
−
1
f
(
x
i
)
\frac{1}{n}\sum\limits_{i=0}^{n-1}\frac{f(x_i)}{1/(b-a)} = \frac{b-a}{n}\sum\limits_{i=0}^{n-1}f(x_i)
n1i=0∑n−11/(b−a)f(xi)=nb−ai=0∑n−1f(xi)
也就是说,我们最上面的均匀分布也可以作为一般概率分布函数
p
(
x
)
p(x)
p(x)在均匀分布时候的特例。那么我们现在的问题转到了如何求出
x
x
x的分布
p
(
x
)
p(x)
p(x)对应的若干个样本上来。
采样方法:
-
概率分布采样
上一节我们讲到蒙特卡罗方法的关键是得到 x x x的概率分布。如果求出了 x x x的概率分布,我们可以基于概率分布去采样基于这个概率分布的n个 x x x的样本集,带入蒙特卡罗求和的式子即可求解。但是还有一个关键的问题需要解决,即如何基于概率分布去采样基于这个概率分布的n个 x x x的样本集
对于常见的均匀分布 u n i f o r m ( 0 , 1 ) uniform(0,1) uniform(0,1)是非常容易采样样本的,一般通过线性同余发生器可以很方便的生成(0,1)之间的伪随机数样本。而其他常见的概率分布,无论是离散的分布还是连续的分布,它们的样本都可以通过 u n i f o r m ( 0 , 1 ) uniform(0,1) uniform(0,1)的样本转换而得。比如二维正态分布的样本 ( Z 1 , Z 2 ) (Z_1,Z_2) (Z1,Z2)可以通过通过独立采样得到的 u n i f o r m ( 0 , 1 ) uniform(0,1) uniform(0,1)样本对 ( X 1 , X 2 ) (X_1,X_2) (X1,X2)通过如下的式子转换而得: Z 1 = − 2 l n X 1 c o s ( 2 π X 2 ) Z_1 = \sqrt{-2 ln X_1}cos(2\pi X_2) Z1=−2lnX1cos(2πX2) Z 2 = − 2 l n X 1 s i n ( 2 π X 2 ) Z_2 = \sqrt{-2 ln X_1}sin(2\pi X_2) Z2=−2lnX1sin(2πX2)
其他一些常见的连续分布,比如t分布,F分布,Beta分布,Gamma分布等,都可以通过类似的方式从 u n i f o r m ( 0 , 1 ) uniform(0,1) uniform(0,1)得到的采样样本转化得到。在python的numpy,scikit-learn等类库中,都有生成这些常用分布样本的函数可以使用。
不过很多时候,我们的 x x x的概率分布不是常见的分布,这意味着我们没法方便的得到这些非常见的概率分布的样本集。那这个问题怎么解决呢? -
接受-拒绝采样
对于概率分布不是常见的分布,一个可行的办法是采用接受-拒绝采样来得到该分布的样本。既然 p ( x ) p(x) p(x) 太复杂在程序中没法直接采样,那么我设定一个程序可采样的分布 q ( x ) q(x) q(x) 比如高斯分布,然后按照一定的方法拒绝某些样本,以达到接近 p ( x ) p(x) p(x) 分布的目的,其中 q ( x ) q(x) q(x)叫做建议分布
具体操作如下,设定一个方便抽样的函数 q(x),以及一个常量 k,使得 p(x) 总在 kq(x) 的下方。 α = p ( x ) k q ( x ) \alpha=\frac{ p(x)}{ kq(x)} α=kq(x)p(x)(参考上图)- x 轴方向:从 q(x) 分布抽样得到 z 0 z_0 z0。
- y 轴方向:从均匀分布(0,1) 中抽样得到 u。
- 如果 u ≤ α u \leq \alpha u≤α 接受 z 0 z_0 z0,否则拒绝
- 重复以上过程
在高维的情况下,Rejection Sampling 会出现两个问题,第一是合适的 q 分布比较难以找到,第二是很难确定一个合理的 k 值。这两个问题会导致拒绝率很高,无用计算增加。
-
重要性采样
当 p(x)的分布比较好求解的时候,我们计算期望可以使用下列公式:
E [ f ( x ) ] = ∫ x p ( x ) f ( x ) d x E[f(x)] =\int_x p(x)f(x) dx E[f(x)]=∫xp(x)f(x)dx
从 p ( x ) 分 布 中 采 取 N 个 样 本 , 期 望 近 似 等 于 : p(x)分布中采取N个样本,期望近似等于: p(x)分布中采取N个样本,期望近似等于:
E [ f ( x ) ] = ∫ x p ( x ) f ( x ) d x = 1 n ∑ i = 1 n f ( x i ) E[f(x)] =\int_x p(x)f(x) dx=\displaystyle \frac{1}{n} \sum_{i=1}^n f(x_i) E[f(x)]=∫xp(x)f(x)dx=n1i=1∑nf(xi)
但是当 p ( x ) 比 较 复 杂 , 无 法 从 p ( x ) 中 采 集 样 本 的 时 候 , 我 们 引 入 一 个 建 议 分 布 q ( x ) , 能 够 从 这 个 分 布 中 采 集 样 本 : p(x) 比较复杂,无法从p(x)中采集样本的时候,我们引入一个建议分布q(x),能够从这个分布中采集样本: p(x)比较复杂,无法从p(x)中采集样本的时候,我们引入一个建议分布q(x),能够从这个分布中采集样本:
E [ f ( x ) ] = ∫ x p ( x ) f ( x ) d x = ∫ x p ( x ) q ( x ) q ( x ) f ( x ) d x E[f(x)] =\int_x p(x)f(x) dx=\int_x \displaystyle \frac{p(x)q(x)}{q(x)}f(x) dx E[f(x)]=∫xp(x)f(x)dx=∫xq(x)p(x)q(x)f(x)dx
= ∫ x q ( x ) f ( x ) p ( x ) q ( x ) d x =\int_x \displaystyle q(x)f(x)\frac{p(x)}{q(x)} dx =∫xq(x)f(x)q(x)p(x)dx
我们能够从 q ( x ) 采 集 若 干 样 本 , 有 下 列 式 子 成 立 q(x)采集若干样本,有下列式子成立 q(x)采集若干样本,有下列式子成立
= 1 n ∑ i = 1 n f ( x i ) p ( x ) q ( x ) =\displaystyle \frac{1}{n} \sum_{i=1}^n f(x_i)\frac{p(x)}{q(x)} =n1i=1∑nf(xi)q(x)p(x)
其中的 p ( x ) q ( x ) \displaystyle \frac{p(x)}{q(x)} q(x)p(x) 称为权重(weight)
2.马氏链及其平稳分布
数学定义:
P
(
X
t
+
1
=
x
∣
X
t
,
X
t
−
1
,
⋯
)
=
P
(
X
t
+
1
=
x
∣
X
t
)
P(X_{t+1}=x|X_t, X_{t-1}, \cdots) =P(X_{t+1}=x|X_t)
P(Xt+1=x∣Xt,Xt−1,⋯)=P(Xt+1=x∣Xt)
也就是状态转移的概率只依赖于前一个状态
我们先来看马氏链的一个具体的例子。社会学家经常把人按其经济状况分成 3 类:下层 (lower-class)、中层 (middle-class)、上层 (upper-class),我们用 1、2、3 分别代表这三个阶层。社会学家们发现决定一个人的收入阶层的最重要的因素就是其父母的收入阶层。如果一个人的收入属于下层类别,那么他的孩子属于下层收入的概率是 0.65,属于中层收入的概率是 0.28,属于上层收入的概率是 0.07。事实上,从父代到子代,收入阶层的变化的转移概率如下
使用矩阵的表示方式,转移概率矩阵记为:
P
=
[
0.65
0.28
0.07
0.15
0.67
0.18
0.12
0.36
0.52
]
P = \begin{bmatrix} 0.65 & 0.28 & 0.07 \\ 0.15 & 0.67 & 0.18 \\ 0.12 & 0.36 & 0.52 \\ \end{bmatrix}
P=⎣⎡0.650.150.120.280.670.360.070.180.52⎦⎤
假设当前这一代人处在下层、中层、上层的人的比例是概率分布向量
π
0
=
[
π
0
(
1
)
,
π
0
(
2
)
,
π
0
(
3
)
]
\pi_0=[\pi_0(1), \pi_0(2), \pi_0(3)]
π0=[π0(1),π0(2),π0(3)]
那么他们的子女的分布比例将是
π
1
=
π
0
P
\pi_1=\pi_0P
π1=π0P
他们的孙子代的分布比例将是
π
2
=
π
1
P
=
π
0
P
2
\pi_2 = \pi_1P=\pi_0P^2
π2=π1P=π0P2
……,
第 n代子孙的收入分布比例将是
π
n
=
π
n
−
1
P
=
π
0
P
n
\pi_n = \pi_{n-1}P = \pi_0P^n
πn=πn−1P=π0Pn
假设初始概率分布为
π
0
=
[
0.21
,
0.68
,
0.11
]
\pi_0 = [0.21,0.68,0.11]
π0=[0.21,0.68,0.11],则我们可以计算前 n代人的分布状况如下:
我们发现从第 7 代人开始,这个分布就稳定不变了,这个是偶然的吗?我们换一个初始概率分布
π
0
=
[
0.75
,
0.15
,
0.1
]
\pi_0 = [0.75,0.15,0.1]
π0=[0.75,0.15,0.1]试试看,继续计算前 n代人的分布状况如下:
我们发现,到第 9 代人的时候, 分布又收敛了。最为奇特的是,两次给定不同的初始概率分布,最终都收敛到概率分布
π
=
[
0.286
,
0.489
,
0.225
]
\pi=[0.286, 0.489, 0.225]
π=[0.286,0.489,0.225],也就是说收敛的行为和初始概率分布
π
0
\pi_0
π0无关,这说明这个收敛行为主要是由概率转移矩阵
P
P
P决定的。我们计算一下
P
n
P^n
Pn
P
20
=
P
21
=
⋯
=
P
100
=
⋯
=
[
0.286
0.489
0.225
0.286
0.489
0.225
0.286
0.489
0.225
]
P^{20} = P^{21} = \cdots = P^{100} = \cdots = \begin{bmatrix} 0.286 & 0.489 & 0.225 \\ 0.286 & 0.489 & 0.225 \\ 0.286 & 0.489 & 0.225 \\ \end{bmatrix}
P20=P21=⋯=P100=⋯=⎣⎡0.2860.2860.2860.4890.4890.4890.2250.2250.225⎦⎤
我们发现,当n足够大的时候,这个
P
n
P^n
Pn 矩阵的每一行都是稳定地收敛到
π
=
[
0.286
,
0.489
,
0.225
]
\pi=[0.286, 0.489, 0.225]
π=[0.286,0.489,0.225]这个概率分布,这个收敛现象并非是我们这个马氏链独有的,而是绝大多数马氏链的共同行为,关于马氏链的收敛我们有如下漂亮的定理:
马氏链定理: 如果一个非周期马氏链具有转移概率矩阵
P
P
P且它的任何两个状态是连通的
那么
lim
n
→
∞
P
i
j
n
\displaystyle \lim_{n\rightarrow\infty}P_{ij}^n
n→∞limPijn存在且与 i 无关,
记
lim
n
→
∞
P
i
j
n
=
π
(
j
)
\displaystyle \lim_{n\rightarrow\infty}P_{ij}^n = \pi(j)
n→∞limPijn=π(j) ,我们有
1
:
lim
n
→
∞
P
n
=
[
π
(
1
)
π
(
2
)
⋯
π
(
j
)
⋯
π
(
1
)
π
(
2
)
⋯
π
(
j
)
⋯
⋯
⋯
⋯
⋯
⋯
π
(
1
)
π
(
2
)
⋯
π
(
j
)
⋯
⋯
⋯
⋯
⋯
⋯
]
1:\displaystyle \lim_{n \rightarrow \infty} P^n =\begin{bmatrix} \pi(1) & \pi(2) & \cdots & \pi(j) & \cdots \\ \pi(1) & \pi(2) & \cdots & \pi(j) & \cdots \\ \cdots & \cdots & \cdots & \cdots & \cdots \\ \pi(1) & \pi(2) & \cdots & \pi(j) & \cdots \\ \cdots & \cdots & \cdots & \cdots & \cdots \\ \end{bmatrix}
1:n→∞limPn=⎣⎢⎢⎢⎢⎡π(1)π(1)⋯π(1)⋯π(2)π(2)⋯π(2)⋯⋯⋯⋯⋯⋯π(j)π(j)⋯π(j)⋯⋯⋯⋯⋯⋯⎦⎥⎥⎥⎥⎤
2
:
π
(
j
)
=
∑
i
=
0
∞
π
(
i
)
P
i
j
2:\displaystyle \pi(j) = \sum_{i=0}^{\infty}\pi(i)P_{ij}
2:π(j)=i=0∑∞π(i)Pij
3
:
π
是
方
程
π
P
=
π
的
唯
一
非
负
解
,
其
中
:
3: \pi 是方程 \pi P=\pi 的唯一非负解,其中:
3:π是方程πP=π的唯一非负解,其中:
π
=
[
π
(
1
)
,
π
(
2
)
,
⋯
,
π
(
j
)
,
⋯
]
,
∑
i
=
0
∞
π
i
=
1
\pi = [\pi(1), \pi(2), \cdots, \pi(j),\cdots ], \quad \sum_{i=0}^{\infty} \pi_i = 1
π=[π(1),π(2),⋯,π(j),⋯],i=0∑∞πi=1
π
\pi
π称为马氏链的平稳分布
这个马氏链的收敛定理非常重要,所有的 MCMC(Markov Chain Monte Carlo) 方法都是以这个定理作为理论基础的。定理的证明相对复杂,一般的随机过程课本中也不给证明,所以我们就不用纠结它的证明了,直接用这个定理的结论就好了。我们对这个定理的内容做一些解释说明:
- 该定理中马氏链的状态不要求有限,可以是有无穷多个的,因此可以用于连续概率分布和离散概率分布;
- 非周期的马尔科夫链:这个主要是指马尔科夫链的状态转化不是循环的,如果是循环的则永远不会收敛。幸运的是我们遇到的马尔科夫链一般都是非周期性的
- 任何两个状态是连通的:这个指的是从任意一个状态可以通过有限步到达其他的任意一个状态,不会出现条件概率一直为0导致不可达的情况
- π 通常称为马尔科夫链的平稳分布。
3. Markov Chain Monte Carlo
对于给定的概率分布
p
(
x
)
p(x)
p(x)我们希望能有便捷的方式生成它对应的样本。由于马氏链能收敛到平稳分布, 于是一个很的漂亮想法是:如果我们能构造一个转移矩阵为
P
P
P的马氏链,使得该马氏链的平稳分布恰好是
p
(
x
)
p(x)
p(x),那么我们从任何一个初始状态
x
0
x_0
x0 出发沿着马氏链转移, 得到一个转移序列
x
0
,
x
1
,
x
2
,
⋯
x
n
,
x
n
+
1
⋯
x_0, x_1, x_2, \cdots x_n, x_{n+1}\cdots
x0,x1,x2,⋯xn,xn+1⋯
如果马氏链在第 n步已经收敛了,于是我们就得到了
π
(
x
)
的
样
本
x
n
,
x
n
+
1
,
.
.
.
\pi(x)的样本x_n,x_{n+1},...
π(x)的样本xn,xn+1,...
由上一节的例子和定理我们看到了,马氏链的收敛性质主要由转移矩阵 P决定, 所以基于马氏链做采样的关键问题是如何构造转移矩阵 P, 使得平稳分布恰好是我们要的分布
p
(
x
)
p(x)
p(x)如何能做到这一点呢?我们主要使用如下的定理:
定理:[细致平稳条件] 如果非周期马氏链的转移矩阵
P
P
P和分布
π
(
x
)
\pi(x)
π(x) 满足:
π
(
i
)
P
i
j
=
π
(
j
)
P
j
i
for all
i
,
j
\pi(i)P_{ij} = \pi(j)P_{ji} \quad\quad \text{for all} \quad i,j
π(i)Pij=π(j)Pjifor alli,j
则
π
(
x
)
\pi(x)
π(x)是马氏链的平稳分布,上式被称为细致平稳条件 (detailed balance condition)。
即满足马尔可夫链的收敛性质。
也就是说,只要我们找到了可以使概率分布
π
(
x
)
\pi(x)
π(x)满足细致平稳分布的矩阵P即可。这给了我们寻找从平稳分布
π
(
x
)
\pi(x)
π(x), 找到对应的马尔科夫链状态转移矩阵P的新思路。
不过不幸的是,仅仅从细致平稳条件还是很难找到合适的矩阵P。比如我们的目标平稳分布是
π
(
x
)
\pi(x)
π(x),随机找一个马尔科夫链状态转移矩阵Q,它是很难满足细致平稳条件的,即:
π
(
i
)
Q
(
i
,
j
)
≠
π
(
j
)
Q
(
j
,
i
)
\pi(i)Q(i,j) \neq \pi(j)Q(j,i)
π(i)Q(i,j)=π(j)Q(j,i)
那么如何使这个等式满足呢?下面我们来看MCMC采样如何解决这个问题。
由于一般情况下,目标平稳分布
π
(
x
)
\pi(x)
π(x)和某一个马尔科夫链状态转移矩阵Q不满足细致平稳条件,即:
π
(
i
)
Q
(
i
,
j
)
≠
π
(
j
)
Q
(
j
,
i
)
\pi(i)Q(i,j) \neq \pi(j)Q(j,i)
π(i)Q(i,j)=π(j)Q(j,i)
我们可以对上式做一个改造,使细致平稳条件成立。方法是引入一个α(i,j),使上式可以取等号,即:
π
(
i
)
Q
(
i
,
j
)
α
(
i
,
j
)
=
π
(
j
)
Q
(
j
,
i
)
α
(
j
,
i
)
\pi(i)Q(i,j)\alpha(i,j) = \pi(j)Q(j,i)\alpha(j,i)
π(i)Q(i,j)α(i,j)=π(j)Q(j,i)α(j,i)
问题是什么样的α(i,j)可以使等式成立呢?其实很简单,按照对称性,只要满足下两式即可:
α
(
i
,
j
)
=
π
(
j
)
Q
(
j
,
i
)
\alpha(i,j) = \pi(j)Q(j,i)
α(i,j)=π(j)Q(j,i)
α
(
j
,
i
)
=
π
(
i
)
Q
(
i
,
j
)
\alpha(j,i) = \pi(i)Q(i,j)
α(j,i)=π(i)Q(i,j)
所以有:
p
(
i
)
Q
(
i
,
j
)
α
(
i
,
j
)
⏟
Q
′
(
i
,
j
)
=
p
(
j
)
Q
(
j
,
i
)
α
(
j
,
i
)
⏟
Q
′
(
j
,
i
)
(
∗
∗
)
p(i) \underbrace{Q(i,j)\alpha(i,j)}_{Q'(i,j)}= p(j) \underbrace{Q(j,i)\alpha(j,i)}_{Q'(j,i)} \quad (**)
p(i)Q′(i,j)
Q(i,j)α(i,j)=p(j)Q′(j,i)
Q(j,i)α(j,i)(∗∗)
于是我们把原来具有转移矩阵
Q
Q
Q 的一个很普通的马氏链,改造为了具有转移矩阵
Q
′
Q^{'}
Q′ 的马氏链,而
Q
′
Q^{'}
Q′恰好满足细致平稳条件,由此马氏链
Q
′
Q^{'}
Q′ 的平稳分布就是
p
(
x
)
p(x)
p(x) !
在改造
Q
Q
Q 的过程中引入的
α
(
i
,
j
)
\alpha(i,j)
α(i,j)称为接受率,物理意义可以理解为在原来的马氏链上,从状态i以
Q
(
i
,
j
)
Q(i,j)
Q(i,j)的概率转跳转到状态 j的时候,我们以
α
(
i
,
j
)
\alpha(i,j)
α(i,j)的概率接受这个转移,于是得到新的马氏链
Q
′
Q^{'}
Q′的的转移概率为
Q
(
i
,
j
)
α
(
i
,
j
)
Q(i,j)\alpha(i,j)
Q(i,j)α(i,j)
马氏链转移和接受概率
假设我们已经有一个转移矩阵 Q(对应元素为
q
(
i
,
j
)
q(i,j)
q(i,j)), 把以上的过程整理一下,我们就得到了如下的用于采样概率分布
p
(
x
)
p(x)
p(x)的算法。
上述过程中
p
(
x
)
.
q
(
x
∣
y
)
p(x).q(x|y)
p(x).q(x∣y)说的都是离散的情形,事实上即便这两个分布是连续的,以上算法仍然是有效,于是就得到更一般的连续概率分布
p
(
x
)
p(x)
p(x)的采样算法,而
q
(
x
∣
y
)
q(x|y)
q(x∣y)就是任意一个连续二元概率分布对应的条件分布。
以上的 MCMC 采样算法已经能很漂亮的工作了,不过它有一个小的问题:马氏链 Q在转移的过程中的接受率 α ( i , j ) \alpha (i,j) α(i,j)可能偏小,这样采样过程中马氏链容易原地踏步,拒绝大量的跳转,这使得马氏链遍历所有的状态空间要花费太长的时间,收敛到平稳分布 p ( x ) p(x) p(x) 的速度太慢。有没有办法提升一些接受率呢?
M-H采样
M-H采样是Metropolis-Hastings采样的简称,这个算法首先由Metropolis提出,被Hastings改进,因此被称之为Metropolis-Hastings采样或M-H采样
M-H采样解决了我们上一节MCMC采样接受率过低的问题。
我们回到MCMC采样的细致平稳条件:
π
(
i
)
Q
(
i
,
j
)
α
(
i
,
j
)
=
π
(
j
)
Q
(
j
,
i
)
α
(
j
,
i
)
\pi(i)Q(i,j)\alpha(i,j) = \pi(j)Q(j,i)\alpha(j,i)
π(i)Q(i,j)α(i,j)=π(j)Q(j,i)α(j,i)
我们采样效率低的原因是α(i,j)太小了,比如为0.1,而α(j,i)为0.2。即:
π
(
i
)
Q
(
i
,
j
)
×
0.1
=
π
(
j
)
Q
(
j
,
i
)
×
0.2
\pi(i)Q(i,j)\times 0.1 = \pi(j)Q(j,i)\times 0.2
π(i)Q(i,j)×0.1=π(j)Q(j,i)×0.2
这时我们可以看到,如果两边同时扩大五倍,接受率提高到了0.5,但是细致平稳条件却仍然是满足的,即:
π
(
i
)
Q
(
i
,
j
)
×
0.5
=
π
(
j
)
Q
(
j
,
i
)
×
1
\pi(i)Q(i,j)\times 0.5 = \pi(j)Q(j,i)\times 1
π(i)Q(i,j)×0.5=π(j)Q(j,i)×1
这样我们的接受率可以做如下改进,即:
α
(
i
,
j
)
=
m
i
n
{
π
(
j
)
Q
(
j
,
i
)
π
(
i
)
Q
(
i
,
j
)
,
1
}
\alpha(i,j) = min\{ \frac{\pi(j)Q(j,i)}{\pi(i)Q(i,j)},1\}
α(i,j)=min{π(i)Q(i,j)π(j)Q(j,i),1}
于是,经过对上述 MCMC 采样算法中接受率的微小改造,我们就得到了如下教科书中最常见的 Metropolis-Hastings 算法。
4: Gibbs Sampling
对于高维的情形,由于接受率 α的存在 (通常 α<1),以上 Metropolis-Hastings 算法的效率不够高。能否找到一个转移矩阵 Q 使得接受率 α=1呢?我们先看看二维的情形,假设有一个概率分布
p(x,y), 考察
x
x
x 坐标相同的两个点 A(x1,y1),B(x1,y2),我们发现
p
(
x
1
,
y
1
)
p
(
y
2
∣
x
1
)
=
p
(
x
1
)
p
(
y
1
∣
x
1
)
p
(
y
2
∣
x
1
)
p
(
x
1
,
y
2
)
p
(
y
1
∣
x
1
)
=
p
(
x
1
)
p
(
y
2
∣
x
1
)
p
(
y
1
∣
x
1
)
p(x_1,y_1)p(y_2|x_1) = p(x_1)p(y_1|x_1)p(y_2|x_1) \\ p(x_1,y_2)p(y_1|x_1) = p(x_1)p(y_2|x_1)p(y_1|x_1)
p(x1,y1)p(y2∣x1)=p(x1)p(y1∣x1)p(y2∣x1)p(x1,y2)p(y1∣x1)=p(x1)p(y2∣x1)p(y1∣x1)
所以有:
p
(
x
1
,
y
1
)
p
(
y
2
∣
x
1
)
=
p
(
x
1
,
y
2
)
p
(
y
1
∣
x
1
)
(
∗
∗
∗
)
p(x_1,y_1)p(y_2|x_1) = p(x_1,y_2)p(y_1|x_1) \quad (***)
p(x1,y1)p(y2∣x1)=p(x1,y2)p(y1∣x1)(∗∗∗)
即:
p
(
A
)
p
(
y
2
∣
x
1
)
=
p
(
B
)
p
(
y
1
∣
x
1
)
p(A)p(y_2|x_1) = p(B)p(y_1|x_1)
p(A)p(y2∣x1)=p(B)p(y1∣x1)
基于以上等式,我们发现,在 x=x1这条平行于 y轴的直线上,如果使用条件分布
p
(
y
∣
x
1
)
p(y|x1)
p(y∣x1)
做为任何两个点之间的转移概率,那么任何两个点之间的转移满足细致平稳条件。同样的,如果我们在 y=y1这条直线上任意取两个点 A(x1,y1),C(x2,y1),也有如下等式:
p
(
A
)
p
(
x
2
∣
y
1
)
=
p
(
C
)
p
(
x
1
∣
y
1
)
.
p(A)p(x_2|y_1) = p(C)p(x_1|y_1).
p(A)p(x2∣y1)=p(C)p(x1∣y1).
平面上马氏链转移矩阵的构造
于是我们可以如下构造平面上任意两点之间的转移概率矩阵 Q
Q
(
A
→
B
)
=
p
(
y
B
∣
x
1
)
如果
x
A
=
x
B
=
x
1
Q
(
A
→
C
)
=
p
(
x
C
∣
y
1
)
如果
y
A
=
y
C
=
y
1
Q
(
A
→
D
)
=
0
其它
\begin{aligned} Q(A\rightarrow B) & = p(y_B|x_1) & \text{如果} \quad x_A=x_B=x_1 & \\ Q(A\rightarrow C) & = p(x_C|y_1) & \text{如果} \quad y_A=y_C=y_1 & \\ Q(A\rightarrow D) & = 0 & \text{其它} & \\ \end{aligned}
Q(A→B)Q(A→C)Q(A→D)=p(yB∣x1)=p(xC∣y1)=0如果xA=xB=x1如果yA=yC=y1其它
有了如上的转移矩阵 Q,我们很容易验证对平面上任意两点 X,Y, 满足细致平稳条件
p
(
X
)
Q
(
X
→
Y
)
=
p
(
Y
)
Q
(
Y
→
X
)
p(X)Q(X\rightarrow Y) = p(Y) Q(Y\rightarrow X)
p(X)Q(X→Y)=p(Y)Q(Y→X)
这个算法就称为 Gibbs Sampling 算法
多维Gibbs采样
上面的这个算法推广到多维的时候也是成立的。比如一个n维的概率分布
π
(
x
1
,
x
2
,
.
.
.
x
n
)
\pi(x_1,x_2,...x_n)
π(x1,x2,...xn)
我们可以通过在n个坐标轴上轮换采样,来得到新的样本。对于轮换到的任意一个坐标轴xi上的转移,马尔科夫链的状态转移概率为
P
(
x
i
∣
x
1
,
x
2
,
.
.
.
,
x
i
−
1
,
x
i
+
1
,
.
.
.
,
x
n
)
P(x_i|x_1,x_2,...,x_{i-1},x_{i+1},...,x_n)
P(xi∣x1,x2,...,xi−1,xi+1,...,xn)即固定n−1个坐标轴,在某一个坐标轴上移动。
轮换坐标轴不是必须的,我们可以随机选择某一个坐标轴进行状态转移,只不过常用的Gibbs采样的实现都是基于坐标轴轮换的。
参考资料
https://cosx.org/2013/01/lda-math-mcmc-and-gibbs-sampling
https://www.cnblogs.com/pinard/p/6645766.html