@zhuanxu
2018-01-24T11:41:15.000000Z
字数 2886
阅读 9772
贝叶斯
lda
gibbs
经过前面两篇文章,我们终于来到了Gibbs samping,为什么我这么兴奋呢?因为我当初看贝叶斯推断就是因为LDA模型,里面用到了Gibbs sampling的方法来解参数问题。
好了下面开始介绍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模型,看怎么用Gibbs 采样来解。
先看LDA的模型:
整个过程可以描述为
上面整个模型中,模型参数有:
为了做Gibbs采样,我们先看这几个参数的联合分布。
上面公式中是多项分布,而是Dir分布,我们知道Dir分布和多项分布是共轭分布,因此后验分布比较容易写出来。
下面我们开始计算每个参数的概率,主要是计算下面3个概率:
先来计算第一个主题的概率分布:
我们可以看到是一个多项分布,每一项的概率都是,而他们本身也是需要从Dir分布中采样出来的,一个自然的想法就是我们可以用估计值来代替,根据Dir分布我们能够很方便的计算出概率来。
此处需要的数学基础可以看主题模型:LDA 数学基础。
里面一个点是Dir分布和其数学期望
我们上面在Gibbs采样中计算分别采样都可以用Dir分布的的期望来作为新的参数值。
介绍完数学基础后,我么就能来看如何实现了,下面是一个伪代码。
for m in range(D): // 遍历每篇文档
for n in range(W[m]): // 遍历每篇文档的单词
w = W[m][n] // 单词 w
k = z[m][n] // 主题 k
nd[m,k] -= 1 // 第m篇文档第k个主题的词数目
ndsum[m, 0] -= 1 // 第m篇文档总的主题词数目sum(nd[m])
nw[k, w] -= 1 // 第k个topic中产生w的数目
nwsum[k, 0] -= 1 // 第k个topic总共产生的w数目
# 计算theta值,Dir分布的期望
theta_p = (nd[m] + alpha) / (ndsum[m, 0] + sum_alpha)
# 计算beta的期望值
beta_p = (nw[:, w] + beta[w]) / (nwsum[:, 0] + sum_beta)
# multi_p为多项式分布的参数
multi_p = theta_p * beta_p
# 多项式采样新的k
k = mul_sample(multi_p)
nd[m,k] += 1 // 第m篇文档第k个主题的词数目
ndsum[m, 0] += 1 // 第m篇文档总的主题词数目sum(nd[m])
nw[k, w] += 1 // 第k个topic中产生w的数目
nwsum[k, 0] += 1 // 第k个topic总共产生的w数目
z[m][n] = k// 更新主题
完整的代码可以见玩点高级的 -- 带你入门 Topic 模型 LDA(小改进 + 附源码)
下面我们再来用pymc3来实现下。
可以说pymc3写出来的代码真是简洁。but。就是太慢了,完整的代码可以看gibbs-lda。
本文介绍了mh算法的特例Gibbs采样,并且给出了证明为什么Gibbs采样work,最后我们用Gibbs采样来解决了LDA的参数估计问题。
你的鼓励是我继续写下去的动力,期待我们共同进步。