TensorFlow 中的完整 Doc2Vec 实现/复制?

数据挖掘 张量流 word2vec 词嵌入
2021-09-18 09:34:46

我希望重现 doc2vec,即Le & Mikolov 的段落向量方法

有人知道使用 Tensorflow 的完整脚本吗?特别是,我正在寻找一种解决方案,将 PV-DM 和 PV-DBOW 的段落向量连接起来。

到目前为止,我发现:

  • GitHub #1:只有 PD-DM,我也不知道如何运行这个脚本?

  • GitHub #2:不清楚它是什么(PV-DM?)

  • GitHub #3:看起来像 PV-DM?

似乎没有与原始 IMDB 数据相关的解决方案,并且涵盖 PV-DM 和 PV-DBOW。我知道一些gensim脚本,但想知道是否有 TF 解决方案。

1个回答

实现

这些都是使用 Tensorflow 的完整脚本,但仅仅使用 Tensorflow 并不能保证质量。

坏的

WangZ 的实现看起来很完整,尽管它只提供了 Adagrad 和随机梯度下降,这两个最不可靠的梯度下降。你真的想要小批量梯度下降,它可以预测地收敛到你初始化系统的局部最小值(想想:微积分类的优化问题)。除此之外,他或她的实施没有什么真正值得注意的。

更好的

Jonathan 的实现比 WangZ 的好一点,但比 Machine Learning Cookbook 解决方案差。他还使用 Gensim 而不是 TensorFlow,除了从工程的角度来看,这还不错(它的扩展性不太好)。他使用小批量梯度下降,但使用分层 softmax 而不是 NCE。除了可能增加训练时间之外,这不会产生巨大的影响。

最好的

Machine Learning Cookbook 的实现真的令人难以置信。它遵循谷歌关于该主题的原始论文的所有建议,甚至改进了梯度下降(这使用了小批量梯度下降)。值得注意的是,这也使用了我通常看不到的 NCE(噪声对比估计),而不是分层 softmax 来获得梯度下降的误差,谷歌展示了它产生的结果稍好一些并且工作速度更快。很多想法显然都涉及到了这一点,无论是谁在背后都知道他(他)在做什么。如果我是你,我会选择这个。

PV-DM 与 PV-DBOW

PV 代表段落向量,即您所说的模型。它也被称为 doc2vec。它有两种风格,CBOW(连续词袋),有时也称为 DBOW(分布式词袋)和 DM(分布式内存)。

这些都是分布式模型,因为每个“神经元”都对训练任务有贡献,但是如果没有其他“神经元”给它提供上下文,任何事情都没有任何意义。

套用 Google 的文档: CBOW /DBOW 模型从一组上下文词中预测目标词(例如,从“猫坐在”中的“垫子”),而 DM 模型从单个词(例如“坐在“猫”中的..垫子)。

在实践中,研究表明,如果您有大量数据,则 skip-gram/DM 模型效果更好,而 CBOW/DBOW 模型在数据量少的情况下效果更好。也就是说,如果没有大量训练数据,这种技术(以及一般的深度学习)并不是特别有效。

数据库

这些实现中的任何一个都可以使用来自 IMDB 的评论数据进行训练。例如,机器学习食谱实现是硬编码的,可以从类似的数据集中提取数据要更改从何处获取数据,您可以修改 text_helpers.py 中的 load_movie_data() 函数与您的链接在存储库中的目录相同,但文件不同)以从您的首选来源中提取。例如,您可能想要修改它以从本地文件系统中提取数据。