贝叶斯统计:Gibbs sampling 原理到实践

3,734 阅读4分钟

经过前面两篇文章,我们终于来到了 Gibbs samping,为什么我这么兴奋呢?因为我当初看贝叶斯推断就是因为 LDA 模型,里面用到了 Gibbs sampling 的方法来解参数问题。

由于头条对 Markdown 支持不是太好,可以去原文链接查看:https://www.zybuluo.com/zhuanxu/note/1027270。

好了下面开始介绍 Gibbs 采样。

Gibbs 采样

前面一篇文章我介绍了细致平稳条件,即:

Gibbs 采样的算法如下:

我们来证明 Gibbs 采样算法也满足细致平稳条件。

假设 x = x 1 , . . . , x D ,当我们采样第 k 个数据的时候,

此时我们的接受率为:

上面公式一个关键的部分是:

带入就可以得到 1,即 gibbs 采样是一定接受的采样。

下面我们照惯例还是来一个例子。

例子

假设有我们有数据 x1,x2...xN,其中 1-n 的数服从一个泊松分布,n+1-N 的数服从另一个泊松分布。

而泊松分布的参数服从 Gamma 分布,我们总结下目前的先验假设:

此时后验概率是:

我们下一步开始我们的采样, 先计算下 logP:

接着来采样

我们此处只取了跟当前采样参数有关的项,因为其他都是一些常数,作用只是将概率分布归一化,不影响采样。

此处都服从 Gamma 分布。

最后是 n:

n 没有显示的分布信息,但是我们简单将其认为是一个多项分布。

下面是关键 Python 代码:

完整代码见 Gibbs 。

采样后输出如下图:

LDA

下面我们来最激动人心的 LDA 模型,看怎么用 Gibbs 采样来解。

先看 LDA 的模型:

整个过程可以描述为

  1. 对于文档 d,从分布中采样出,即文档 d 的主题分布

  2. 对于文档的每个词从多项分布中采样出主题 k,即

  3. 对于主题 k,从中采样出,即主题 k 的词分布

  4. 对于每个词,从主题分布中采样出具体的单词 t

上面整个模型中,模型参数有:

为了做 Gibbs 采样,我们先看这几个参数的联合分布。

上面公式中是多项分布,而是 Dir 分布,我们知道 Dir 分布和多项分布是共轭分布,因此后验分布比较容易写出来。

下面我们开始计算每个参数的概率,主要是计算下面 3 个概率:

先来计算第一个主题的概率分布:

其中

表示第 m 篇文档中,属于每个主题的词个数。 

接着计算每个主题的词分布

其中

第 m 篇文档中属于 k 个主题的,每个单词的数量,共 (1-V) 个单词。最后来估算每个词的主题。

我们可以看到 p(zmj=k) 是一个多项分布,每一项的概率都是 beta*theta,而他们本身也是需要从 Dir 分布中采样出来的,一个自然的想法就是我们可以用估计值来代替,根据 Dir 分布我们能够很方便的计算出概率来。

此处需要的数学基础可以看头条号中的主题模型:LDA 数学基础。

里面一个点是 Dir 分布和其数学期望

我们上面在 Gibbs 采样中计算分别采样都可以用 Dir 分布的的期望来作为新的参数值。

编码

介绍完数学基础后,我么就能来看如何实现了,下面是一个伪代码。

完整的代码可以见玩点高级的 -- 带你入门 Topic 模型 LDA(小改进 + 附源码)

pymc3 实现

下面我们再来用 pymc3 来实现下。

可以说 pymc3 写出来的代码真是简洁。but。就是太慢了,完整的代码可以看 gibbs-lda。

总结

本文介绍了 mh 算法的特例 Gibbs 采样,并且给出了证明为什么 Gibbs 采样 work,最后我们用 Gibbs 采样来解决了 LDA 的参数估计问题。

你的鼓励是我继续写下去的动力,期待我们共同进步。