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(一)蒙特卡罗方法的更多相关文章
-
白话马尔科夫链蒙特卡罗方法(MCMC)
前言 你清茶园不是人待的地方! 里面的个个都是人才,说话又好听--就是我太菜了啥也听不懂,这次期中还考的贼**烂,太让人郁闷了. 最近课上讲这个马尔科夫链蒙特卡罗方法,我也学得一塌糊涂.这时我猛然想起 ...
-
增强学习(四) ----- 蒙特卡罗方法(Monte Carlo Methods)
1. 蒙特卡罗方法的基本思想 蒙特卡罗方法又叫统计模拟方法,它使用随机数(或伪随机数)来解决计算的问题,是一类重要的数值计算方法.该方法的名字来源于世界著名的赌城蒙特卡罗,而蒙特卡罗方法正是以概率为基 ...
-
蒙特卡罗方法 python 实现2
如果不考虑作图,这里的两个例子可以改写成下面的样子: 求圆周率 import random ''' 蒙特卡罗模拟 投点法计算圆周率 ''' # 投点游戏 def play_game(): # 圆 r ...
-
蒙特卡罗方法 python 实现
蒙特卡罗(Monte Carlo)方法的精髓:用统计结果去计算频率,从而得到真实值的近似值. 一.求圆周率的近似值,采用 投点法 import numpy as np import matplotli ...
-
【RL系列】从蒙特卡罗方法步入真正的强化学习
蒙特卡罗方法给我的感觉是和Reinforcement Learning: An Introduction的第二章中Bandit问题的解法比较相似,两者皆是通过大量的实验然后估计每个状态动作的平均收益. ...
-
蒙特卡罗方法、蒙特卡洛树搜索(Monte Carlo Tree Search,MCTS)初探
1. 蒙特卡罗方法(Monte Carlo method) 0x1:从布丰投针实验说起 - 只要实验次数够多,我就能直到上帝的意图 18世纪,布丰提出以下问题:设我们有一个以平行且等距木纹铺成的地板( ...
-
【RL系列】蒙特卡罗方法——Soap Bubble
“肥皂泡”问题来源于Reinforcement Learning: An Introduction(2017). Exercise 5.2,大致的描述如下: 用一个铁丝首尾相连组成闭合曲线,浸入肥皂泡 ...
-
蒙特卡罗方法计算pi
import scala.math.random object LocalPi { def main(args: Array[String]) { var count = 0 for (i <- ...
-
Python入门习题5.蒙特卡罗方法计算圆周率
#CalPi.py from random import random from math import sqrt from time import clock DARTS = 10000000 hi ...
随机推荐
-
ARP投毒及其防御方法
1.攻击原理 ARP欺骗就是中间人欺骗pc机,告诉pc机它是服务器.再欺骗服务器,告诉服务器它就是pc机.以致获取服务器与pc机的会话信息. 中间人欺骗服务器时,会给服务器发一个报文,发之前把报文中的 ...
-
datahub
https://help.aliyun.com/document_detail/27854.html
-
数据库开发基础-SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)
控制数据库的服务: 方法一: 1.Windows+R 打开运行 打开cmd 2.输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据 ...
-
【恒天云技术分享系列10】OpenStack块存储技术
原文:http://www.hengtianyun.com/download-show-id-101.html 块存储,简单来说就是提供了块设备存储的接口.用户需要把块存储卷附加到虚拟机(或者裸机)上 ...
-
PDF转WORD工具 Solid Converter PDF v9.1.6744
Solid Converter PDF中文破解版(pdf转换成word转换器)是一款功能强大的PDF格式转换软件.Solid Converter PDF允许用户将PDF转换为Word(PDF to W ...
-
AMQP(Advanced Message Queuing Protocol)
一套确定的消息交换功能,也就是“高级消息交换协议模型”.AMQP模型包括一套用于路由和存储消息的功能模块,以及一套在这些模块之间交换消息的规则. 一个网络线级协议(数据传输格式),客户端应用可以通过这 ...
-
Fragment在Activity中的应用 (转载)
原文链接 http://www.cnblogs.com/nanxin/archive/2013/01/24/2875341.html 在本小节中介绍在Activity中创建Fragment. 官网有很 ...
-
AngularJS 截取字符串
参考文章:https://blog.csdn.net/u010234516/article/details/54631525 //过滤器 app.filter('textLengthSet', fun ...
-
ParseFloat有超长的小数位数的解决
描述一下sum=parseFloat(num1)+parseFloat(num2),这个个sum=113.32000000000002,最后用了个Math.round(sum* 100)/100,解决 ...
-
用Linux中man命令查询C函数
大家都知道在Unix/Linux中有个man命令,可以查询常用的命令,函数.可是对于我们这样只知道用"man 函数名"来查询的人来说,会遇到很多问题,比如: man read,我想 ...