1 MCMC蒙特卡罗方法

作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Carlo,以下简称MCMC)在机器学习,深度学习以及自然语言处理等领域都有广泛的应用,是很多复杂算法求解的基础。下面我们就对MCMC的原理做一个总结。

1.1 MCMC概述

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

1.2 蒙特卡罗方法引入

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

MCMC随机采样_样本集

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

MCMC随机采样_样本集_02

则一个简单的近似求解方法是在[a,b]之间随机的采样一个点。比如 MCMC随机采样_坐标轴_03 ,然后用 MCMC随机采样_马尔科夫链_04 代表在[a,b]区间上所有的 MCMC随机采样_状态转移_05 的值。那么上面的定积分的近似求解为:

MCMC随机采样_样本集_06

当然,用一个值代表[a,b]区间上所有的 MCMC随机采样_状态转移_05 的值,这个假设太粗糙。那么我们可以采样[a,b]区间的n个值: MCMC随机采样_坐标轴_08 ,用它们的均值来代表[a,b]区间上所有的 MCMC随机采样_状态转移_05 的值。这样我们上面的定积分的近似求解为:

MCMC随机采样_状态转移_10

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

怎么解决这个问题呢?

如果我们可以得到x在[a,b]的概率分布函数p(x),那么我们的定积分求和可以这样进行:

MCMC随机采样_样本集_11

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

可以看出,最上面我们假设x在[a,b]之间是均匀分布的时候, MCMC随机采样_状态转移_12 ,带入我们有概率分布的蒙特卡罗积分的上式,可以得到:

MCMC随机采样_样本集_13

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

1.3 概率分布采样

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

MCMC随机采样_坐标轴_14

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

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

1.4 接受-拒绝采样

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

MCMC随机采样_坐标轴_15

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

MCMC随机采样_样本集_16

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

1.5 蒙特卡罗方法小结

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

MCMC随机采样_马尔科夫链_17

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

2 MCMC马尔科夫链

用蒙特卡罗方法来随机模拟求解一些复杂的连续积分或者离散求和的方法,但是这个方法需要得到对应的概率分布的样本集,而想得到这样的样本集很困难。因此我们需要马尔科夫链来帮忙。

2.1 马尔科夫链概述

马尔科夫链定义本身比较简单,它假设某一时刻状态转移的概率只依赖于它的前一个状态。举个形象的比喻,假如每天的天气是一个状态的话,那个今天是不是晴天只依赖于昨天的天气,而和前天的天气没有任何关系。当然这么说可能有些武断,但是这样做可以大大简化模型的复杂度,因此马尔科夫链在很多时间序列模型中得到广泛的应用,比如循环神经网络RNN,隐式马尔科夫模型HMM等,当然MCMC也需要它。

如果用精确的数学定义来描述,则假设我们的序列状态是

MCMC随机采样_概率分布_18

既然某一时刻状态转移的概率只依赖于它的前一个状态,那么我们只要能求出系统中任意两个状态之间的转换概率,这个马尔科夫链的模型就定了。我们来看看下图这个马尔科夫链模型的具体的例子(来源于维基百科)。

MCMC随机采样_马尔科夫链_19

这个马尔科夫链是表示股市模型的,共有三种状态:牛市(Bull market), 熊市(Bear market)和横盘(Stagnant market)。

每一个状态都以一定的概率转化到下一个状态。比如,牛市以0.025的概率转化到横盘的状态。这个状态概率转化图可以以矩阵的形式表示。如果我们定义矩阵 MCMC随机采样_概率分布_20 某一位置 MCMC随机采样_坐标轴_21 的值为 MCMC随机采样_状态转移_22 ,即从状态 MCMC随机采样_概率分布_23 转化到状态 MCMC随机采样_状态转移_24 的概率,并定义牛市为状态0, 熊市为状态1, 横盘为状态2. 这样我们得到了马尔科夫链模型的状态转移矩阵为:

MCMC随机采样_坐标轴_25

马尔科夫链模型的状态转移矩阵和我们蒙特卡罗方法需要的概率分布样本集有什么关系呢?

这需要从马尔科夫链模型的状态转移矩阵的性质讲起。

2.2 马尔科夫链模型状态转移矩阵的性质

得到了马尔科夫链模型的状态转移矩阵,我们来看看马尔科夫链模型的状态转移矩阵的性质。

仍然以上面的这个状态转移矩阵为例。假设我们当前股市的概率分布为:[0.3,0.4,0.3],即30%概率的牛市,40%概率的熊盘与30%的横盘。然后这个状态作为序列概率分布的初始状态 MCMC随机采样_样本集_26 ,将其带入这个状态转移矩阵计算 MCMC随机采样_状态转移_27 的状态。代码如下:

MCMC随机采样_马尔科夫链_28

部分输出结果如下:

Current round: 1
[[ 0.405   0.4175  0.1775]]
Current round: 2
[[ 0.4715   0.40875  0.11975]]

可以发现,从第60轮开始,我们的状态概率分布就不变了,一直保持在[0.625 0.3125 0.0625],即62.5%的牛市,31.25%的熊市与6.25%的横盘。那么这个是巧合吗?

我们现在换一个初始概率分布试一试,现在我们用[0.7,0.1,0.2]作为初始概率分布,然后这个状态作为序列概率分布的初始状态 MCMC随机采样_样本集_26 ,将其带入这个状态转移矩阵计算 MCMC随机采样_状态转移_27 的状态。

代码如下:

MCMC随机采样_样本集_31

部分输出结果如下:

Current round: 1
[[ 0.695   0.1825  0.1225]]
Current round: 2
[[ 0.6835   0.22875  0.08775]]

可以看出,尽管这次我们采用了不同初始概率分布,最终状态的概率分布趋于同一个稳定的概率分布[0.625 0.3125 0.0625], 也就是说我们的马尔科夫链模型的状态转移矩阵收敛到的稳定概率分布与我们的初始状态概率分布无关。这是一个非常好的性质,也就是说,如果我们得到了这个稳定概率分布对应的马尔科夫链模型的状态转移矩阵,则我们可以用任意的概率分布样本开始,带入马尔科夫链模型的状态转移矩阵,这样经过一些序列的转换,最终就可以得到符合对应稳定概率分布的样本。

这个性质不光对我们上面的状态转移矩阵有效,对于绝大多数的其他的马尔科夫链模型的状态转移矩阵也有效。同时不光是离散状态,连续状态时也成立。

同时,对于一个确定的状态转移矩阵 MCMC随机采样_概率分布_20 ,它的 MCMC随机采样_状态转移_33 次幂 MCMC随机采样_坐标轴_34 在当n大于一定的值的时候也可以发现是确定的,我们还是以上面的例子为例,计算代码如下:

MCMC随机采样_马尔科夫链_35

输出结果如下:

Current round: 1
[[ 0.8275   0.13375  0.03875]
 [ 0.2675   0.66375  0.06875]
 [ 0.3875   0.34375  0.26875]]
Current round: 2
[[ 0.73555   0.212775  0.051675]
 [ 0.42555   0.499975  0.074475]
 [ 0.51675   0.372375  0.110875]]

我们可以发现,在n≥6以后, MCMC随机采样_坐标轴_34 的值稳定不再变化,而且每一行都为[0.625 0.3125 0.0625],这和我们前面的稳定分布是一致的。这个性质同样不光是离散状态,连续状态时也成立。

 用数学语言总结下马尔科夫链的收敛性质:

MCMC随机采样_样本集_37

上面的性质中需要解释的有:

1)非周期的马尔科夫链:这个主要是指马尔科夫链的状态转化不是循环的,如果是循环的则永远不会收敛。幸运的是我们遇到的马尔科夫链一般都是非周期性的。用数学方式表述则是:对于任意某一状态 MCMC随机采样_概率分布_23 , MCMC随机采样_马尔科夫链_39 为集合 MCMC随机采样_马尔科夫链_40 的最大公约数,如果 MCMC随机采样_坐标轴_41 ,则该状态为非周期的。

2)任何两个状态是连通的:这个指的是从任意一个状态可以通过有限步到达其他的任意一个状态,不会出现条件概率一直为0导致不可达的情况。

3)马尔科夫链的状态数可以是有限的,也可以是无限的。因此可以用于连续概率分布和离散概率分布。

4) MCMC随机采样_马尔科夫链_42 通常称为马尔科夫链的平稳分布。

2.3 基于马尔科夫链采样

如果我们得到了某个平稳分布所对应的马尔科夫链状态转移矩阵,我们就很容易采用出这个平稳分布的样本集。

MCMC随机采样_状态转移_43

现在我们可以开始采样了,首先,基于初始任意简单概率分布比如高斯分布 MCMC随机采样_马尔科夫链_44 采样得到状态值 MCMC随机采样_坐标轴_03 ,基于条件概率分布 MCMC随机采样_马尔科夫链_46 采样状态值 MCMC随机采样_坐标轴_47 ,一直进行下去,当状态转移进行到一定的次数时,比如到n次时,我们认为此时的采样集 MCMC随机采样_马尔科夫链_48 即是符合我们的平稳分布的对应样本集,可以用来做蒙特卡罗模拟求和了。

总结下基于马尔科夫链的采样过程:

MCMC随机采样_状态转移_49

2.4 马尔科夫链采样小结

如果假定我们可以得到我们需要采样样本的平稳分布所对应的马尔科夫链状态转移矩阵,那么我们就可以用马尔科夫链采样得到我们需要的样本集,进而进行蒙特卡罗模拟。

但是一个重要的问题是,随意给定一个平稳分布π,如何得到它所对应的马尔科夫链状态转移矩阵P呢?

这是个大问题。

我们绕了一圈似乎还是没有解决任意概率分布采样样本集的问题。

幸运的是,MCMC采样通过迂回的方式解决了上面这个大问题,下面讨论MCMC的采样,以及它的使用改进版采样: M-H采样和Gibbs采样.

3 MCMC采样和M-H采样

在MCMC马尔科夫链中我们讲到给定一个概率平稳分布π, 很难直接找到对应的马尔科夫链状态转移矩阵P。而只要解决这个问题,我们就可以找到一种通用的概率分布采样方法,进而用于蒙特卡罗模拟。本节我们就讨论解决这个问题的办法:MCMC采样和它的易用版M-H采样。

3.1 马尔科夫链的细致平稳条件

在解决从平稳分布π, 找到对应的马尔科夫链状态转移矩阵P之前,我们还需要先看看马尔科夫链的细致平稳条件。定义如下:

MCMC随机采样_状态转移_50

证明很简单,由细致平稳条件有:

MCMC随机采样_坐标轴_51

将上式用矩阵表示即为:

MCMC随机采样_概率分布_52

即满足马尔可夫链的收敛性质。也就是说,只要我们找到了可以使概率分布π(x)满足细致平稳分布的矩阵P即可。这给了我们寻找从平稳分布π, 找到对应的马尔科夫链状态转移矩阵P的新思路。

不过不幸的是,仅仅从细致平稳条件还是很难找到合适的矩阵P。比如我们的目标平稳分布是π(x),随机找一个马尔科夫链状态转移矩阵Q,它是很难满足细致平稳条件的,即:

MCMC随机采样_样本集_53

那么如何使这个等式满足呢?下面我们来看MCMC采样如何解决这个问题。

3.2 MCMC采样

由于一般情况下,目标平稳分布π(x)和某一个马尔科夫链状态转移矩阵Q不满足细致平稳条件,即

MCMC随机采样_状态转移_54

我们可以对上式做一个改造,使细致平稳条件成立。方法是引入一个α(i,j),使上式可以取等号,即:

MCMC随机采样_马尔科夫链_55

问题是什么样的α(i,j)可以使等式成立呢?其实很简单,只要满足下两式即可:

MCMC随机采样_样本集_56

这样,就得到了分布π(x)对应的马尔科夫链状态转移矩阵P,满足:

MCMC随机采样_概率分布_57

也就是说,我们的目标矩阵P可以通过任意一个马尔科夫链状态转移矩阵Q乘以α(i,j)得到。

α(i,j)我们有一般称之为接受率。取值在[0,1]之间,可以理解为一个概率值。即目标矩阵P可以通过任意一个马尔科夫链状态转移矩阵Q以一定的接受率获得。这个很像接受-拒绝采样,那里是以一个常用分布通过一定的接受-拒绝概率得到一个非常见分布,这里是以一个常见的马尔科夫链状态转移矩阵Q通过一定的接受-拒绝概率得到目标转移矩阵P,两者的解决问题思路是类似的。

总结下MCMC的采样过程。

MCMC随机采样_坐标轴_58

上面这个过程基本上就是MCMC采样的完整采样理论了,但是这个采样算法还是比较难在实际中应用,为什么呢?问题在上面第三步的c步骤,接受率这儿。由于 MCMC随机采样_样本集_59 可能非常的小,比如0.1,导致我们大部分的采样值都被拒绝转移,采样效率很低。有可能我们采样了上百万次马尔可夫链还没有收敛,也就是上面这个 MCMC随机采样_马尔科夫链_60 要非常非常的大,这让人难以接受,怎么办呢?这时就轮到我们的M-H采样出场了。

3.3 M-H采样

M-H采样是Metropolis-Hastings采样的简称,这个算法首先由Metropolis提出,被Hastings改进,因此被称之为Metropolis-Hastings采样或M-H采样

M-H采样解决了我们上一节MCMC采样接受率过低的问题。

我们回到MCMC采样的细致平稳条件:

MCMC随机采样_马尔科夫链_61

这时我们可以看到,如果两边同时扩大五倍,接受率提高到了0.5,但是细致平稳条件却仍然是满足的,即:

MCMC随机采样_状态转移_62

这样接受率可以做如下改进,即:

MCMC随机采样_坐标轴_63

通过这个微小的改造,我们就得到了可以在实际应用中使用的M-H采样算法过程如下:

MCMC随机采样_马尔科夫链_64

3.4 M-H采样实例

为了更容易理解,这里给出一个M-H采样的实例。

在例子里,我们的目标平稳分布是一个均值3,标准差2的正态分布,而选择的马尔可夫链状态转移矩阵Q(i,j)的条件转移概率是以i为均值,方差1的正态分布在位置j的值。这个例子仅仅用来让大家加深对M-H采样过程的理解。

代码如下:

MCMC随机采样_状态转移_65

MCMC随机采样_概率分布_66

输出的图中可以看到采样值的分布与真实的分布之间的关系如下,采样集还是比较拟合对应分布的。

MCMC随机采样_概率分布_67

3.5 M-H采样总结

M-H采样完整解决了使用蒙特卡罗方法需要的任意概率分布样本集的问题,因此在实际生产环境得到了广泛的应用。

但是在大数据时代,M-H采样面临着两大难题:

MCMC随机采样_马尔科夫链_68

2) 由于特征维度大,很多时候我们甚至很难求出目标的各特征维度联合分布,但是可以方便求出各个特征之间的条件概率分布。

这时候我们能不能只有各维度之间条件概率分布的情况下方便的采样呢?

Gibbs采样解决了上面两个问题,因此在大数据时代,MCMC采样基本是Gibbs采样的天下。

4 MCMC:Gibbs采样

M-H采样已经可以很好的解决蒙特卡罗方法需要的任意概率分布的样本集的问题。

但是M-H采样有两个缺点:

一是需要计算接受率,在高维时计算量大。并且由于接受率的原因导致算法收敛时间变长。

二是有些高维数据,特征的条件概率分布好求,但是特征的联合分布不好求。

因此需要一个好的方法来改进M-H采样,这就是我们下面讲到的Gibbs采样。

4.1 重新寻找合适的细致平稳条件

细致平稳条件:如果非周期马尔科夫链的状态转移矩阵P和概率分布π(x)对于所有的i,j满足:

MCMC随机采样_坐标轴_69

则称概率分布π(x)是状态转移矩阵P的平稳分布。

在M-H采样中我们通过引入接受率使细致平稳条件满足。现在我们换一个思路。

MCMC随机采样_样本集_70MCMC随机采样_坐标轴_71

4.2 二维Gibbs采样

利用上一节找到的状态转移矩阵,我们就得到了二维Gibbs采样,这个采样需要两个维度之间的条件概率。具体过程如下:

MCMC随机采样_马尔科夫链_72

用下图可以很直观的看出,采样是在两个坐标轴上不停的轮换的。当然,坐标轴轮换不是必须的,我们也可以每次随机选择一个坐标轴进行采样。不过常用的Gibbs采样的实现都是基于坐标轴轮换的。

MCMC随机采样_状态转移_73

4.3 多维Gibbs采样

上面的这个算法推广到多维的时候也是成立的。比如一个n维的概率分布 MCMC随机采样_状态转移_74 ,可以通过在n个坐标轴上轮换采样,来得到新的样本。对于轮换到的任意一个坐标轴 MCMC随机采样_概率分布_75 上的转移,马尔科夫链的状态转移概率为 MCMC随机采样_状态转移_76 ,即固定n−1个坐标轴,在某一个坐标轴上移动。

具体的算法过程如下:

MCMC随机采样_样本集_77

整个采样过程和Lasso回归的坐标轴下降法算法非常类似,只不过Lasso回归是固定n−1个特征,对某一个特征求极值。而Gibbs采样是固定n−1个特征在某一个特征采样。

同样的,轮换坐标轴不是必须的,我们可以随机选择某一个坐标轴进行状态转移,只不过常用的Gibbs采样的实现都是基于坐标轴轮换的。

4.4 二维Gibbs采样实例

这里给出一个Gibbs采样的例子。假设我们要采样的是一个二维正态分布 MCMC随机采样_马尔科夫链_78 ,其中:

MCMC随机采样_马尔科夫链_79

而采样过程中的需要的状态转移条件分布为:

MCMC随机采样_状态转移_80

具体的代码如下:

MCMC随机采样_状态转移_81MCMC随机采样_马尔科夫链_82

输出的两个特征各自的分布如下:

MCMC随机采样_坐标轴_83

然后我们看看样本集生成的二维正态分布,代码如下:

MCMC随机采样_概率分布_84

输出的正态分布图如下:

MCMC随机采样_马尔科夫链_85

4.5 Gibbs采样小结

由于Gibbs采样在高维特征时的优势,目前我们通常意义上的MCMC采样都是用的Gibbs采样。

当然Gibbs采样是从M-H采样的基础上的进化而来的,同时Gibbs采样要求数据至少有两个维度,一维概率分布的采样是没法用Gibbs采样的,这时M-H采样仍然成立。

有了Gibbs采样来获取概率分布的样本集,有了蒙特卡罗方法来用样本集模拟求和,他们一起就奠定了MCMC算法在大数据时代高维数据模拟求和时的作用。