theano学习指南--混合蒙特卡洛采样(翻译)

Posted 蓝色荣誉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了theano学习指南--混合蒙特卡洛采样(翻译)相关的知识,希望对你有一定的参考价值。

欢迎fork我的github:https://github.com/zhaoyu611/DeepLearningTutorialForChinese

最近在学习Git,所以正好趁这个机会,把学习到的知识实践一下~ 看完DeepLearning的原理,有了大体的了解,但是对于theano的代码,还是自己撸一遍印象更深 所以照着deeplearning.net上的代码,重新写了一遍,注释部分是原文翻译和自己的理解。 感兴趣的小伙伴可以一起完成这个工作哦~ 有问题欢迎联系我 Email: zhaoyuafeu@gmail.com QQ: 3062984605


理论

能量模型的最大化似然函数需要一个鲁棒算法对负项进行采样。(见 Restricted Boltzmann Machines (RBM)的公式4)。当使用CD或PCD训练RBms时,通常使用块Gibbs采样,其中条件分布 p(h|v) p(v|h) 是马尔科夫链的转换操作。
然而在某些情况下,这些条件分布难以采样(例如RBM的均方差,逆矩阵)。同样,即使能够有效的Gibbs采样,由于它采用随机采样,所以对某些分布效果可能不理想。本文中,当从连续变量中采样时,可以证明混合蒙特卡洛法(HMC)是一种有效的工具[Duane87]。它模仿物理系统中的密尔顿动力学,从而较好了解决了条件分布的采样过程。
在HMC,模拟物理系统进行采样。物理系统中粒子拥有势能和动能,从而在高维空间运动。根据 [Neal93]提出的概念,粒子可以通过位置矢量(或状态矢量 sRD )和速度矢量 ϕRD 。粒子的组合态表示为 χ=(s,ϕ) 。汉密尔顿定义为势能 E(s) (能量模型使用同样的能量函数)和动能的总和。定义如下:


相比直接采样 p(s) ,HMC从正则分布 采样。因为两个变量是相互独立的,边缘化的 ϕ 是原始分布无重要影响。

汉密尔顿动力学

在仿真环境中,即使状态量 ϕ 和速度量 ϕ 发生变化, H(s,ϕ) 也会保持不变。微分方程如下:
(1)
[Neal93]指出,上述变换是可逆的。上述动力学方程可以看做是马尔科夫链的变形,但 p(s,ϕ) 是保持不变的。链本身不会变化,因为仿真动力学方程会保持固定的汉密尔顿函数 H(s,ϕ) 。HMC在汉密尔顿动力学函数和速度的Gibbs采样中交替进行。因为 p(s) p(ϕ) 相互独立,所以无须进行 ϕnewp(ϕ|s) ,因为 p(ϕ|s)=p(ϕ) ,通常 p(ϕ) 是单变量高斯分布。

蛙跳算法

事实上,由于研究的问题是时间离散的,所以我们无法精确的计算汉密尔顿动力学方程。这里有若干解决途径。为了保持马尔科夫链的不变性,必须保持容积恒定和时间可逆的属性。蛙跳算法保持这些属性,并执行三步操作:
(2)
在时刻 t+ϵ/2 我们执行半步速度更新,来计算 s(t+ϵ) ϕ(t+ϵ)

接受/拒绝

事实上,有限步长 ϵ 不能精确的保证 H(s,ϕ) 恒定,所以引入偏置的概念。另一方面,浮点数的舍入误差意味着变换过程并不是完全可逆的。
HMC在 n 步蛙跳后,引入了接受/拒绝阶段。新状态量χ=(s,ϕ)以概率 pacc(χ,χ) 接受。 pacc(χ,χ) 定义为:

HMC算法

本教程中,获得新的HMC样本方法如下:

  1. 根据单变量高斯分布采样新的速度
  2. 执行 n 步蛙跳获得新的状态量χ
  3. χ 执行接受/拒绝

使用Theano运行HMC

在Theano中,更新字典和共享变量为执行采样算法提供了最自然的方法。样本当前状态量可以用Theano共享变量表示,而HMC的更新列表通过Theano的更新函数获得。
将HMC算法分解为以下子组件:

  • simulate_dynamics:Python符号函数,输入为初始位置和速度,执行 n_step 蛙跳更新,并返回符号变量:计算的状态量 χ
  • hmc_move:Python符号函数,输入为起始位置,随机采样速度矢量,生成状态量 χ 。然后调用simulate_dynamics函数,决定是否接受从 χχ 的转换。
  • hmc_updates:Python函数,输入为hmc_move的符号输出量,输入为一次HMC过程的更新列表。
  • HMC_sampler:Python类,整合上述函数

simulate_dynamics

为了执行 n 步蛙跳采样,我们这里定义一个函数便于Scan函数的使用。不同于公式(2),我们可以对ϕ执行前半步更新,然后对 s ϕ执行 n 步更新,对ϕ执行后半步更新,从而获得 s(t+nϵ) ϕ(t+nϵ) 。对于循环形式,可以写做:
(3)
公式中内循环是通过执行leapfrog函数实现的,其中分别用 pos,veDiffusion Models/Score-based Generative Models背后的深度学习原理:蒙特卡洛采样法和重要采样法

一份数学小白也能读懂的「马尔可夫链蒙特卡洛方法」入门指南

(转)theano学习指南1(翻译)

PyMC:马尔科夫链蒙特卡洛采样工具

强化学习入门·

theano学习指南--词向量的循环神经网络(翻译)