1

我使用默认设置的 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

这些不加起来,所以我想知道我在误解什么。

4

1 回答 1

2

infer_vector()不结合给定标记的向量 - 在某些模式下根本不考虑这些标记的向量。

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

使用类似训练的过程,它试图为X找到一个好的向量。也就是说,它从一个随机向量开始(就像它对原始训练中的所有标签所做的那样),然后查看该向量作为模型输入对文本单词的预测效果(通过检查模型神经网络对输入X的预测)。然后通过增量梯度下降,它使X的候选向量在预测文本单词方面越来越好。

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

注意:

  • 微小的例子(比如一个或几个词)不太可能给出非常有意义的结果——它们是尖锐的极端情况,这些密集嵌入表示的本质价值通常来自于许多词影响的边际平衡
  • infer_vector()与默认值相比,它可能有助于进行更多的训练推理周期steps=5——有些人报告了数十或数百个最适合他们的工作,并且在短文本steps中使用更多可能特别有价值steps
  • 它也可能有助于使用alpha更类似于批量训练中使用的起始推理 ( alpha=0.025),而不是infer_vector()默认的 ( alpha=0.1)
于 2017-05-24T17:16:06.430 回答