doc2vec.infer_vector如何跨文字组合?

时间:2017-05-24 16:24:45

标签: python gensim doc2vec

我使用train(..)训练了一个doc2vec模型,默认设置。这有用,但现在我想知道infer_vector如何在输入单词中组合,它只是单个单词向量的平均值吗?

model.random.seed(0)
model.infer_vector(['cat', 'hat'])
model.random.seed(0)
model.infer_vector(['cat'])
model.infer_vector(['hat']) #doesn't average up to the ['cat', 'hat'] vector
model.random.seed(0)
model.infer_vector(['hat'])
model.infer_vector(['cat']) #doesn't average up to the ['cat', 'hat'] vector

那些没有加起来,所以我想知道我误解了什么。

1 个答案:

答案 0 :(得分:2)

infer_vector()没有组合给定令牌的向量 - 在某些模式下根本不考虑那些令牌的向量。

相反,它将整个Doc2Vec模型视为针对内部更改冻结,然后假定您提供的标记是示例文本,具有先前未经过训练的标记。我们称之为隐含但未命名的标签 X

使用类似训练的过程,它会尝试为 X 找到一个好的向量。也就是说,它以随机向量开始(就像它对原始训练中的所有标签所做的那样),然后看到作为模型输入的向量如何预测文本的单词(通过检查模型神经网络对输入的预测 X )。然后通过增量梯度下降,它使 X 的候选矢量更好,更好地预测文本的单词。

经过足够的这种推理训练后,矢量将与预测文本的单词一样好(给定其余的冻结模型)。因此,即使您将该文本作为方法的“输入”提供,但在模型内部,您提供的内容用于选择算法的目标“输出”以进行优化。

请注意:

  • 微小的例子(比如一个或几个词)不太可能给出非常有意义的结果 - 它们是尖锐的边角情况,这些密集的嵌入表示的基本价值通常来自于许多边际平衡字影响
  • 它可能有助于进行比infer_vector()默认steps=5更多的训练推理周期 - 有些人报告了数十或数百steps最适合他们,并且可能是使用更多steps短文
  • 特别有价值
  • 使用起始alpha进行推理更有助于批量训练(alpha=0.025),而不是infer_vector()默认(alpha=0.1)< / LI>