Markov Chain & Monte Carlo

Background

在概率图模型的推断过程中,当过程比较复杂时,需要进行大量的计算,这时候就需要使用一些近似推断的方法。

Monte Carlo Method

蒙特卡洛方法是一种基于随机采样的数值计算方法,主要用于求解无法通过解析方法求解的问题。

近似求解圆周率

假设我们拥有一个能从U(0,1)中采样的方法,那么我们可以通过采样的方法来求解圆周率。

img

具体的方法为:我们可以通过一个正方形和一个内切圆,均匀分布落在圆内的概率为P(A)=π4依据伯努利大数定律1ni=1nIA,iPP(A),我们可以通过采样的方法来求解圆周率。

import random
iters = 1000000

points = [(random.random(), random.random()) for _ in range(iters)]
inside = 0
for x,y in points:
    if x**2 + y**2 < 1:
        inside += 1

print("pi = ", 4 * inside / iters)

Monte Carlo 数值积分

假设我们要求解一个函数f(x)的积分abf(x)dx, 我们没有解析解,因此我们对形式处理一下。

abf(x)dx=abf(x)p(x)p(x)dx=Ep(x)[f(x)p(x)]

其中要求p(x)是一个分布,即p(x)0,且abp(x)dx=1,我们可以通过采样的方法来求解积分。如果p(x)是一个均匀分布,那么我们可以通过均匀采样的方法来求解积分。

Ep(x)[f(x)p(x)]1Ni=1Nf(xi)p(xi)

# 求解y= x^2 + 1 在 [0,1] 上的定积分

iters = 1000000
total = 0
for _ in range(iters):
    x = random.random()
    total += x**2 + 1

print("integral = ", total / iters)

Monte Carlo 采样方法

一种基于采样的随机近似方法,主要用途是数值积分。

而我们经常通过一个概率p(Z|X),其中Z是我们 latent variable,X是 observed variable,来求取期望EZ|X[f(Z)]=f(Z)p(Z|X)dZ,此时可以使用 Monte Carlo 通过采样求积分, f(Z)p(Z|X)dZ1Nf(Zi), 那么问题就转化为了如何从复杂分布中采样Zi

1. 概率分布采样

通过计算机能够产生一个U(0,1)的随机数,然后通过给定的 pdf p(z)获得 cdf,然后通过 cdf 的反函数得到采样。

假设我们有均匀分布的采样点zU(0,1),待采样的 pdf 为p(x),cdf 为F(x),那么我们可以通过F1(z)来获得采样点。

于是X=F1(Z),要证明采样后的X的分布为p(x),我们可以通过计算F(x)=P(Xx)=P(F1(Z)x)=P(ZF(x))=0F(x)1 dt=F(x),即X的 cdf 为F(x),那么X的 pdf 为p(x)

但是如果我们无法直接计算 cdf / cdf 的反函数,我们不能使用这种方法。

2. 拒绝采样 (Rejection Sampling)

先指定一个 proposal distribution q(z),使得 Mq(z)p(z),其中 M 是一个常数,指定接受率α=p(zi)Mq(zi), 算法描述为:

a. 从 q(z) 中采样 zi
b. 在 0-1 均匀分布中采样 u
c. 如果 uα 则接受 zi,否则拒绝

即,我们其实知道p(zi)在某一点的取值,但是我们不知道整体的分布,因此我们通过一个简单的分布q(z)来近似,然后通过接受率来判断是否接受。

那么采样得到zi的概率q(zi), 保留zi的概率为p(accept|zi)=p(zi)Mq(zi), 那么我们可以得到采样得到zi的概率为q(zi)p(accept|zi)=p(zi)M,那么最后保留下来样本中,zi的分布为p(zi|accept)=p(zi)

# 要从 p(x) 中采样
import math

def p(x):
    "Standard normal distribution"
    return math.exp(-x**2) / math.sqrt(2 * math.pi)

def accept(x,k):
    return p(x) / k

iters = 1000000
points = []
for _ in range(iters):
    x = random.uniform(-10, 10)
    u = random.random()
    if u < accept(x,1):
        points.append(x)

# 绘制直方图
plt.hist(points, bins=100, density=True)
plt.show()

img

3. 重要性采样 (Importance Sampling)

Ep(z)[f(z)]=p(z)f(z)dz=p(z)q(z)q(z)f(z)dz1Nf(zi)p(zi)q(zi)

严重依赖于 q 的选择,如果 q 选择不当,会导致采样的效率很低。

4. Sampling Importance Resampling (SIR)

Markov Chain

随机过程研究的是一个随机变量序列,而马尔可夫链是一种特殊的随机过程。

马尔可夫链是一个事件和状态都是离散的,具有齐次n阶马尔可夫性的随机过程,即给定现在的状态,未来的状态与过去的状态无关。
1 阶 Markov Chain:p(xt|xt1,xt2,,x1)=p(xt|xt1)

我们定义转移矩阵pij=p(xt+1=j|xt=i)

以概率图模型表示,即为

x1

x2

x3

...

xt

....

t时刻状态的x取值可以由t1时刻的状态+转移概率求边缘概率得到。

平稳分布π=πP,其中π是一个行向量,P是转移矩阵,π是一个平稳分布,即π=πP=πP2=,也可以表示为π(i)=jπ(j)pji

Detailed balance conditionπ(i)pij=π(j)pji

Detailed balance conditionBalance Distribution

Proof

jπ(j)pji=jπ(i)pij=π(i)jpij=π(i)

假如我们能够构造一个马尔可夫链,使得其平稳分布为我们要求的分布,那么我们就可以通过马尔可夫链的采样来获得我们要求的分布。

MH Algorithm

主要思想:从一个 Markov Chain 中不断地采样,使得其平稳分布为我们要求的分布。

我们需要构造转移矩阵,使得其平稳分布为我们要求的分布。但是不能直接构造出这样的矩阵,但是通过 detailed balance condition 可以构造平稳分布,因此我们先构造一个提议分布Q(x|xt1),然后通过构造一个接受率来使得满足以下条件:

p(xt1)Q(x|xt1)A(x|xt1)=p(x)Q(xt1|x)A(xt1|x)

如果我们定义接受率为A(x|xt1)=min(1,p(x)Q(xt1|x)p(xt1)Q(x|xt1)) ,那么上述等式就可以满足 detailed balance condition。

Proof

那么上述等式左边即可被表示为:

p(xt1)Q(x|xt1)A(x|xt1)=p(xt1)Q(x|xt1)min(1,p(x)Q(xt1|x)p(xt1)Q(x|xt1))=min(p(xt1)Q(x|xt1),p(x)Q(xt1|x))=p(xt1)Q(x|xt1)min(1,p(x)Q(xt1|x)p(xt1)Q(x|xt1))=p(x)Q(xt1|x)A(xt1|x)

即我们可以通过构造一个接受率为A(x|xt1)=min(1,p(x)Q(xt1|x)p(xt1)Q(x|xt1))的转移矩阵,使得其平稳分布为我们要求的分布。

End Proof

那么根据拒绝采样的思想,我们可以通过一个简单的分布q(x)来近似p(x),然后通过接受率来判断是否接受。

这里的接受率在算法当中是怎么计算出来的?

posted @   Blackteaxx  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示