利用张量流实现LDA(潜在Dirichlet分配)的优点

时间:2016-06-19 02:33:09

标签: tensorflow lda

我想用tensorflow作为一种实践来实现LDA,我认为tensorflow版本可能具有以下优点:

  • 快速。如果我可以使用内置操作来表达采样过程。
  • 易于并行化。许多操作都是通过优化并行化实现的,因此这个lda应该很容易在gpus或分布式集群上运行。
  • 更短更清洁的代码。像许多其他模型一样,特别是NN,使用tensorflow构建这样的模型涉及的代码更少。

在我检查了一些lda的python实现(例如,https://github.com/ariddell/lda/)之后,我不知道可以使用什么样的张量流,应该构建什么样的图以及我应该选择什么样的优化器。因为gibbs采样的过程看起来像是关于文档主题的元素更新,主题 - 单词矩阵和主题计数表。那么张量流可以做些什么来简化和优化这个过程呢?

我是否可以将生成的doc的可能性视为实际输入文档作为优化目标,并利用渐变增强优化器来最小化可能性的负面因素,从而获得alpha,beta和doc-topic分布?因为如果这是易处理的,那么肯定可以在这里使用张量流。

2 个答案:

答案 0 :(得分:3)

关于probabilistic programming如何从deep probabilistic programming系统中受益的更广泛问题,有许多相关的答案。

我可以在TensorFlow中为Latent Dirichlet Allocation(LDA)提供一个尖锐的答案。一个关键的好处是认识到LDA只是一个模型。给定此模型,以及表示为逐项矩阵(例如,通过tf.SparseTensor)的数据集,TensorFlow不仅可以执行可伸缩推理,还可以进行非常灵活的推理。在TF中使用的特定操作取决于特定算法。您可以编写一个Gibbs采样器或坐标上升变分推理算法 - 对LDA都是高效的(可用于可训练变量的手动tf.assign操作)。 CAVI具有计算和内存效率scaling to millions of documents,并且可以通过tf.data等高效数据管道进行重新设计。

使用TensorFlow,您还可以使用通用方法,例如黑盒变分推理,这些方法非常通用,不需要手动tf.assign操作。一旦你编写好它就可以解决你的问题,你就可以通过多种方式扩展LDA,例如非共轭先验,分层先验和深层网络参数化(可能tf.layers)。通用方法需要诸如TensorFlow优化器和TensorFlow自动区分等工具,以实现基于梯度的优化。除非您展示autograd等跟踪工具,否则这些在Python中不可用。

答案 1 :(得分:-1)

我已经运行了这两个模型,所以我认为我有一些来自实践的想法。 LDA的输出是主题分布和单词分布,其输入是文档中的单词。 Word2Vec的输出是句子的向量表达式。在您的应用场景中,您的目标是推荐类似的主题,而不是句子的类似含义。例如,"我找到了一只非常可爱的猫。","我叔叔的猫很胖,我喂它的食物,我很满意。"这两个句子有不同的含义,但这些句子包含相同的主题 - 猫。 希望它有所帮助。