因为RBN,学习了一会儿MCMC,理解不太深,但在接触Bayesian GAN时碰到HMC又很晕,好在看了两篇博客,重新梳理了MCMC,对HMC有了点初步理解,整理如下。
两篇博客一篇是CSDN,一篇是WordPress上的。CSDN应该是翻译WordPress上的。
上述博客对细致平稳条件没有多加解释,因此理解有点困难。
1. Monte Carlo算法是什么?
这个总是容易忘记,Monte Carlo算法就是随机过程的模拟算法,模拟的输出就是随机过程的样本。通过对模拟得到的样本进行统计,我们就可以求积分,求最优解,当然求出来的都是可以实际应用的近似值(Approximation)。
1.1 求积分公式
如果需要求积分
1.2 求最大值
如果需要求
2. 如何模拟?——简单的接受拒绝采样
对于任意的概率分布
第一步:红色p(z)难以直接采样,蓝色q(z)可以直接采样,先根据q(z)采样得到
第二步:再在[0 kq(
因此,
3. MCMC模拟
马尔科夫链随机模拟的原理是基于马尔科夫链的平稳特性,对于满足一定条件的状态转移概率矩阵
对于需要模拟的概率分布
对于多维情况,则可应用Gibbs算法,从条件概率来构造状态转移概率矩阵。
3.1 Metropolis算法及Metropolis-Hasting算法
下面为Metropolis算法,其中
为了提高状态的接受概率,可以将等式两边的
3.2 Gibbs算法
对于多维状态的情况任意两状态
4. Hamiltonian Monte Carlo算法
HMC算法应该也算是一种Metropolis-Hasting算法,通过Hamiltonian偏微分方程来实现初始状态转移,通过接受拒绝算法来满足细致平稳条件。与普通的Metropolis-Hasting算法的区别在于其初始状态转移是确定的,即概率为1(相比普通的
4.1 Hamiltonian系统
系统方程:
其中U相当于系统势能,K相当于系统动能。系统能量是守恒的,即H不变。根据一个初始状态和时间能够计算目标状态,系统能量不变。
依据Hamiltonian系统构建如下Markov链有如下性质:
1)对于任一q的初始状态
q0 ,按照分布1Zpexp(−K(p)) 采样得到p0
2) 从p0,q0 根据Hamiltonian方程得到p1,q1 ,将q1 赋给q0 ,回到第一步继续计算q1 。
3)重复1,2步骤,得到q的采样序列。则q稳态的概率分布为1Zqexp(−U(q))
证明:
假设q的稳态分布为,
所以Hamiltonian系统Markov链的状态转移概率等式为:
所以,
所以,q的稳态分布为
4.2 HMC算法
HMC的目标是模拟实现
实现思路是:
1)首先构造一个容易模拟的正态分布
1Zpexp(−K(p))
2)模拟Hamiltionian系统的Markov链实现对q的采样
3)根据前面Hamiltonian系统Markov链性质,q的稳态分布为1Zqexp(−U(q))
算法步骤:
任意取一个q的初始状态
重复如下计算:
1)依据正态分布采样得到
2)以
3)计算
4)从[0,1]均匀分布抽样得到一随机数
很容易证明该算法满足如下细致平稳条件等式:
之所以要进行接受拒绝操作是因为由于离散计算导致Hamiltonian系统Markov链转移概率发生变化。
4.3 HMC模拟采样双正态分布的python代码
仿照theclevermachine博客中的matlab代码,用python实现HMC模拟采样双正态分布,代码在csdn资源上:http://download.csdn.net/download/tkyjqh/10176310
发现matlab实现中有两个细节差异:
1)U函数没有除2
2)Hamiltonian计算并没有全部采用Leap-Frog算法。
在python实现时,试图改进。结果如下:
1)采用Leap-Frog算法,U函数不除2,接受概率1
2)采用Leap-Frog算法,U函数除2,接受概率1
3)采用Euller算法,U函数不除2,接受概率0.73
4)采用Euller算法,U函数除2,接受概率0.98
统计接受概率可以发现Leap-Frog算法基本上全接受,采用Euller算法,接受概率将降低,而且U是否除2将影响接受概率。