MCMC(一)蒙特卡罗方法

    MCMC(二)马尔科夫链(待填坑)

    MCMC(三)M-H采样和Gibbs采样(待填坑)

    作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Carlo,以下简称MCMC)在机器学习,深度学习以及自然语言处理等领域都有广泛的应用,是很多复杂算法求解的基础。比如我们前面讲到的分解机(Factorization Machines)推荐算法,还有前面讲到的受限玻尔兹曼机(RBM)原理总结,都用到了MCMC来做一些复杂运算的近似求解。下面我们就对MCMC的原理做一个总结。

1. MCMC概述

    从名字我们可以看出,MCMC由两个MC组成,即蒙特卡罗方法(Monte Carlo Simulation,简称MC)和马尔科夫链(Markov Chain ,也简称MC)。要弄懂MCMC的原理我们首先得搞清楚蒙特卡罗方法和马尔科夫链的原理。我们将用三篇来完整学习MCMC。在本篇,我们关注于蒙特卡罗方法。

2. 蒙特卡罗方法引入

    蒙特卡罗原来是一个赌场的名称,用它作为名字大概是因为蒙特卡罗方法是一种随机模拟的方法,这很像赌博场里面的扔骰子的过程。最早的蒙特卡罗方法都是为了求解一些不太好求解的求和或者积分问题。比如积分:$$\theta = \int_a^b f(x)dx$$

    如果我们很难求解出$f(x)$的原函数,那么这个积分比较难求解。当然我们可以通过蒙特卡罗方法来模拟求解近似值。如何模拟呢?假设我们函数图像如下图:

    则一个简单的近似求解方法是在[a,b]之间随机的采样一个点。比如$x_0$,然后用$f(x_0)$代表在[a,b]区间上所有的$f(x)$的值。那么上面的定积分的近似求解为:$$(b-a)f(x_0)$$

    当然,用一个值代表[a,b]区间上所有的$f(x)$的值,这个假设太粗糙。那么我们可以采样[a,b]区间的n个值:${x_0,x_1,...x_{n-1}}$,用它们的均值来代表[a,b]区间上所有的$f(x)$的值。这样我们上面的定积分的近似求解为:$$\frac{b-a}{n}\sum\limits_{i=0}^{n-1}f(x_i)$$

    虽然上面的方法可以一定程度上求解出近似的解,但是它隐含了一个假定,即$x$在[a,b]之间是均匀分布的,而绝大部分情况,$x$在[a,b]之间不是均匀分布的。如果我们用上面的方法,则模拟求出的结果很可能和真实值相差甚远。 

    怎么解决这个问题呢? 如果我们可以得到$x$在[a,b]的概率分布函数$p(x)$,那么我们的定积分求和可以这样进行:$$\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)}$$

    上式最右边的这个形式就是蒙特卡罗方法的一般形式。当然这里是连续函数形式的蒙特卡罗方法,但是在离散时一样成立。

    可以看出,最上面我们假设$x$在[a,b]之间是均匀分布的时候,$p(x_i) = 1/(b-a)$,带入我们有概率分布的蒙特卡罗积分的上式,可以得到:$$\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) $$

    也就是说,我们最上面的均匀分布也可以作为一般概率分布函数$p(x)$在均匀分布时候的特例。那么我们现在的问题转到了如何求出$x$的分布$p(x)$上。

3. 概率分布采样

    上一节我们讲到蒙特卡罗方法的关键是得到$x$的概率分布。如果求出了$x$的概率分布,我们可以基于概率分布去采样基于这个概率分布的n个$x$的样本集,带入蒙特卡罗求和的式子即可求解。 

    但是还有一个关键的问题需要解决,即如何基于概率分布去采样基于这个概率分布的n个$x$的样本集。 

    对于常见的均匀分布$uniform(0,1)$是非常容易采样样本的,一般通过线性同余发生器可以很方便的生成(0,1)之间的伪随机数样本。而其他常见的概率分布,无论是离散的分布还是连续的分布,它们的样本都可以通过$uniform(0,1)$的样本转换而得。比如二维正态分布的样本$(Z_1,Z_2)$可以通过通过独立采样得到的$uniform(0,1)$样本对$(X_1,X_2)$通过如下的式子转换而得:$$Z_1 = \sqrt{-2 ln X_1}cos(2\pi X_2)$$$$Z_2 = \sqrt{-2 ln X_1}sin(2\pi X_2)$$

    其他一些常见的连续分布,比如t分布,F分布,Beta分布,Gamma分布等,都可以通过类似的方式从$uniform(0,1)$得到的采样样本转化得到。在python的numpy,scikit-learn等类库中,都有生成这些常用分布样本的函数可以使用。

    不过很多时候,我们的$x$的概率分布不是常见的分布,这意味着我们没法方便的得到这些非常见的概率分布的样本集。那这个问题怎么解决呢?

4. 接受-拒绝采样

    对于概率分布不是常见的分布,一个可行的办法是采用接受-拒绝采样来得到该分布的样本。既然 $p(x)$ 太复杂在程序中没法直接采样,那么我设定一个程序可抽样的分布 $q(x)$ 比如高斯分布,然后按照一定的方法拒绝某些样本,以达到接近 $p(x)$ 分布的目的,其中$q(x)$叫做 proposal distribution。

    具体采用过程如下,设定一个方便采样的常用概率分布函数 $q(x)$,以及一个常量 $k$,使得 $p(x)$ 总在 $kq(x)$ 的下方。如上图。

    首先,采样得到$q(x)$的一个样本$z_0$,采样方法如第三节。然后,从均匀分布$(0, kq(z_0)) $中采样得到一个值$u$。如果$u$落在了上图中的灰色区域,则拒绝这次抽样,否则接受这个样本$z_0$。重复以上过程得到n个接受的样本$z_0,z_1,...z_{n-1}$,则最后的蒙特卡罗方法求解结果为:$$\frac{1}{n}\sum\limits_{i=0}^{n-1}\frac{f(z_i)}{p(z_i)}$$

    整个过程中,我们通过一系列的接受拒绝决策来达到用$q(x)$模拟$p(x)$概率分布的目的。

5. 蒙特卡罗方法小结

    使用接受-拒绝采样,我们可以解决一些概率分布不是常见的分布的时候,得到其采样集并用蒙特卡罗方法求和的目的。但是接受-拒绝采样也只能部分满足我们的需求,在很多时候我们还是很难得到我们的概率分布的样本集。比如:

    1)对于一些二维分布$p(x,y)$,有时候我们只能得到条件分布$p(x|y)$和$p(y|x)$和,却很难得到二维分布$p(x,y)$一般形式,这时我们无法用接受-拒绝采样得到其样本集。

    2)对于一些高维的复杂非常见分布$p(x1,x2,...,x_n),我们要找到一个合适的$q(x)$和$k$非常困难。

    从上面可以看出,要想将蒙特卡罗方法作为一个通用的采样模拟求和的方法,必须解决如何方便得到各种复杂概率分布的对应的采样样本集的问题。而我们下一篇要讲到的马尔科夫链就是帮助找到这些复杂概率分布的对应的采样样本集的白衣骑士。下一篇我们来总结马尔科夫链的原理。

(欢迎转载,转载请注明出处。欢迎沟通交流: pinard.liu@ericsson.com)

MCMC(一)蒙特卡罗方法的更多相关文章

  1. 白话马尔科夫链蒙特卡罗方法(MCMC)

    前言 你清茶园不是人待的地方! 里面的个个都是人才,说话又好听--就是我太菜了啥也听不懂,这次期中还考的贼**烂,太让人郁闷了. 最近课上讲这个马尔科夫链蒙特卡罗方法,我也学得一塌糊涂.这时我猛然想起 ...

  2. 增强学习(四) ----- 蒙特卡罗方法(Monte Carlo Methods)

    1. 蒙特卡罗方法的基本思想 蒙特卡罗方法又叫统计模拟方法,它使用随机数(或伪随机数)来解决计算的问题,是一类重要的数值计算方法.该方法的名字来源于世界著名的赌城蒙特卡罗,而蒙特卡罗方法正是以概率为基 ...

  3. 蒙特卡罗方法 python 实现2

    如果不考虑作图,这里的两个例子可以改写成下面的样子: 求圆周率 import random ''' 蒙特卡罗模拟 投点法计算圆周率 ''' # 投点游戏 def play_game(): # 圆 r ...

  4. 蒙特卡罗方法 python 实现

    蒙特卡罗(Monte Carlo)方法的精髓:用统计结果去计算频率,从而得到真实值的近似值. 一.求圆周率的近似值,采用 投点法 import numpy as np import matplotli ...

  5. 【RL系列】从蒙特卡罗方法步入真正的强化学习

    蒙特卡罗方法给我的感觉是和Reinforcement Learning: An Introduction的第二章中Bandit问题的解法比较相似,两者皆是通过大量的实验然后估计每个状态动作的平均收益. ...

  6. 蒙特卡罗方法、蒙特卡洛树搜索(Monte Carlo Tree Search,MCTS)初探

    1. 蒙特卡罗方法(Monte Carlo method) 0x1:从布丰投针实验说起 - 只要实验次数够多,我就能直到上帝的意图 18世纪,布丰提出以下问题:设我们有一个以平行且等距木纹铺成的地板( ...

  7. 【RL系列】蒙特卡罗方法——Soap Bubble

    “肥皂泡”问题来源于Reinforcement Learning: An Introduction(2017). Exercise 5.2,大致的描述如下: 用一个铁丝首尾相连组成闭合曲线,浸入肥皂泡 ...

  8. 蒙特卡罗方法计算pi

    import scala.math.random object LocalPi { def main(args: Array[String]) { var count = 0 for (i <- ...

  9. Python入门习题5.蒙特卡罗方法计算圆周率

    #CalPi.py from random import random from math import sqrt from time import clock DARTS = 10000000 hi ...

随机推荐

  1. imageNamed 与 initWithContentsOfFile 区别

    1.imageNamed: UIImage *image = [UIImage imageNamed:"]; UIImage的类方法 第一次读取图片的时候,先把这个图片放到缓存中,下次再使用 ...

  2. dotnet new 命令使用模板

    dotnet new 命令使用模板快速生成单页应用. 最新版.NET Core SDK RC4 最大改动是更新了 dotnet new 命令. dotnet new 默认不再创建控制台应用,而是展示帮 ...

  3. MySQL日志系统

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  4. wpf后置代码中的Grid布局以及图片路径的设置

    之前用Grid练习连连看布局时,遇到了几个困惑.此次就把当时的一些收获写出来,供以后翻看. 图片路径可能比较常用,所以就写在第一个了. 在xaml中,设置图片非常简单,只要把图片拷贝到资源目录(这里假 ...

  5. php常见面试问题

    1. 如果没有开启cookies,session如何工作? PHP中的sessions通常会使用cookies的方法.但是如果没有cookies(浏览器禁用cookies),PHP sessions也 ...

  6. [Hadoop] - Hadoop Mapreduce Error: GC overhead limit exceeded

    在运行mapreduce的时候,出现Error: GC overhead limit exceeded,查看log日志,发现异常信息为 2015-12-11 11:48:44,716 FATAL [m ...

  7. 简单说说Markdown语法

    # 简单说说 MarkDown 语法 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr ...

  8. HTML5 File接口(在web页面上使用文件)

    File接口提供了与文件相关的信息,并且运行JavaScript在web页面上去访问文件中的内容. File对象来自于用户使用input标签选择文件返回的FileList对象,来自于拖放操作的Data ...

  9. 9 个用于移动APP开发的顶级 JavaScript 框架

    顶级 Java 框架 对于Web开发而言,Java是一个有前途的编程语言,并且在不久的将来它将依然在这个领域大放光彩.Java在移动app开发上也有同样的影响吗?让我们一起来看看ValueCoders ...

  10. 初次接触java中的递归算法

    一道关于兔子繁衍的编程题: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 自己考虑了挺久,思路出现了问题,甚至连 ...