在 第十四课中讲述了马尔科夫链与其稳态的性质,本篇讨论基于马尔科夫链蒙特卡洛(MCMC)方法的采样。
M-H采样
Metropolis-Hastings采样原理
我们的目标分布是 p ( z ) p(z) p(z),同时我们手里有一个便于随时间进行遍历的马尔科夫链,其状态转移矩阵为 Q Q Q。
为了便于在马尔科夫链上随时间进行状态转移,这里的矩阵
Q
Q
Q设计为:
Q
i
j
=
P
(
x
∗
∣
x
)
=
N
(
μ
=
x
,
σ
=
1
)
.
p
m
f
(
x
∗
)
Q_{ij}=P(x^{*}|x)=N(\mu=x,\sigma=1).pmf(x^{*})
Qij=P(x∗∣x)=N(μ=x,σ=1).pmf(x∗)
上面式子指的是从
t
t
t时刻的某个指定采样点
x
x
x转移到
t
+
1
t+1
t+1时刻的指定采样点
x
∗
x^{*}
x∗的概率等于在均值为
x
x
x,方差为1的整体分布中取得
x
∗
x^{*}
x∗的概率值,本应写作
p
d
f
pdf
pdf,因为正态分布是连续型分布,但是由于是机器采样,实际上已经把目标分布以及正态分布都离散化了,所以
p
m
f
pmf
pmf符合实际操作。
但这样一个(提议矩阵)
Q
Q
Q显然和目标分布
p
(
z
)
p(z)
p(z)不能满足马尔科夫链的细致平稳条件,即:
p
(
z
)
Q
(
z
,
z
∗
)
≠
p
(
z
∗
)
Q
(
z
∗
,
z
)
p(z)Q(z,z^{*})\neq p(z^{*})Q(z^{*},z)
p(z)Q(z,z∗)=p(z∗)Q(z∗,z)
这里,为了表达的统一,将状态转移矩阵对应的马尔科夫链的状态
z
z
z转移到状态
z
∗
z^{*}
z∗的概率记作
Q
(
z
,
z
∗
)
Q(z,z^{*})
Q(z,z∗);
为了满足细致平稳条件,引入接受率因子的表达式:
α
(
z
,
z
∗
)
=
m
i
n
(
1
,
p
(
z
∗
)
Q
(
z
∗
,
z
)
p
(
z
)
Q
(
z
,
z
∗
)
)
\alpha(z,z^{*})=min(1,\frac{p(z^{*})Q(z^{*},z)}{p(z)Q(z,z^{*})})
α(z,z∗)=min(1,p(z)Q(z,z∗)p(z∗)Q(z∗,z))
原来的不等式两边各自乘上接受率因子,细致平稳条件得到满足:
p
(
z
)
Q
(
z
,
z
∗
)
α
(
z
,
z
∗
)
=
p
(
z
∗
)
Q
(
z
∗
,
z
)
α
(
z
∗
,
z
)
p(z)Q(z,z^{*})\alpha(z,z^{*})=p(z^{*})Q(z^{*},z)\alpha(z^{*},z)
p(z)Q(z,z∗)α(z,z∗)=p(z∗)Q(z∗,z)α(z∗,z)
证明如下:
但是,现在的 p ( z ) p(z) p(z)已经不是 Q Q Q对应的马尔科夫链的稳态分布,而是叠加了接受率之后的新转移过程 Q α Q\alpha Qα。
细致平稳条件的意义在于证明一个分布确实是该转移过程对应的稳态分布。
M-H采样步骤
假设要采样 N N N个样本,初始化第一个时刻的状态 z ( 1 ) z^{(1)} z(1),根据马尔科夫链生成 z ( 1 ) , . . . , z ( T ) z^{(1)},...,z^{(T)} z(1),...,z(T);
共 T T T轮采样,第 i i i轮的采样过程如下:
第一步:从 [ 0 , 1 ] [0,1] [0,1]均匀分布中随机抽取一个数 u u u,即 u ∼ U ( 0 , 1 ) u\sim U(0,1) u∼U(0,1);
第二步:利用状态转移矩阵,从上一轮的样本 z ( i − 1 ) z^{(i-1)} z(i−1)依概率抽取出这一步应该转移到的状态 z ∗ z^{*} z∗,即: z ∗ ∼ Q ( z , z ( i − 1 ) ) z^{*}\sim Q(z,z^{(i-1)}) z∗∼Q(z,z(i−1))
第三步:计算接受率:
α
=
m
i
n
(
1
,
p
(
z
∗
)
Q
(
z
∗
,
z
(
i
−
1
)
)
p
(
z
(
i
−
1
)
)
Q
(
z
(
i
−
1
)
,
z
∗
)
)
\alpha=min(1,\frac{p(z^{*})Q(z^{*},z^{(i-1)})}{p(z^{(i-1)})Q(z^{(i-1)},z^{*})})
α=min(1,p(z(i−1))Q(z(i−1),z∗)p(z∗)Q(z∗,z(i−1)))
其中,
p
(
z
∗
)
p(z^{*})
p(z∗)可由状态
z
∗
z^{*}
z∗出现的频次统计得到;
第四步:如果 u ≤ α u\leq \alpha u≤α,那么我们把 z ∗ z^{*} z∗作为第 i i i轮的采样值,即 z ( i ) = z ∗ z^{(i)}=z^{*} z(i)=z∗,如果 u ≥ α u\geq \alpha u≥α,抛弃 z ∗ z^{*} z∗,沿用上一轮的采样值 z ( i − 1 ) z^{(i-1)} z(i−1)作为本轮的采样值,即 z ( i ) = z ( i − 1 ) z^{(i)}=z^{(i-1)} z(i)=z(i−1)
其中,第二步的采样体现了转移过程 Q Q Q,第三步和第四步的采样基于 Q Q Q的采样结果,实现了转移过程 Q α Q\alpha Qα的采样;
经过燃烧期后,我们取连续 N N N个时间点的状态值 z ( t ) , . . . , z ( t + N ) z^{(t)},...,z^{(t+N)} z(t),...,z(t+N),作为目标分布的样本近似。
一般而言,我们会选取一个比较适合进行状态转移操作的马尔科夫链,这里描述为:作为状态空间 S S S里的任意两个状态,第 i i i个状态 x x x,第 j j j个状态 x ∗ x^{*} x∗, Q i j = P ( x ∗ ∣ x ) = N ( μ = x , σ = 1 ) . p m f ( x ∗ ) Q_{ij}=P(x^{*}|x)=N(\mu=x,\sigma=1).pmf(x^{*}) Qij=P(x∗∣x)=N(μ=x,σ=1).pmf(x∗);
显然,这样的 Q Q Q是合适的:
- 第一,矩阵的任意一行之和为1,符合概率分布的定义: ∑ j Q i j = ∑ x ∗ ∈ S N ( μ = x , σ = 1 ) . p m f ( x ∗ ) = 1 \sum_{j}Q_{ij}=\sum_{x^{*}\in S}N(\mu=x,\sigma=1).pmf(x^{*})=1 j∑Qij=x∗∈S∑N(μ=x,σ=1).pmf(x∗)=1
- 采样方便,从当前状态 x x x,决定下一个状态 x ∗ x^{*} x∗,就是从正态分布 N ( μ = x , σ = 1 ) N(\mu=x,\sigma=1) N(μ=x,σ=1)中采样一个样本的过程。
- 具有对称性,
Q
i
j
=
Q
j
i
Q_{ij}=Q_{ji}
Qij=Qji,使得接受率得到化简:
α
=
m
i
n
(
1
,
p
(
z
∗
)
Q
(
z
∗
,
z
)
p
(
z
)
Q
(
z
,
z
∗
)
)
=
m
i
n
(
1
,
p
(
z
∗
)
p
(
z
)
)
\alpha=min(1,\frac{p(z^{*})Q(z^{*},z)}{p(z)Q(z,z^{*})})=min(1,\frac{p(z^{*})}{p(z)})
α=min(1,p(z)Q(z,z∗)p(z∗)Q(z∗,z))=min(1,p(z)p(z∗))
从而方便计算。
Gibbs方法
Gibbs核心流程
在M-H的基础上,介绍Gibbs采样;
吉布斯采样是一种针对高维分布的采样方法,假设我们待采样的高维目标分布为 p ( z 1 , z 2 , . . . , z m ) p(z_{1},z_{2},...,z_{m}) p(z1,z2,...,zm),吉布斯采样的目标就是从这个高维分布中采样出一组样本 z ( 1 ) , z ( 2 ) , . . . , z ( N ) z^{(1)},z^{(2)},...,z^{(N)} z(1),z(2),...,z(N),使得这组样本服从 m m m维分布 p ( z ) p(z) p(z);
我们约定标记:按照上述假设,从分布中采样得到的样本 z z z是一个 m m m维的样本, z i z_{i} zi为该样本的第 i i i维属性值, z − i z_{-i} z−i表示除第 i i i维外的所有 m − 1 m-1 m−1个属性值。
Gibbs的核心为一维一维地采样:
以三维随机变量 z z z为例: p ( z ) = p ( z 1 , z 2 , z 3 ) p(z)=p(z_{1},z_{2},z_{3}) p(z)=p(z1,z2,z3)
首先在第一个时刻即时刻0,给定初值: z 1 ( 0 ) , z 2 ( 0 ) , z 3 ( 0 ) z^{(0)}_{1},z^{(0)}_{2},z^{(0)}_{3} z1(0),z2(0),z3(0)
在下一时刻,采样值生成为: z 1 ( 1 ) ∼ p ( z 1 ∣ z 2 ( 0 ) , z 3 ( 0 ) ) z^{(1)}_{1}\sim p(z_{1}|z^{(0)}_{2},z^{(0)}_{3}) z1(1)∼p(z1∣z2(0),z3(0)) z 2 ( 1 ) ∼ p ( z 2 ∣ z 1 ( 1 ) , z 3 ( 0 ) ) z^{(1)}_{2}\sim p(z_{2}|z^{(1)}_{1},z^{(0)}_{3}) z2(1)∼p(z2∣z1(1),z3(0)) z 3 ( 1 ) ∼ p ( z 3 ∣ z 1 ( 1 ) , z 2 ( 1 ) ) z^{(1)}_{3}\sim p(z_{3}|z^{(1)}_{1},z^{(1)}_{2}) z3(1)∼p(z3∣z1(1),z2(1))
接着往下递推,有:
z
1
(
t
+
1
)
∼
p
(
z
1
∣
z
2
(
t
)
,
z
3
(
t
)
)
z^{(t+1)}_{1}\sim p(z_{1}|z^{(t)}_{2},z^{(t)}_{3})
z1(t+1)∼p(z1∣z2(t),z3(t))
z
2
(
t
+
1
)
∼
p
(
z
2
∣
z
1
(
t
+
1
)
,
z
3
(
t
)
)
z^{(t+1)}_{2}\sim p(z_{2}|z^{(t+1)}_{1},z^{(t)}_{3})
z2(t+1)∼p(z2∣z1(t+1),z3(t))
z
3
(
t
+
1
)
∼
p
(
z
3
∣
z
1
(
t
+
1
)
,
z
2
(
t
+
1
)
)
z^{(t+1)}_{3}\sim p(z_{3}|z^{(t+1)}_{1},z^{(t+1)}_{2})
z3(t+1)∼p(z3∣z1(t+1),z2(t+1))
其中,
p
(
z
i
∣
z
−
i
)
p(z_{i}|z_{-i})
p(zi∣z−i)可以由统计结果得到;
依次循环,采样出 N N N个样本: z ( 1 ) , z ( 2 ) , . . . , z ( N ) z^{(1)},z^{(2)},...,z^{(N)} z(1),z(2),...,z(N),去除燃烧期的样本,剩下的就是目标的高维分布。
Gibbs采样的合理性证明
Gibbs其实是M-H采样的特殊情况,首先,我们采样的目标分布为 p ( z ) p(z) p(z),并把M-H使用的转移矩阵 Q Q Q重新定义为 p p p本身: Q ( z ∗ , z ) = p ( z i ∣ z − i ∗ ) Q(z^{*},z)=p(z_{i}|z^{*}_{-i}) Q(z∗,z)=p(zi∣z−i∗);
重新计算接受率:
α
=
m
i
n
(
1
,
p
(
z
∗
)
Q
(
z
∗
,
z
)
p
(
z
)
Q
(
z
,
z
∗
)
)
\alpha=min(1,\frac{p(z^{*})Q(z^{*},z)}{p(z)Q(z,z^{*})})
α=min(1,p(z)Q(z,z∗)p(z∗)Q(z∗,z))注意到
p
(
z
)
=
p
(
z
i
,
z
−
i
)
=
p
(
z
i
∣
z
−
i
)
p
(
z
−
i
)
p(z)=p(z_{i},z_{-i})=p(z_{i}|z_{-i})p(z_{-i})
p(z)=p(zi,z−i)=p(zi∣z−i)p(z−i),所以接受率为:
α
=
m
i
n
(
1
,
p
(
z
∗
)
Q
(
z
∗
,
z
)
p
(
z
)
Q
(
z
,
z
∗
)
)
=
m
i
n
(
1
,
[
p
(
z
i
∗
∣
z
−
i
∗
)
p
(
z
−
i
∗
)
]
p
(
z
i
∣
z
−
i
∗
)
[
p
(
z
i
∣
z
−
i
)
p
(
z
−
i
)
]
p
(
z
i
∗
∣
z
−
i
)
)
\alpha=min(1,\frac{p(z^{*})Q(z^{*},z)}{p(z)Q(z,z^{*})})=min(1,\frac{[p(z^{*}_{i}|z^{*}_{-i})p(z^{*}_{-i})]p(z_{i}|z^{*}_{-i})}{[p(z_{i}|z_{-i})p(z_{-i})]p(z^{*}_{i}|z_{-i})})
α=min(1,p(z)Q(z,z∗)p(z∗)Q(z∗,z))=min(1,[p(zi∣z−i)p(z−i)]p(zi∗∣z−i)[p(zi∗∣z−i∗)p(z−i∗)]p(zi∣z−i∗))
在
z
z
z到
z
∗
z^{*}
z∗的转移中,固定采样值
z
z
z的
−
i
-i
−i维属性,单一采样
z
∗
z^{*}
z∗的第
i
i
i维属性,因此,在一次属性采样前后的
z
−
i
z_{-i}
z−i和
z
−
i
∗
z^{*}_{-i}
z−i∗是等价的,所以将式子中的
z
−
i
∗
z^{*}_{-i}
z−i∗替换为
z
−
i
z_{-i}
z−i,即:
即有Gibbs采样的接受率为1,所以Gibbs采样中不需要像M-H一样生成
u
u
u,并用
u
u
u与接受率进行比较(因为
u
u
u总是小于
α
\alpha
α,所以
z
∗
z^{*}
z∗必然不会被抛弃)。另外,Gibbs是M-H的特例(转移矩阵为目标分布的条件概率,接受率恒为1),所以Gibbs采样的
p
p
p和
Q
Q
Q满足细致平稳条件,因此按照
Q
Q
Q的转移过程进行采样,即可以近似得到目标分布
p
(
z
)
p(z)
p(z)。
Gibbs采样实验
令目标分布是一个二维高斯分布
z
∼
N
(
μ
,
Σ
)
z\sim N(\mu,\Sigma)
z∼N(μ,Σ),均值向量为
μ
=
[
3
,
3
]
T
\mu=[3,3]^{T}
μ=[3,3]T,协方差矩阵为:
现在利用Gibbs采样,获取服从上述分布的样本值。
为了简单演示,我们用已知的条件概率直接生成样本,写成条件分布形式为:
则条件分布
z
1
∣
z
2
z_{1}|z_{2}
z1∣z2和
z
2
∣
z
1
z_{2}|z_{1}
z2∣z1服从:
采样实验如下:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
#依照z1|z2的条件高斯分布公式,给定z2的条件情况下采样出z1
def p_z1_given_z2(z2, mu, sigma):
mu = mu[0] + sigma[1][0] / sigma[0][0] * (z2 - mu[1])
sigma = sigma[0][0] - sigma[1][0]**2 / sigma[1][1]
return np.random.normal(mu, sigma)
#依照z2|z1的条件高斯分布公式,给定z1的条件情况下采样出z2
def p_z2_given_z1(z1, mu, sigma):
mu = mu[1] + sigma[0][1] / sigma[1][1] * (z1 - mu[0])
sigma = sigma[1][1] - sigma[0][1]**2 / sigma[0][0]
return np.random.normal(mu, sigma)
#Gibbs采样过程
def gibbs_sampling(mu, sigma, samples_period):
samples = np.zeros((samples_period, 2))
# np.random.rand():从0-1均匀分布采样1个数
z2 = np.random.rand() * 10
for i in range(samples_period):
z1 = p_z1_given_z2(z2, mu, sigma)
z2 = p_z2_given_z1(z1, mu, sigma)
samples[i, :] = [z1, z2]
return samples
#目标分布p(z)
mus = np.array([3, 3])
sigmas = np.array([[1, 0.6], [0.6, 1]])
#确定总的采样期和燃烧期
burn_period = int(1e4)
samples_period = int(1e5)
#得到采样样本,舍弃燃烧期样本点
samples = gibbs_sampling(mus, sigmas, samples_period)[burn_period:]
plt.plot(samples[:, 0], samples[:, 1], 'ro', alpha=0.05, markersize=1)
plt.show()