gensim doc2vec 从预训练模型中训练更多文档

Posted

技术标签:

【中文标题】gensim doc2vec 从预训练模型中训练更多文档【英文标题】:gensim doc2vec train more documents from pre-trained model 【发布时间】:2018-07-31 14:04:25 【问题描述】:

我正在尝试使用预训练模型使用新的标记文档(TaggedDocument)进行训练。

预训练模型是经过训练的模型,其文档的唯一 id 为 label1_index,例如 Good_0、Good_1 到 Good_999 训练数据的总大小约为 7000

现在,我想用具有 label2_index 的唯一 id 的新文档训练预训练模型,例如,Bad_0、Bad_1... 到 Bad_1211 训练数据总大小约为1211

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

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

但是,上面的练习不会像从一开始就完全训练的那样起作用。

是继续火车无法正常工作还是我犯了一些错误?

【问题讨论】:

【参考方案1】:

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

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

但即使/何时可以实现,提供增量训练示例也不一定是一个好主意。通过只更新模型的一部分——那些由新示例执行的部分——整个模型可能会变得更糟,或者它的向量彼此之间的自洽性降低。 (这些密集嵌入模型的本质是,对所有不同示例的优化会产生普遍有用的向量。仅对某个子集进行训练会导致模型在该子集上趋于良好,在可能成本较早的例子。)

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

【讨论】:

你回答得很清楚,但很长。您是说新标签和 id 的训练不适用于预训练模型。我理解正确吗?另外,您在上面写的内容与 gensim 网站上的内容有所不同。它说,当您传递参数 update=True 时,新词也可能会被训练。 . .虽然我不确定它是否真的按照他们的指示工作。 正确:对train() 的新调用将不允许学习任何新单词/标签。只有build_vocab() 步骤建立了词汇表,&(如我的回答中所述)适用于某些Word2Vec 模型的update=True 选项尚未修复适用于Doc2Vec。 (即使/当它被修复时,使用它也可能不明智/不可靠,因为使用部分数据集进行增量训练会引入许多其他复杂性/权衡。) 感谢您的帮助!

以上是关于gensim doc2vec 从预训练模型中训练更多文档的主要内容,如果未能解决你的问题,请参考以下文章

如何从 gensim 模型中的 Doc2Vec 相似度分数访问文档详细信息?

Doc2vec:gensim doc2vec模型中只有10个docvecs?

Gensim Doc2vec 已训练,但未保存

gensim Doc2Vec vs tensorflow Doc2Vec

如何将 Gensim doc2vec 与预训练的词向量一起使用?

gensim简介