如何在 Gensim Doc2Vec 中不训练文档的情况下更改已保存模型的参数?

How to change parameters of saved model without training docs in Gensim Doc2Vec?

我按照此处给出的指南预处理我的文档、训练我的模型并保存它:https://radimrehurek.com/gensim/auto_examples/tutorials/run_doc2vec_lee.html

一段时间后,我想用不同的参数重新训练我的模型。但是,我不想预处理文档并再次创建“训练语料库”,因为这需要将近 3 天的时间。是否有一种解决方案可以轻松加载保存的模型、更改参数并使用这些新参数训练模型以用于以下代码:

model = Doc2Vec.load(myPath/myModel.doc2vec)
model = gensim.models.doc2vec.Doc2Vec(vector_size=300, min_count=2, epochs=40, dm=1, window=8)
model.build_vocab(train_corpus)
model.train(train_corpus, total_examples=model.corpus_count, epochs=model.epochs)

最佳。

首先,请注意,您当前代码的这一部分对加载的模型没有任何作用,因为它立即被第 2 行从从头开始:

model = Doc2Vec.load(myPath/myModel.doc2vec)
model = gensim.models.doc2vec.Doc2Vec(vector_size=300, min_count=2, epochs=40, dm=1, window=8)

其次,一般来说,您可以 .save() 一个模型 .build_vocab() 步骤之后,然后重新加载该模型以用于以后的多次训练.并且,可以直接更改大量模型参数,只需在训练前为它们分配新值(如 d2v_model.window = 10)即可影响它。例如:

d2v_model = Doc2Vec(vector_size=300, min_count=2, epochs=40, dm=1, window=8)
d2v_model.build_vocab(training_texts)
d2v_model.save(base_model_path)

然后,稍后:

d2v_model_w10 = Doc2Vec.load(base_model_path)
d2v_model_w10.window = 10
d2v_model_w10.train(training_texts, total_examples=d2v_model_w10.corpus_count, epochs=d2v_model_w10.epochs)

此修改 .build_vocab() 修改后应适用的一些模型参数包括:

  • window
  • sgWord2Vec)或dm/dbow_wordsDoc2Vec
  • negative(如果在正值之间变化)
  • workers
  • alphamin_alpha

但是,主要影响.build_vocab()步骤的参数,包括发现工作词汇表和分配起始向量,或预先计算基于词汇表的值,如果在 .build_vocab() 为 运行 之后修改, 不会 更改模型行为。其中一些参数包括:

  • vector_size(因为.build_vocab()的最后一步分配了向量)
  • min_countmax_final_vocabtrim_rule
  • hs(或在零和正数之间更改 negative
  • samplens_exponent(阈值表在.build_vocab中计算)

(在更专业的水平上, 可以在代价高昂的第一次词汇扫描之后但在最终步骤之前保存模型。这将允许加载-then-change 对于其中的大部分 - 但您应该查看 source for Doc2Vec.build_vocab() 以获得提示。您永远不必调用 .build_vocab(),而是自己调用扫描步骤,然后 .save()。然后在 .load() & 更改参数后,调用 .prepare_vocab() & .prepare_weights() 步骤。)

最后,与您的主要问题分开,如果您的语料库足够大,训练步骤需要 3 天,需要考虑一些事项:

  • epochs=40 可能过多 - 许多已发表的作品仅使用 10-20 个 epoch,而较小的训练集通常需要更多的 epoch。
  • 对于大型语料库,使用更大的 min_count 通常会缩小模型大小和训练时间,对质量没有影响,甚至可以提高质量(通过消除永远不会变得比噪声更多的稀有词)
  • 对于大型语料库,更积极(更小)的 sample 值可以节省大量时间,尤其是对于具有 Zipfian 词频的真实自然语言文本。 (高频词不需要如此多的冗余训练,因此更积极地跳过它们既可以节省时间,又可以提高相对注意力和稀有词的质量。)