gensim doc2vec训练更多来自预训练模型的文件

时间:2018-02-21 04:45:14

标签: gensim doc2vec pre-trained-model resuming-training

我正在尝试使用预先训练过的模型训练带有新标签的文件(TaggedDocument)。

预训练模型是经过训练的模型,其中包含带有label1_index的唯一id的文档,例如Good_0,Good_1到Good_999 并且训练数据的总大小约为7000

现在,我想用新文档训练预训练模型,其中唯一ID为label2_index,例如Bad_0,Bad_1 ...到Bad_1211 并且训练数据的总大小约为1211

火车本身没有任何错误成功,但问题是每当我尝试使用'most_similar'时,它只会建议标有Good _...的类似文件,我希望标有Bad _。

如果我从一开始就完全训练,它会给我我预期的答案 - 它会推断出一个新的给定文件,类似于标记为好或坏。

然而,上述做法不会像从一开始就完全训练一样。

继续列车不能正常工作还是我犯了一些错误?

1 个答案:

答案 0 :(得分:1)

gensim Doc2Vec类总是可以通过train()提供额外的示例,但它只会在初始build_vocab()步骤中发现word-tokens和document-tags的工作词汇。因此,除非在build_vocab()期间提供了单词/标签,否则它们将在以后被忽略。 (单词从文本中默默地删除;标签在模型中没有被训练或记住。)

Word2Vec借用了很多功能的Doc2Vec超类在其build_vocab() update上有一个更新,更实验的参数,名为build_vocab()。如果设置为true,则对Doc2Vec的调用将添加而不是替换任何先前的词汇表。但是,截至2018年2月,此选项尚未与most_similar()一起使用,并且确实经常导致内存故障崩溃。

但即使可以使这个工作起作用,提供增量培训的例子并不是一个好主意。通过仅更新模型的部分 - 由新示例执行的部分 - 整体模型可能变得更糟,或者其向量彼此不一致。 (这些密集嵌入模型的本质是,对所有所有不同的例子进行优化会产生通常有用的向量。仅仅对某些子集进行训练会导致模型偏向于只对该子集有益,可能会花费早期的例子。)

如果您需要新示例也成为Doc2Vec结果的一部分,您可能需要在most_similar()之外创建自己独立的矢量集。当您推断新文本的新向量时,您可以将它们添加到该外部集合中,然后实现您自己的Doc2Vec(使用gensim代码作为模型)来搜索这个不断扩展的向量集,而不仅仅是由初始批量{{1}}培训创建的固定集。