2008年9月10日星期三

分布式LDA, Latent Dirichlet Allocation for Hadoop

这几天偷闲,写了一个基于hadoop分布式计算环境和MapReduce的LDA训练程序,测试基本通过,不过有些地方效率还不好,得仔细调调。

不写不知道,自己写一下,对LDA的体会就多了一些。比如说Dirichlet先验这个事情,反映到训练过程上,就是给隐含主题和词的同现计数加上一个简单的Laplacian平滑(Laplacian平滑就是把所有值都加上一个比较小的数字然后再重新归一化)。而Gibbs Sampling有一个问题,就是每次采样都需要更新全局信息,基本没有机会做真正意义上的并行化,只能做一个Gibbs Sampling的近似。

利用MapReduce进行并行化也有一点问题,MapReduce本身的开销比较大,如果数据量不大到一定的程度,利用MapReduce是不是真得能提高速度还是个未知数。我想再写一个非MapReduce但是支持超过内存大小的Documents的版本,没准在多数情况下都比MapReduce的快。

必须声明的是,思考这个事情的过程中得到了LDA并行化大牛益哥的指导,我只是大实验一般实践一下。非MapReduce版本的LDA如果好用,可能会开源一下,等出来再说吧,哈哈。

2 条评论:

Yi Wang 说...

司哥说的Laplacian smoothing是指对 posterior distribution P(z_{dj}|Z_{-dj},W)做smoothing吗?如果是,那么为什么需要这么做呢?以及 alpha 和 beta 是不是已经在做这事了呢?

请司哥点拨。

kylinthinker 说...

大牛 不知可否请教一下 我也正在学习lda 如何建立词汇表(vocabulary)和如何把文本文件转换成数字格式(lda的输入格式)