参考的资料:
面对的场景
对于一个随机变量X, 我们想求关于这个随机变量的一些性质, 相关值, 统计学特性等等, 如:
这里的随机变量X可以是连续的, 即有无限个状态, 也可以是离散的, 即有限个状态.
对于这些问题, 一个关键的问题就是必须知道随机变量X的概率分布P(X). 然而当这个P(X)十分复杂, 或者难以用显式的方式表示时, 又要怎么办呢?
蒙特卡罗方法的引入
首先, 我们看一个随机采样的例子:
假设, 我们想估计下图中圆圈的面积:
我们在正方形内随机地采样(可以对x, y坐标分别进行均匀分布的采样)得到N个点, 计算落在园内点的比例, 再乘以正方型的面积, 我们就能估计出园的面积.
对于更复杂的图形, 我们都可以通过这种随机采样的方法进行估计.
那么, 对于随机变量的分布概率, 要怎么通过采样进行呢?
以上采样是对连续情况的采样, 但这种采样只能在我们能够显式地得到概率分布的是否才能使用, 但实际上, 我们会遇到很多情况, 无法得到显式的概率分布, 比如:
即使可行, 每个维度都要进行采样, 当把这些维度放在一起, 需要采样的数量是指数级的, 这不是现有计算能力能解决的.
因此, 蒙特卡洛方法需要解决在复杂概率分布(现实中多数是高维情况)时对应的采样困难问题, 这时, 就需要马尔科夫链来解决这个问题了.
马尔科夫链的引入
马尔科夫链是如何解决这个问题的呢? 马尔科夫链每个时刻都会有一个分布, 对于离散的就是每个状态的概率, 连续的就是一个概率分布函数.
我们采样的样本, 就是马尔科夫链经过转移达到平稳分布, 之后每个时刻采样一个样本, 从这个时刻的分布从抽样一个状态, 即一个样本.
马尔科夫链的构造
状态转移概率
$$\begin{aligned} \pi i^{\left ( t+1 \right )} &=P\left ( X{t+1}=si \right ) \ &= \sum{k}P\left ( X{t+1}=s_i\mid X{t}=sk \right )\cdot P\left ( X{t}=sk \right )\ &= \sum{k}P_{k,i}\cdot \pi _k^{\left ( t \right )} \end{aligned}
假设状态的数目有$$n$$种, 这时则有:
$$\left ( \pi _1^{\left ( t+1 \right )},\cdots ,\pi _n^{\left ( t+1 \right )} \right )=\left ( \pi _1^{\left ( t \right )},\cdots ,\pi _n^{\left ( t \right )} \right )\begin{bmatrix}
P_{1,1} & P_{1,2} & \cdots & P_{1,n}\\
P_{2,1} & P_{2,2} & \cdots & P_{2,n}\\
\vdots & \vdots & & \vdots \\
P_{n,1} & P_{n,2} & \cdots & P_{n,n}
\end{bmatrix}
==注意==
在高维离散的情况下, 这里的状态向量将是一个多维联合分布, 概率转移矩阵也将是一个多维的条件分布.
连续情况的状态转移
以上是对于离散的情况, 即状态为有限多个. 那么对于状态为无限多个, 也就是连续的情况又该如何定义呢?
将以上两者相乘(即将概率函数和转移核相乘), 就得到了随机过程在下一个时间点上的连续分布函数. 我们在这个函数上抽样, 就得到下一个时间点上的某一状态了.
马尔科夫链的平稳分布
我们还是用状态是离散的情况来继续考虑.
如果马尔科夫链满足以下两条性质:
非周期性: 周期性指的是马尔科夫链的状态转换是循环的, 即经过有限次的状态转移, 又回到了自身. 这里要求马尔科夫链没有周期性
不可约性: 即两两状态之间都能够相互转移
且这个平稳分布满足:
基于马尔科夫链的采样过程
采样过程具体为:
上面可以看到, 我们每个时刻只会考虑一个状态, 而不会对所有状态进行考虑. 因为某一个马尔科夫链的性质就是完全由它的状态转移矩阵决定的.
==注意==
==实际实现==
实际过程中, 我们只需要为当前状态和目标状态定义一个统一的转移概率计算方式就可以了
此外, 在高维(离散)空间中, 我们还可以提前限定好一个状态下一时刻所能到达的可能状态数, 即每次转移只允许某一个维度上变化.
通过以上两种方式, 就可以完全避免多维产生的维度爆炸问题.
==本质==
通过MCMC来做抽样本质上就是将样本纵向在空间上的分布转化成为了样本横向在时间上的等价分布, 所以MCMC具备避免空间爆炸的能力是必然的.
接下来讨论MCMC如何采样的问题.
细致平稳条件
要解决MCMC采样的问题, 我们从细致平稳条件来切入.
证明:
(第一个等式是将一直平稳条件带入得到的.)
基础的MCMC采样
这样, 我们就得到了马尔科夫链的转移概率矩阵, 满足:
==理解==
这个形式与前面蒙特卡洛方法中的接受-拒绝采样很相似.
那里是以一个常用分布通过一定的接受-拒绝概率得到一个非常见分布
现在MCMC采样的过程为:
Metropolis-Hasting采样(M-H采样)
上面的MCMC采样方法在实际中是难以使用的, 原因为:
为了解决接受率过小的问题, 我们可以尝试着将等式两边的接受率同时方法相同的比例, 即:
这样等式依然是成立的, 但接受率被放大之后, 被拒绝的情况就少了.
证明完毕.
经过改造后的M-H采样过程如下:
M-H采样存在的问题:
高维(特征很多)情况下, 甚至很难求出目标的各个特征的联合分布, 但可以方便求出各个特征的之间的条件概率分布, 能不能使用条件概率分布进行采样呢
Gibbs采样
为了解决上面的问题, 我们使用Gibbs采样
Gibbs的思路是:
限定下一个时刻所能达到的可能的状态数, 即从当前时刻的状态, 只能转移到有限的状态上, 而不是全部的状态
具体来说, 对于高维空间, 每次转移只允许在某一个维度上进行变化
二维空间下的细致平稳条件:
两式的右端是相等的, 因此两式左端相等, 即:
也就是:
这就是Gibbs采样中的二维情况下的细致平稳条件:
因此, 在任意一个维度的具体值确定的直线, 直线上的任意两点之间的条件概率分布就能够满足细致平稳条件的状态转移概率
二维Gibbs采样方法:
多维Gibbs采样方法:
将二维的情况推广到多维, 我们每次转移的时候只需要对一个维度进行转移, 其他维度不变, 通过这种思路来构建状态转移概率矩阵.
具体过程如下:
这时, 我们可以引入蒙特卡罗思想, 通过随机采样的方法, 即接受-拒绝采样的方法, 来对随机变量X的分布概率进行估计.
对于随机变量X本身的分布概率P(X), 本身太复杂导致无法采样. 那么我们设定一个可采样的分布q(X), 例如高斯分布:
使用这个方便采样的分布q(x), 以及使用一个常量k, 使得真正的概率分布p(x)总在kq(x)的下方.
首先根据q(x)进行采样, 得到一个x0值
从均匀分布[0,kq(x)]中采样得到一个值u
若u>p(x0), 即在灰色区域, 拒绝这次抽样, 否则接受这次抽样
重复以上过程得到n个接受的样本x0,x1,⋯,xn−1
通过这n个点, 我们就得到了随机变量X整体的分布情况, 可以继续进行别的运算, 如积分, 求期望等
高维情况下, p(x1,x2,...,xn), 去寻找合适的q(x)和k是非常困难的
我们将这个分布和我们的目标采样分布p(x)结合起来, 利用马尔科夫链的平稳分布进行采样来代替真实的分布.
关于马尔科夫链为何能解决高维空间样本组合爆炸的问题, 移步中的第三部分.
现在我们要做的构造一个具有平稳分布p(x)的马尔科夫链了.
马尔科夫链有一个很重要的性质, 状态转移的概率只依赖于当前时刻, 具体来说对于序列状态...Xt−2,Xt−1,Xt,Xt+1,..., 我们在时刻Xt+1的状态转移概率只依赖于Xt, 即:
P(Xt+1=x∣Xt,Xt−1,⋯)=P(Xt+1=x∣Xt)
状态转移概率是指随机变量在一个时刻由状态si转移到下一个时刻状态sj的概率, 即:
P(i→j):=Pi,j=P(Xt+1=sj∣Xt=si)
记πk(t)为随机变量X在t时刻取值为sk的概率, 则随机变量X在t+1时刻为si的概率为的概率为:
我们把(π1(t),⋯,πn(t))称为t时刻的状态向量(随机变量共有n个离散的状态), 也是这个时刻下随机变量的分布情况; 而右侧的矩阵被称为转移概率矩阵P, 决定了一个马尔科夫链的表现.
首先, 状态向量π是一个连续函数, 即连续随机变量X的概率函数. 若进行抽样就是根据此时的概率函数进行抽样.
而转移概率矩阵此时也将不是一个矩阵, 而是一个转移核, 也可以理解为一个条件概率分布函数P(y∣x), 其中x,y分别代表随机过程在两个不同时态(此时的时态仍然是离散的)上的取值. 转移核的构建有很多方法, 比如使用核函数表示两个值之间的距离. 在PyMC
包中的贝叶斯推断方法, 会将训练样本的真实值考虑进来, 来构建这个转移核, 等等.
如果一个马尔科夫链满足以上两条性质, 那么对于任何的初始状态向量π(0), 经过若干次的转移, 随机变量X的分布都能够收敛到唯一的平稳分布π∗, 即:
t→∞limπ(0)Pt=π∗
π∗P=π∗
也就是说在达到平稳分布以后的时刻, 再进行状态转移, 其分布也不会改变, 仍未π∗
因此, 这个平稳分布π∗就是我们想要想要进行采样的分布p(x), 这个平稳分布就可以近似代替随机变量的真实分布了, 我们在马尔科夫链收敛到平稳分布之后, 每个时刻抽样一个样本即可, 就相当与在真实分布上进行抽样.
初始化: 输入马尔科夫链的状态转移矩阵P, 设定状态转移次数阈值n1(达到平稳过程需要的状态转移次数), 需要的样本个数n2.
初始化: 从先验分布π0采样得到初始的状态值x0
进行状态转移, 从条件概率分布P(x∣xt)中采样得到下一时刻的状态xt+1, 这个过程重复n1+n2次
样本集合(xn1,xn1+1,...,xn1+n2−1)就是我们从平稳分布中采集到的逼近于真实分布的样本.
由此来讲, 如果随机变量X共有n种离散的状态, 我们不必考虑每个时刻所有状态的转移(这样我们需要考虑n2种情况). 在实现代码的时候, 我们只需要考虑实现当前状态xi到下一时刻的状态xj的条件概率P(xj∣xi)的接口, 并不需要一个完整的概率矩阵.
但是, 如何构造马尔科夫链中的转移概率矩阵P仍未解决. 那么具体如何采样仍不得知.
马尔科夫链还有一个重要的细致平稳条件, 即马尔可夫链在某一时刻的分布π为平稳态的一个充分不必要条件为:
πi×pij=πj×pji
这是在离散情况下的公式, πi表示随机变量处于状态xi(即上文的si)的概率, pij为状态xi转移到xj的概率, 即P(xj∣xi).
∑iπipij=∑iπjpji=πj
将上式由单个状态xi的概率πi扩充成所有状态, 将上式写成矩阵形式, 就会得到πP=π的形式, 因此此时的状态分布是平稳的.
因此, 我们要找到一个马尔科夫链(实际上就是寻找状态转移矩阵P), 使得平稳分布π满足上述的性质, 这是我们继续进行的目标.
我们的目标现在是满足细致平稳条件, 即寻找一个状态转移矩阵P, 使得:
π(i)P(i,j)=π(j)P(j,i)
但是对于任意一个容易采样的分布Q, 很难满足:
π(i)Q(i,j)=π(j)Q(j,i)
注意这里的P(i,j)和Q(i,j)等都是条件概率.
我们加以改造, 对上式引入α(i,j), 使得上式可以恒等:
π(i)Q(i,j)α(i,j)=π(j)Q(j,i)α(j,i)
这要求α(i,j)满足:
α(i,j)=π(j)Q(j,i)
α(j,i)=π(i)Q(i,j)
P(i,j)=Q(i,j)α(i,j)
马尔科夫链的状态转移矩阵P通过一个容易采样的条件概率矩阵Q和一个接受率α(i,j)组合获得. 接受率α(i,j)的取值在[0,1]之间, 表示着是否接受这个采样的概率值.
这里是以一个常见的马尔科夫链状态转移矩阵Q通过一定的接受-拒绝概率得到目标转移矩阵P, 两者的解决问题思路是类似的
选定一个常用的马尔科夫链状态转移矩阵Q, 设定状态转移次数阈值n1, 需要的样本个数n2.
从先验分布π0采样得到初始的状态值x0
for t=0 to
n1 + n2 - 1
:
从条件概率分布Q(x∣xt)中采样得到样本x∗
从均匀分布中采样得到u∼uniform[0,1]
若u<α(xt,x∗)=π(x∗)Q(x∗,xt), 这里的α(xt,x∗)就是从$$x
t转移到x的接受率,则接受转移:x{t+1}= x{}$$
样本集合(xn1,xn1+1,...,xn1+n2−1)就是我们从平稳分布中采集到的逼近于真实分布的样本.
接受率α(xt,x∗)=π(x∗)Q(x∗,xt)往往是非常小的, 例如0.1
, 这会导致大部分的采样都会被拒绝转移, 这样收敛过程以及采样的效率都会非常的低, 在高维的情况下情况更加严重.
π(i)Q(i,j)[n∗α(i,j)]=π(j)Q(j,i)[n∗α(j,i)]
放大到何种程度呢, 我们将α(i,j)和α(j,i)两者中的最大值放大到1, 即一定接受的程度, 又由于:
α(i,j)=π(j)Q(j,i)
α(j,i)=π(i)Q(i,j)
当α(i,j)为最大值或α(j,i)为最大值时就会有着不同的放大倍数, 而综合起来, α(i,j)最终会被放大为:
α(i,j)=min{π(i)Q(i,j)π(j)Q(j,i),1}
证明当P(i,j)=Q(i,j)α(i,j)且α(i,j)=min{π(i)Q(i,j)π(j)Q(j,i),1}时, 满足细致平稳条件:
π(i)P(i,j)=π(i)Q(i,j)α(i,j)=π(i)Q(i,j)min{π(i)Q(i,j)π(j)Q(j,i),1}=min{π(j)Q(j,i),π(i)Q(i,j)}=π(j)Q(j,i)min{π(j)Q(j,i)π(i)Q(i,j),1}=π(j)Q(j,i)α(j,i)=π(j)P(j,i)
选定一个常用的马尔科夫链状态转移矩阵Q, 设定状态转移次数阈值n1, 需要的样本个数n2.
从先验分布π0采样得到初始的状态值x0
for t=0 to
n1 + n2 - 1
:
从条件概率分布Q(x∣xt)中采样得到样本x∗
从均匀分布中采样得到u∼uniform[0,1]
若u<α(xt,x∗)=min{π(i)Q(i,j)π(j)Q(j,i),1}, 这里的α(xt,x∗)就是从$$x
t转移到x的接受率,则接受转移:x{t+1}= x{}$$
样本集合(xn1,xn1+1,...,xn1+n2−1)就是我们从平稳分布中采集到的逼近于真实分布的样本.
高维情况下, 计算接受率计算式α(xt,x∗)=min{π(i)Q(i,j)π(j)Q(j,i),1}需要的时间会很多, 导致算法的效率很低. 而且由于α<1, 很多转移提议被否决, 这就浪费了计算力, 能否做到不拒绝转移呢?
π(x1,x2)是一个二维联合分布, 观测两个点A(x1(1),x2(1))和B(x1(1),x2(2)), 两个点在第一个维度上是相等的, 则以下两式成立:
从点A进行状态转移, 且第一维度保持不变, 第二维度上变为x2(2)的概率:
π(x1(1),x2(1))π(x2(2)∣x1(1))=π(x1(1))π(x2(1)∣x1(1))π(x2(2)∣x1(1))
从点B进行状态转移, 且第一维度保持不变, 第二维度上变为x2(1)的概率
π(x1(1),x2(2))π(x2(1)∣x1(1))=π(x1(1))π(x2(2)∣x1(1))π(x2(1)∣x1(1))
π(x1(1),x2(1))π(x2(2)∣x1(1))=π(x1(1),x2(2))π(x2(1)∣x1(1))
π(A)π(x2(2)∣x1(1))=π(B)π(x2(1)∣x1(1))
在x1=x1(1)这条直线上, 使用条件概率分布π(x2∣x1(1))作为状态转移概率, 则直线上的任意两点满足细致平稳条件.
P(A→B)=π(x2(B)∣x1(1))ifx1(A)=x1(B)=x1(1)
P(A→C)=π(x1(C)∣x2(1))ifx2(A)=x2(C)=x2(1)
P(A→D)=0else
以上的转移概率矩阵P对于平面上任意两点E, F, 都能满足细致平稳条件:
π(E)P(E→F)=π(F)P(F→E)
输入平稳分布π(x1,x2), 设定状态转移次数阈值n1, 需要的样本个数n2
随机初始化初始状态值x1(0), x2(0)
for t=0 to n1+n2−1:
从条件概率分布P(x2∣x1(t))中采样得到样本x2t+1
从条件概率分布P(x1∣x2(t+1))中采样得到样本x1t+1
{(x1(n1),x2(n1)),(x1(n1+1),x2(n1+1)),...,(x1(n1+n2−1),x2(n1+n2−1))}样本集就是我们需要的平稳分布对应的样本集.
比如一个n维的概率分布π(x1,x2,...xn), 通过对n个坐标轴上轮换采样, 来得到新的样本. 对于轮换到的任意一个坐标轴xi上的转移, 状态转移概率为P(xi∣x1,x2,...,xi−1,xi+1,...,xn), 即固定n−1个坐标轴, 在某一个坐标轴上移动.
输入平稳分布π(x1,x2,...,xn), 或对应的所有特征的条件概率分布. 设定状态转移次数阈值n1, 需要的样本个数n2
随机初始化初始状态值(x1(0),x2(0),...,xn(0))
for t=0 to n1+n2−1:
从条件概率分布P(x1∣x2(t),x3(t),...,xn(t))中采样得到x1t+1
从条件概率分布P(x2∣x1(t+1),x3(t),x4(t),...,xn(t))中采样得到x2t+1
{(x1(n1),x2(n1),...,xn(n1)),...,(x1(n1+n2−1),x2(n1+n2−1),...,xn(n1+n2−1))}样本集就是我们需要的平稳分布对应的样本集.
不管是用哪种抽样方法(M-H抽样, Gibbs抽样, 以及其他等等抽样), 我们在抽样过程中都不是直接使用π(x)本身, 因为随机变量X可能有很多状态, 甚至无限多的状态(连续情况下), 而且在高维情况下状态更加爆炸.
在采样过程中, 每个时间状态只采样出一个样本, 然后下一个时刻的状态只于这一个具体的状态有关. 因此, 这里的每轮的采用都将使用条件概率分布π(yi∣x−i)代替原来每个时刻的π(x), 这样就解决了分布本身难以计算的问题.
对于M-H采样, 每一步提议新的样本是从提议矩阵Q代表的条件概率分布Q(x∣xt)采样得到的, 即对于每个时刻, 原本应当从目标分布π中采样的下一时刻的状态, 现在改为对提议矩阵代表的条件概率分布Q(x∣xt)进行采样.
因此在计算接受率α中使用到的π中的值可以用对应的条件概率分布Q(x∣xt)的值来代替.