在机器人学、控制理论、机器学习各个领域中,常常遇到的一个问题是,已知概率密度函数
![]()
,但是
![]()
却无法求得解析解。我们只能退而求其次,采样获得粒子
![]()
使得
![]()
来替代
![]()
,通过计算
![]()
来获得近似解。直观上理解,我们希望
![]()
大的地方,多采集一点
![]()
,反之则少采集一点。要获取满足上述条件的
![]()
,马尔可夫蒙特卡洛(MCMC)方法采用一种很直观的生成方法,在不同的
![]()
之间跳来跳去,概率高的地方多呆一点,概率低的地方少呆一点。跳的多了,也就反映出来
![]()
的分布了。要完成上述目的,需要两个要素:
- 随机性:要不然叫什么采样?
- 简单有效的跳跃方法:大量的采样需要靠状态之间的跳跃来实现,那跳起来肯定要轻松愉快才行;同时这种跳跃方法必须倾向于概率高的地方。
是的,随机性就是蒙特卡洛,跳跃方法就是马尔可夫。
首先上方法:
- 输入我们的马尔科夫链状态转移矩阵 ,平稳分布
![]()
,设定状态转移次数阈值
![]()
,需要的样本个数
- 从任意简单概率分布采样得到初始状态值
- for
![]()
to
(1) 从条件概率分布
![]()
中采样得到样本
(2) 从均匀分布采样
(3
![]()
, 如果
![]()
_t),则接
![]()
_
(4) 否则不接
![]()
, 0)
- 样本集(
![]()
,
![]()
,...,
![]()
)即为我们需要的平稳分布对应的样本集。
对上述方法进行一个简单的分析:
- 我们的目标是得到符合
![]()
的
![]()
,为此我们需要构造一个二维Markov状态转移矩阵
![]()
,用来完成跳转。这个
![]()
反应的是各个状态之间跳转的可能性,
![]()
越大,则反应从
![]()
状态越容易跳转到
![]()
状态。一个好的
![]()
应该具有以下特点,
![]()
越大,
![]()
越大;
![]()
与
![]()
状态越近,
![]()
也越大。
- 设置状态转移次数阈值
![]()
是因为在高维数据中,很难确保初始值在分布较为集中区域,如果初期在低密度区域徘徊,采集的值往往有很大的噪声,需要予以去除,所以需要一个burn-in的过程。只保留
![]()
之后的数据。
- 在跳转过程中(循环体内),首先基于Markov状态转移矩阵
![]()
对上一时刻状态
![]()
进行一次跳转,得到下一时刻状态
![]()
。但是这种跳转只有一定的概率被接受,这个概率可以用
![]()
来表示,如果跳转失败,则需要重新进行跳转。
整个过程直观理解如下:首先采样用的是
![]()
,一般来说
![]()
的选择会使
![]()
附近的采样概率较高,对应Markov链中相邻状态之间的跳转;其次,
![]()
越大的地方,
![]()
大的可能性也大,跳转越容易被接受,采样的可能性更高。所以整个采样过程,直观上看就是粒子在一步三回头的往概率高的区域游走。从整个MCMC采样过程来分析,只有第三步用到了输入
![]()
,用来接受或拒绝一次跳转。但是更进一步,为什么构造的
![]()
在整个MCMC过程中占据如此重要的步骤,既出现在新状态的采样过程中,又出现在采样拒绝过程中?
![]()
是接下来分析的重点,它的分析重点在于Markov过程的分析。
Markov过程是对客观世界因果关系的简化,主要idea就是下一时刻的状态只与当前时刻有关,而与历史时刻无关,用公式表达就是:
上式中
![]()
和
![]()
代表当前时刻和下一时刻的状态集合,条件概率
![]()
代表两个时刻任意两个状态之间的跳转概率。为了防止混淆,提前介绍一下接下来用到的几个公式含义,
![]()
表示
![]()
时刻的状态分布,如果
![]()
的状态分布是离散的,共
![]()
种可能,例如每天的天气可能是0:晴、1:阴,2:下雨三种状态之一,则
![]()
可以用一个二阶矩阵
![]()
来表示,
![]()
表示从
![]()
状态跳转到
![]()
状态的概率,拿天气的例子做个说明,
![]()
表示今天天晴情况下明天也是天晴的概率,
![]()
今天阴天情况下明天晴天的概率。
![]()
是一种枚举类型,在某一时刻是可能类型中的一个。例如在天气的例子中,
![]()
,表示
![]()
天的晴、阴,下雨的可能性分别是
![]()
。
![]()
天的天气仅由第
![]()
天的天气分布
![]()
和跳转矩阵
![]()
决定:即
我们关注的一种Markov Chain 是 非周期连通的:非周期的意思从一个状态出发不会周期性回到这个状态,连通的意思就是从一个状态出发可以到达任何一个状态。再拿上面的天气情况做个例子,非周期的意思就是不能说今天是晴天,五天之后一定是晴天,而连通的意思就是在足够长的时间内,任何一种天气都会变成另一种天气,不会说今天是晴天,以后就再也不会下雨了。非周期连通的Markov Chain有一个很好的性质,就是跳着跳着,状态的分布就不会变了,即
再拿天气的例子做个说明,就是经过大自然这么长时间的衍变后,每天是晴、阴或者下雨这三种天气的的概率已经是固定的,所以我从任意一天开始足够长的时间统计都能反应当地这三种天气的分布。说的更形象一点,上述性质描述了一种场景,可以把
![]()
个状态想像成
![]()
个桶,
![]()
时刻,我在第i个桶里放入
![]()
个球(请忽略
![]()
是个小数),然后这些球按照
![]()
所表示的概率进行跳转,得到
![]()
时刻每个桶的球数还是和
![]()
时刻一样的。
![]()
可以认为是
![]()
转移概率下的稳态分布,即
![]()
。
借这几个桶说下,为什么要求 Markov Chain是非周期的。假设存在第
![]()
个桶是周期的,周期是
![]()
,即
![]()
时刻在
![]()
桶里的球,
![]()
时刻一定也在
![]()
桶里。如果这个桶和其他桶是连通的,经过足够长时间的跳转,可以想象所有的球都会周期性出现在
![]()
桶里。一个简单的说明,一个球
![]()
时刻进入
![]()
桶,另一个球
![]()
时刻进入
![]()
桶,那在
![]()
时刻这两个球一定都在桶里,之后他们就会周期性一起出现在这个桶里,长此以往,所有的球都会周期性一起落入这个桶里,也就不存在稳态分布了。
说到这里,不知道大家有没有意识到,Markov Chain的稳态分布简直就是为采样而生的,因为如果对一个状态分布
![]()
,我能找到对应的
![]()
,使其成为
![]()
的稳态分布,一切就变得很简单了,因为每次经过跳转后,概率分布还是不变的。所以我只用从其中的一个状态开始,跳来跳去,统计一下跳在每个状态的频率,就可以获得该概率分布下的一个采样(每个桶里所有的球并行地跳来跳去跟一个球在足够长时间内在不同的桶里跳来跳去的效果是一样的,因为所有的状态都是可以到达的,而所有的跳转都是Markov的,所以跳的方式不重要)。所有的难题仿佛已经得到完美解决,但是等一下,怎么从
![]()
找到
![]()
,使其满足:
还是和上面一样,我们从离散状态开始分析。上述公式仍然描述的是一个宏观的过程,每次看到这个公式,我仿佛都看到n个桶之间的球跳来跳去。如果把所有的桶放在一起考虑,我们难免眼花缭乱,那么我们能不能通过对任意两个桶之间增加一些约束来保证跳跃的稳定性呢?这样想起来就好像简单了一些,在一次跳转中,任意两个桶之间如果交换的球是一样的,那么肯定可以保证每个桶的球和跳转之前一样的。这有个很官方的名字,叫做细致平稳条件,公式表示就是:
通过这种方式我们把对
![]()
的关注细化到对
![]()
的关注,但是这个
![]()
还是不太容易找到,因为
![]()
还需要满足
![]()
,即上一个时刻一个桶里所有的球都要落在下一个时刻的某个桶里。这样导致的结果是对矩阵的 约束太多,依然不太好找。前辈们就是牛逼,如果上面的做法是把对全局的跳转过程细化到前后时刻的两个状态之间,接下来的这一步神操作就是对前后时刻的两个状态之间的跳转进行细分,通过增加一个变量
![]()
,把之前的跳跃步骤拆分成两步,增加了一步判断操作。既然完美的跳转方式不太好找,那就退而求其次,你尽管跳,不满足条件我就拒绝你。也就是说你任意给我一个状态转移矩阵
![]()
,如果:
很简单,我增加一个判断项
![]()
,使得:
通过增加这个
![]()
,增加了一步拒绝机制,降低了对转移矩阵
![]()
选择的难度。 这个
![]()
其实很好找:
也就是左边
![]()
等于原不等式右边(
![]()
),右边
![]()
等于原不等式左边(
![]()
)。通过引入了
![]()
,跟
![]()
和
![]()
都有关系。
![]()
我们无法改变,但是
![]()
是我们人为选择的,选的好就容易接受,选的不好拒绝的可能性就大,就必须自食其果多跳几次。第一次看到这种做法的时候,忍不住赞叹前辈的鸡贼和机智。
构建上述跳转和接受判断过程后,只要跳的足够多,理论上一定可以获得符合期望概率分布的粒子了。但是在实际操作过程中,由于状态太多,甚至是无穷多(连续分布),状态两两之间的跳转概率
![]()
较低,而
![]()
又与
![]()
成正比,所以跳转被接受的概率也较低,造成大量不被接受的跳转。这个时候,改进版的MCMC,M-H(Metropolis-Hastings)算法出现了,改动很小,却很有效。之前两个桶之间的接受概率是由整体分布决定了,现在两个桶之间一碰头发现,要不咱两之间内部协商一下,放开片面最惠国待遇,两个同时扩大同样倍数的接受概率,这不会影响我们两个之间跳转后的分布情况,但是会增加相互之间跳转的机会。增加多少呢?把大的那个概率增加到1,小的增加相同的倍数即可,简单理解就是处于弱势地位的状态碰到强势地位的状态一定跳转,得到的好处就是强势地位的状态下次碰到向自己跳转的时候接受概率也要增加相应的倍数。总结成公式就是:
至此我们对
![]()
的全过程有了完整的分析。为了获取某个概率分布下的采样,我们引入Markov过程,通过跳来跳去获得采样。Markov过程的建立需要根据目标概率分布构造转移矩阵,来保证转移过程中概率分布不变。这样的转移矩阵很多,但弱水三千,只取一瓢饮,我们引入要求更强的细致平稳条件,并把一次跳转过程拆分成跳转和接受判断两个过程。最后为了提高跳转接受的概率,增加跳转频率,同时增大两两之间的接受概率,用高的接受概率对低的跳转概率归一化,通过增加接受概率让跳转发生的更频繁,采样也更多。通过这样一步步把采样过程细化,最终达到开篇所说的采样过程。至此再看看一开始提到的采样过程,会不会默念一声:牛逼!