【问题标题】:inconsistent similarity betwen inferred and trained vectors in doc2vecdoc2vec 中红外和训练向量之间的相似性不一致
【发布时间】:2017-05-10 00:49:37
【问题描述】:

我使用大量文本数据从 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

如果我做错了什么,谁能告诉我?

谢谢

【问题讨论】:

    标签: python gensim doc2vec


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      一些想法:

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

      infer_vector() 的可选参数的 gensim 默认值,包括steps=5alpha=0.1,是疯狂的猜测,对于许多模型/训练模式来说可能是不够的。许多人报告了更高的steps(达到数百个)或更低的起始alpha(更像是0.025的训练默认值)的更好结果。

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

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

      【讨论】:

        猜你喜欢
        • 2018-01-21
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 2019-04-29
        • 2020-09-14
        • 2019-11-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多