TensorFlow 中的完整 Doc2Vec 实现/复制?
实现
这些都是使用 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() 函数(与您的链接在存储库中的目录相同,但文件不同)以从您的首选来源中提取。例如,您可能想要修改它以从本地文件系统中提取数据。