【问题标题】:Updating training documents for gensim Doc2Vec model更新 gensim Doc2Vec 模型的训练文档
【发布时间】:2017-12-12 14:56:40
【问题描述】:

我有一个现有的 gensim Doc2Vec 模型,我正在尝试对训练集以及模型进行迭代更新。

我拿新文件,照常进行预处理:

stoplist = nltk.corpus.stopwords.words('english')
train_corpus= []
for i, document in enumerate(corpus_update['body'].values.tolist()):
     train_corpus.append(gensim.models.doc2vec.TaggedDocument([word for word in gensim.utils.simple_preprocess(document) if word not in stoplist], [i]))

然后我加载原始模型,更新词汇表并重新训练:

#### Original model
## model = gensim.models.doc2vec.Doc2Vec(dm=0, size=300, hs=1, min_count=10, dbow_words= 1, negative=5, workers=cores)

model = Doc2Vec.load('pvdbow_model_6_06_12_17.doc2vec')

model.build_vocab(train_corpus, update=True)

model.train(train_corpus, total_examples=model.corpus_count, epochs=model.iter)

然后我通过附加新数据来更新训练集 Pandas 数据框,并重置索引。

corpus = corpus.append(corpus_update)
corpus = corpus.reset_index(drop=True)

但是,当我尝试将 infer_vector() 与 更新的 模型一起使用时:

inferred_vector = model1.infer_vector(tokens)
sims = model.docvecs.most_similar([inferred_vector], topn=len(model.docvecs))

结果质量很差,表明模型和训练集数据帧的索引不再匹配。

当我将它与 未更新 训练集数据框(再次使用更新后的模型)进行比较时,结果很好 - 不过,显然我错过了新文档。

无论如何都要更新两者,因为我希望能够在不完全重新训练模型的情况下对模型进行频繁更新?

【问题讨论】:

    标签: gensim doc2vec


    【解决方案1】:

    Gensim Doc2Vec 还没有官方支持扩展词汇表(通过build_vocab(..., update=True)),所以这里的模型行为没有定义为做任何有用的事情。事实上,我认为任何现有的 doc-tags 都将被完全丢弃并替换为最新语料库中的任何一个。 (此外,当尝试将update_vocab()Doc2Vec 一起使用时,还有未解决的内存故障进程崩溃报告,例如this issue。)

    即使这样可行,如果继续在文本与初始训练集不同的模型上调用 train(),仍需要考虑许多模糊的平衡问题。特别是,每次这样的训练课程都会推动模型在新示例上更好,但会失去原始训练的价值,可能会使模型在某些情况下或整体上变得更糟。

    随着语料库不断增长,最合理的策略是偶尔从头开始重新训练,将所有训练示例合并到一个语料库中。 my recent post to the gensim discussion list 中讨论了对模型进行滚动更新的可能过程的另一个大纲。

    您的设置中的其他一些 cmets:

    • 同时使用hierarchical-softmax (hs=1) 和负采样(negative > 0)会增加模型大小和训练时间,但与仅使用一种具有更多迭代次数的模式相比可能没有任何优势(或其他调整)——因此很少有两种模式都处于活动状态

    • 通过不指定 iter,您使用的是默认继承自 Word2Vec 的“5”,而已发布的 Doc2Vec 工作通常使用 10-20 次或更多次迭代

    • 许多报告 infer_vector 使用更高的可选参数 steps 的值(默认只有 5)和/或使用更小的 alpha 值(即默认为0.1)

    【讨论】:

    • 嗨@gojomo,你知道这是否仍然如此吗?或者 Gensim Doc2Vec 现在是否支持使用新文本更新模型?
    • 你总是可以从新文本中推断出文档向量,关于已知的单词。此外,您始终可以向模型发送新的训练文档,而它会忽略新的单词/标签,但仍然存在我提到的相对平衡/兼容性问题。但是通过 gensim-3.8.3 (current version as of September 2020), if you want to try to expand the Doc2Vec` 模型的词汇表,.build_vocab(..., update=True) 选项仍然没有经过测试,报告崩溃,并且受到与上述相同的平衡/兼容性问题。
    • 啊哈,这一切都说得通,@gojomo。非常感谢您的深入回答 - 它让事情变得一清二楚,非常感谢!
    猜你喜欢
    • 2018-07-31
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    相关资源
    最近更新 更多