首页 > 代码库 > SparseLDA算法
SparseLDA算法
2 SparseLDA算法
本章将介绍一种Gibbs Sampling算法的加速算法——SparseLDA [9],它主要利用LDA 模型的稀疏性,来达到加速以及节省内存的目的,是一种精确算法(没有近似)。
2.1 背景
在介绍具体的算法之前,我们先细化一下算法 LdaGibbs 中的文档采样(主要是 k~∼p(zi|{z? }¬i,{w? }) 的采样),具体见 StandardGibbs,可以看到主要的时间消耗在计算归一化系数 Q(时间复杂度为 O(K))。
上一章给出的LDA训练算法 LdaGibbs :每个采样迭代复杂度是 O(MNm¯¯¯¯¯K)(Nm¯¯¯¯¯表示训练文档的平均长度);内存消耗主要在 nkm 和 ntk,假设都采用Dense存储,内存复杂度是 O(K(M+V));考虑到 nkm 的使用存在局部性,不用常驻内存(可以将上一个迭代的带有主题标号的文档 m 以及对应文档主题直方图 nkm 序列化到磁盘上,采样时通过loader线程预取),内存复杂度是 O(KV)。我们有没有复杂度更低的算法呢?
Porteous等人 [10] 以及Yao等人 [9] 分别给出了自己的解法,都是在优化算法 StandardGibbs 方面做文章。前者的FastLDA算法利用Hölder不等式 [11] 迭代逼近 Q,使得不用每次都计算所有的 q(z)。后者的SparseLDA算法利用LDA模型的稀疏性,也使得不用每次都计算所有的 q(z),同时给出了一种更经济的模型存储方式。因为 SparseLDA 有更好的性能,本章重点介绍 SparseLDA 算法。
题外话,最近(KDD’2014 Best Research Track Paper)Li等人 [12] 利用 Alias 采样以及 Metropolis-Hastings 采样,给出了一个较 SparseLDA 更优的采样算法 AliasLDA。论文给出的实测数据显示,在 K=10,000 情况下,AliasLDA 较 SparseLDA 有一倍左右的性能提升。
2.2 SparseLDA 算法
Figure 7: Length distribution of nkm
Figure 8: Length distribution of ntk
LDA 模型中的 nkm 和 ntk (实现时,一般将 ntk 按词 t 组织成向量)非常稀疏,图 7 和 8 给出了二者的分布。分布来自一份英文语料、主题数 K=200 的实验 [13],语料的文档平均长度 Nm¯¯¯¯¯ 在 30 左右(因为作者的懒惰,没有给出实际的大规模互联网语料上的分布图,但是引用的图已经能说明问题)。实际工程上使用的语义理解 LDA 模型一般使用搜索引擎 Query Log 或 Query Session Log 训练(因为 Query Log 中语义丰富),文档平均长度小于 30,而主题数 K 远大于 200(系列文章后续将介绍的 Peacock 系统支持百万级别主题数模型训练),所以 nkm 和 ntk 将更加稀疏。