MCMC(马尔科夫蒙特卡洛)——qjzcy的博客

MCMC(马尔科夫蒙特卡洛)
导读:
一、 开开脑洞
二、 平稳细致条件
三、Deepleaning中的一个应用:Dropout
四、 吉布斯抽样

————————————————————————

我特别喜欢这个算法,常常让我脑洞大开。在这里胡扯一下,大家见笑
这个算法大致的描述为:无论初始状态如何,经过有限的迭代后,会趋于稳定,稳定后的状态分布只和转换矩阵相关。
这里面有三个重点:
1、 和初始状态无关
2、 满足条件,就一定会趋于稳定
3、 稳定后的状态分布只和转换矩阵相关

(一)开开脑洞

好下面根据上面的几个条件我开一下脑洞,不保证正确,仅仅是脑洞
一、 地球上的物种一定会进化出文明
为什么这么说呢,拿刚刚的那三个条件来说
1、和初始状态无关,也就是说无论一开始进化出什么物种,只要转换条件是一样的,那么结局是一样的,地球上会有文明
2、像彗星撞地球,物种灭绝这样的事情,在进化史上不是灾难,而恰恰是促成进化的必要条件。因为在MCMC算法的第二个条件,满足一定条件就包含着随机选择(后面我们会聊这个随机选择)
3、既然我们现在进化出了文明,那么在另一个平行世界里,即使人类被灭绝了,地球一样会有其他的文明产生。(那么问题来了,这是不是说明外星人一定存在?)

二、 再开一个脑洞,文明一定是向前发展的(或者说在达到某个巅峰前,地球上的文明总是会向前发展的),历史的长河中经常遇到这样的事情,文明社会被不文明打败:比如掌握了火的文明部落一个流感就被什么都不会的部落打败,野蛮人入侵,中世纪黑暗统治,核世界大战爆发。好像我们的文明就在一个钢丝上行走,能发展到现在纯粹靠运气。
好,又是刚才那三个条件
1、 和初始状态无关,无论文明开始怎样
2、 随机事件只是转换的条件之一
3、 最终文明能发展到的程度和初始以及中间状态都没有关系,它一定会发展到它预定的稳定状态(也就是文明一定会向前,发展到一个我们还没有见到的巅峰)

三、 物种进化中,不一定是优胜劣汰, 还必须要有随机淘汰是
达尔文的进化论中说,物种总是优胜劣汰。其实我觉得还要加上一条,概率淘汰
再回到刚刚三个条件
1、 物种进化的初始状态不重要
2、 进化的过程中需要一定概率随机选择,(好像是个很显然的问题,不随机选择的化,很容易陷入局部最优嘛。)
3、 进化的最终状态只和转换矩阵相关(这里的转换矩阵也可以理解为环境变量)


(二)
胡扯了这么多,是不是感觉这个算法很神奇?那我们来看看这个算法
首先这个算法的名字是由两个名字组合而来的,马尔科夫+蒙特卡洛。这两个人就不掰扯了,大名鼎鼎,有兴趣的搜一下吧。
前面我们说的满足一定条件指:
定理:[细致平稳条件] 如果非周期马氏链的转移矩阵P和分布π(x) 满足 π(i)Pij=π(j)Pji for all i,j 则 π(x) 是马氏链的平稳分布,上式被称为细致平稳条件(detailed balance condition)。

这个定理强调了两个内容
1、对于任何两个状态i,j 可以从i转换到j,也可以从j转换到i
2、在两者的转换过程中没有损失
即:p(i)q(i,j)=p(j)q(j,i)

但是一般情况下,我们在马尔科夫链中这两个状态转换间并不相等
p(i)q(i,j)≠p(j)q(j,i)
也就是细致平稳条件不成立,怎么办呢?
那么我们希望对马氏链做一个改造,使得细致平稳条件成立,譬如,我们引入一个 α(i,j), 我们希望两边都乘以这个函数后会相等即:
p(i)q(i,j)α(i,j)=p(j)q(j,i)α(j,i) (1)
显然我们让
α(i,j)=p(j)q(j,i),α(j,i)=p(i)q(i,j)
原式(1)变为p(i)q(i,j)*p(j)q(j,i)=p(j)q(j,i)*p(i)q(i,j) 显然是可以相等
我们把α(i,j)称为接受率,物理意义可以理解为在原来的马氏链上,从状态 i 以q(i,j) 的概率转跳转到状态j 的时候,我们以α(i,j)的概率接受这个转移。
把以上的过程整理一下,我们就得到了如下的用于采样概率分布p(x)的算法
这里写图片描述

以上的 MCMC 采样算法已经能很漂亮的工作了,不过它有一个小的问题,收敛到平稳分布p(x)的速度太慢。有没有办法提升一些接受率呢?
假设 α(i,j)=0.1,α(j,i)=0.2, 此时满足细致平稳条件,于是
p(i)q(i,j)×0.1=p(j)q(j,i)×0.2

上式两边扩大5倍,我们改写为
p(i)q(i,j)×0.5=p(j)q(j,i)×1

看,我们提高了接受率,而细致平稳条件并没有打破!这启发我们可以把细致平稳条件(**) 式中的α(i,j),α(j,i) 同比例放大,使得两数中最大的一个放大到1,这样我们就提高了采样中的跳转接受率。所以我们可以取
α(i,j)=min{p(j)q(j,i)p(i)q(i,j),1}
于是,经过对上述MCMC 采样算法中接受率的微小改造,我们就得到了如下教科书中最常见的 Metropolis-Hastings 算法。
这里写图片描述
有没有觉得好熟悉,原来我一直很疑惑,好容易得到的值,为啥还要乘以一个随机概率,一下在这里有了答案。

(三)Deepleaning中的一个应用:Dropout
在深度学习的模型中我们会遇到这样一步:Dropout,把之前训练好的权值更新以一定概率丢弃掉一部分。了解了mcmc是不是对这个方法就有了更深的理解。比如丢弃的概率越大越好吗?在什么地方我们还可以用到概率选择等等。
贴一段代码,引自网上这个博客,
http://www.cnblogs.com/tornadomeet/p/3258122.html

%% //导入minst数据并归一化
load mnist_uint8;
train_x = double(train_x(1:2000,:)) / 255;
test_x  = double(test_x(1:1000,:))  / 255;
train_y = double(train_y(1:2000,:));
test_y  = double(test_y(1:1000,:));
% //normalize
[train_x, mu, sigma] = zscore(train_x);% //归一化train_x,其中mu是个行向量,mu是个列向量
test_x = normalize(test_x, mu, sigma);% //在线测试时,归一化用的是训练样本的均值和方差,需要特别注意

%% //without dropout
rng(0);
nn = nnsetup([784 100 10]);% //初步构造了一个输入-隐含-输出层网络,其中包括了
                           % //权值的初始化,学习率,momentum,激发函数类型,
                           % //惩罚系数,dropout等
opts.numepochs =  20;   %  //Number of full sweeps through data
opts.batchsize = 100;  %  //Take a mean gradient step over this many samples
[nn, L] = nntrain(nn, train_x, train_y, opts);
[er, bad] = nntest(nn, test_x, test_y);
str = sprintf('testing error rate is: %f',er);
disp(str)

%% //with dropout
rng(0);
nn = nnsetup([784 100 10]);
nn.dropoutFraction = 0.5;   %  //Dropout fraction,每一次mini-batch样本输入训练时,随机扔掉50%的隐含层节点
opts.numepochs =  20;        %  //Number of full sweeps through data
opts.batchsize = 100;       %  //Take a mean gradient step over this many samples
nn = nntrain(nn, train_x, train_y, opts);
[er, bad] = nntest(nn, test_x, test_y);
str = sprintf('testing error rate is: %f',er);
disp(str)

实验结果:

  没用Dropout时:

  训练样本错误率(均方误差):0.032355

  测试样本错误率:15.500%

  使用Dropout时:

  训练样本错误率(均方误差):0.075819

  测试样本错误率:13.000%

  可以看出使用Dropout后,虽然训练样本的错误率较高,但是训练样本的错误率降低了,说明Dropout的泛化能力不错,可以防止过拟合。

(四)吉布斯抽样
那么我们说吉布斯抽样是mcmc算法的一个特例,为什么这么说呢先挖个坑吧,慢慢填
————————————————————
引用:
http://www.52nlp.cn/lda-math-mcmc-%E5%92%8C-gibbs-sampling2
http://www.cnblogs.com/tornadomeet/p/3258122.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值