1

我有大约 20k 个 60 - 150 字的文档。在这 20K 个文档中,有 400 个文档已知类似文档。这 400 个文档作为我的测试数据。

目前我正在删除这 400 个文档并使用剩余的 19600 个文档来训练 doc2vec。然后我提取训练和测试数据的向量。现在对于每个测试数据文档,我发现它与所有 19600 个火车文档的余弦距离,并选择余弦距离最小的前 5 个。如果标记的类似文件出现在前 5 个中,则认为它是准确的。准确率% = 准确记录数/记录总数。

我找到类似文档的另一种方法是使用 doc2Vec 最相似的方法。然后使用上面的公式计算精度。

以上两个精度不匹配。每个时期一个增加另一个减少。

我正在使用这里给出的代码:https ://medium.com/scaleabout/a-gentle-introduction-to-doc2vec-db3e8c0cce5e 。用于训练 Doc2Vec。

我想知道如何调整超参数,以便通过使用上述公式获得准确性。我应该使用余弦距离来查找最相似的文档还是应该使用 gensim 的最相似函数?

4

1 回答 1

4

您引用的文章对该Doc2Vec算法进行了合理的阐述,但其示例代码包含一个非常有害的反模式:train()在循环中多次调用,同时手动管理alpha. 这几乎不是一个好主意,而且很容易出错。

相反,不要更改默认值,只需使用所需的min_alpha调用一次,并让方法顺利管理自身。train()epochsalpha

您的一般方法是合理的:根据一些先前的想法开发一种可重复的模型评分方法,然后尝试各种模型参数并选择得分最高的参数。

当您说您自己的两种准确度计算方法不匹配时,这有点令人担忧,因为该most_similar()方法实际上会根据所有已知的文档向量检查您的查询点,并返回具有最大余弦相似度的那些。这些应该与您计算出的具有最小余弦距离的那些相同。如果您在问题中添加了您的确切代码——如何计算余弦距离,以及如何调用most_similar()——那么很可能会清楚哪些细微的差异或错误是导致差异的原因。(不应该有任何本质上的区别,但考虑到:你可能想要使用most_similar()结果,因为它们被称为非错误,

请注意,您不必保留一组已知高度相似的文档对。由于Doc2Vec是一种无监督算法,因此您不会在训练期间为其提供首选的“确保这些文档相似”的结果。在全套文档上进行训练是相当合理的,然后选择最能捕捉您想要的最相似关系的模型,并相信包含更多文档实际上可以帮助您找到最佳参数。

(但是,这样的过程可能会稍微高估未来未见文档或其他一些假设的“其他 20K”训练文档的预期准确性。但根据您的训练数据,它仍然可以合理地找到“可能的最佳”元参数。)

(如果您在训练期间没有将它们全部喂完,那么在测试期间您将需要使用infer_vector()看不见的文档,而不仅仅是从训练中查找学习到的向量。您还没有显示用于此类评分/推理的代码, 但这是另一个可能做错的步骤。如果您只是将所有可用文档的向量一起训练,则消除了出错的可能性。)

检查所需文档是否在最相似的前 5(或前 N)中只是对模型进行评分的一种方法。另一种方法是在一些原始的“段落向量”(Doc2Vec)论文中使用,对于每一对这样的对,还选择另一个随机文档。每次报告已知相似文档比第三个随机选择的文档彼此更接近时,都将模型计算为准确。在最初的“段落向量”论文中,现有的搜索排名系统(它报告某些文本片段以响应相同的探测查询)或手工策划的类别(如在 Wikipedia 或 Arxiv 中)被用来生成这样的评估对:检查相同的搜索结果页面或相同的类别,以查看它们在模型中是否比其他随机文档“更接近”。

如果您的问题被扩展为更多地描述您尝试过的一些初始参数(例如您提供给Doc2Vec和的完整参数train()),以及似乎有帮助或有伤害的内容,则可能会建议其他范围值得检查的参数。

于 2019-07-31T21:58:09.463 回答