doc2vec 中推断向量和训练向量之间的不一致相似性

inconsistent similarity betwen inferred and trained vectors in doc2vec

我使用大量文本数据从gensim训练了一个段落向量模型。我做了下一个测试:我验证了任何句子的索引,然后为它推断了一个向量

>>> x=m.docvecs[18638]
>>> g=m.infer_vector("The seven OxyR target sequences analyzed previously and two new sites grxA at position 207 in GenBank entry M13449 and a second Mu phage mom site at position 59 in GenBank entry V01463 were used to generate an individual information weight matrix".split())

当我计算余弦相似度时,它非常低(预期相反)。

>>> 1 - spatial.distance.cosine(g, x)
0.20437437837633066

如果我做错了什么,有人可以告诉我吗?

谢谢

存储在模型 (m.docvecs[18638]) 中的段落向量是在训练阶段创建的,然后模型可能会随着其他段落用于训练而发生变化。使用 infer_vector(),您使用的是模型的最终状态。您可以尝试通过在训练阶段添加更多时期来最小化这种差异。

不过,我建议您始终使用 infer_vector(),这样您就可以确定,您所有的段落向量都是使用相同版本的模型创建的。

一些想法:

如果您的初始训练对文本示例进行了任何额外的预处理——比如大小写扁平化——您也应该对输入 infer_vector() 的标记进行预处理。

infer_vector() 的可选参数的 gensim 默认值,包括 steps=5alpha=0.1,是对许多 models/training 模式可能不足的粗略猜测。许多人报告了更好的结果,steps(数百)或较低的起始 alpha(更像是 0.025 的训练默认值)。

当模型本身 returns most_similar() 产生结果时,它会在单位长度归一化文档向量上进行所有余弦相似度计算。 – 也就是说,那些在需要时生成的 model.docvecs.doctag_syn0norm 数组中。然而,infer_vector() 返回的向量将只是原始的、未归一化的推断向量——类似于 model.docvecs.doctag_syn0 数组中的原始向量。如果计算您自己的余弦相似度,请务必考虑到这一点。 (我认为 spatial.distance.cosine() 解释了这一点。)

一般来说,为在批量训练期间训练文档向量的相同文本重新推断一个向量应该会产生一个非常相似(但不相同)的向量。因此,如果实际上 m.docvecs[18638] 与您在此处重新推断的文本完全相同,则距离应该非常小。 (这可以很好地 'sanity check' 判断训练过程和随后的推理是否具有预期的效果。)如果没有达到预期的相似性,您应该重新检查训练过程中是否进行了正确的预处理,即模型参数导致真正的训练发生,你指的是正确的训练向量 (18638),没有任何 off-by-one/etc 错误,等等。