最近在用topic model跑一些数据,算法采用了LDA和PLSA进行对比,由于数据量稍大,采用了LDA的并行化版本,对其并行化方法很感兴趣,查看了相关资料后先总结如下,有时间可以继续琢磨。Gibbs Sampling用来逼近LDA中的隐式变量,是一种较为简单的实现方式。
Gibbs 方法
传统的实现方法是串行的,主要流程如下:
步骤4中,每一个word都需要对全局进行更新,很容易造成网络拥堵,是并行化主要优化的地方,一种并行化方案如下:
上面的方法一方面可以进行异步网络传输,另一方面设置cache进行批量更新可以减少同步带来的加锁操作。
在采用的LDA并行化版本里面,基本是采用方法二的思路进行优化,即用MPI集群的多个计算节点分别进行计算部分文档集合,在每台计算节点,采用多线程的方法进行加速,在每台计算节点计算完成之后,更新全局的p(word|topic),然后进行下一轮的迭代。在程序运行的过程中发现在单台计算节点采用多线程的方法不一定能提高效率,甚至会降低运行速度,需要进一步观察和实验。