Doc2Vec.infer_vector每次都会在特定的训练模型上保持不同的结果

Roh*_*han 8 nlp gensim word2vec doc2vec

我正在尝试遵循这里提到的官方Doc2Vec Gensim教程 - https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-lee.ipynb

我修改了第10行中的代码以确定给定查询的最佳匹配文档,每次运行时,我得到一个完全不同的结果集.我在笔记本第10行的新代码是:

inferred_vector = model.infer_vector(['only', 'you', 'can', 'prevent', 'forest', 'fires']) sims = model.docvecs.most_similar([inferred_vector], topn=len(model.docvecs)) rank = [docid for docid, sim in sims] print(rank)

每次运行这段代码时,我都会获得与此查询匹配的不同文档集:"只有您可以防止森林火灾".差别很明显,似乎并不匹配.

Doc2Vec不适合查询和信息提取吗?还是有bug?

l.a*_*iak 9

查看代码,infer_vector您使用的算法部分是非确定性的.单词向量的初始化是确定性的 - 参见代码seeded_vector,但是当我们进一步观察时,即单词的随机采样,负采样(每次迭代仅更新单词向量的样本)可能导致非确定性输出(感谢@gojomo).

    def seeded_vector(self, seed_string):
        """Create one 'random' vector (but deterministic by seed_string)"""
        # Note: built-in hash() may vary by Python version or even (in Py3.x) per launch
        once = random.RandomState(self.hashfxn(seed_string) & 0xffffffff)
        return (once.rand(self.vector_size) - 0.5) / self.vector_size
Run Code Online (Sandbox Code Playgroud)

  • @gojomo感谢你指出我太快的结论.我查看了关于`infer_vector`的github(https://github.com/RaRe-Technologies/gensim/issues/447)上的帖子,我更正了我的答案. (3认同)
  • 是的,但他们不应该太不同.如果它们是,你的模型可能是动力不足/过度装备,或者你的推断没有使用适当的"步骤"并开始"alpha".对于许多更多的"步骤"和/或更低的起始"alpha"更常见的是0.025的默认训练`alpha`更适合推理而不是默认值,尤其是在短文档上. (2认同)
  • 请注意,*不是*随机起始向量初始化会导致每次运行的结果不同——`seed_vector()` 函数确保相同的起始向量与 `seed_string` 相同,并且 `Doc2Vec.infer_vector()` 使用您推断为 `seed_string 的标记` 以一种确定性的方式。相反,它是算法的其他步骤,固有地使用单词、窗口大小或反例的随机采样。在这些步骤中也有强制确定性的方法,但这只是隐藏了算法的“抖动”。最好确保后续运行“足够相似”而不是“人为相同”。 (2认同)
  • 因此将步长增加到 500 并减少 alpha 和 min_alpha 显着导致一个一致结果的收敛。然而,结果还差得很远,看起来一点也不相似。图书馆出版商不提供任何建议或何时使用它。可能它不适合较小的文本文档或较小的文档集。 (2认同)
  • 与最新版本相同的观察结果 (2认同)