【问题标题】:Is there a way to save and load the vocabulary of a Gensim Doc2Vec model有没有办法保存和加载 Gensim Doc2Vec 模型的词汇表
【发布时间】:2019-05-23 15:14:11
【问题描述】:

编辑

训练语料库是我在此步骤之前构建的 Spark 数据框。我从 parquet 格式加载它并创建了一个“Feed”类,为 Gensim lib 提供火车语料库上的迭代器:

class Feed():
    def __init__(self, train_data):
        self.train_data = train_data

    def __iter__(self):
        for row in self.train_data.rdd.toLocalIterator():
            yield \
                gensim.models.doc2vec.TaggedDocument(\
                words=[kw.lower() for kw in row["keywords"]] + list(row["tokens_filtered"]),\
                tags=[row["id"]])


sdf = spark.read.parquet(save_dirname)
train_corpus = Feed(sdf)

结束编辑

我希望在大约 900 万个新闻文本文档上训练一个 Gensim Doc2Vec 模型。这是我的模型定义:

model = gensim.models.doc2vec.Doc2Vec(
        workers=8,
        vector_size=300,
        min_count=50,
        epochs=10)

第一步是获取词汇:

model.build_vocab(train_corpus)

90 分钟后结束。这是此过程结束时的日志记录信息:

INFO:gensim.models.doc2vec:collected 4202859 word types and 8950263 unique tags from a corpus of 8950339 examples and 1565845381 words
INFO:gensim.models.word2vec:Loading a fresh vocabulary
INFO:gensim.models.word2vec:min_count=50 retains 325027 unique words (7% of original 4202859, drops 3877832)
INFO:gensim.models.word2vec:min_count=50 leaves 1546772183 word corpus (98% of original 1565845381, drops 19073198)
INFO:gensim.models.word2vec:deleting the raw counts dictionary of 4202859 items
INFO:gensim.models.word2vec:sample=0.001 downsamples 9 most-common words
INFO:gensim.models.word2vec:downsampling leaves estimated 1536820314 word corpus (99.4% of prior 1546772183)
INFO:gensim.models.base_any2vec:estimated required memory for 325027 words and 300 dimensions: 13472946500 bytes

然后我在训练语料库上使用迭代器类训练模型:

model.train(train_corpus, total_examples=nb_rows, epochs=model.epochs)

最后的训练日志是:

INFO:gensim.models.base_any2vec:EPOCH 1 - PROGRESS: at 99.99% examples, 201921 words/s, in_qsize 16, out_qsize 0
INFO:gensim.models.base_any2vec:worker thread finished; awaiting finish of 7 more threads
INFO:gensim.models.base_any2vec:worker thread finished; awaiting finish of 6 more threads
INFO:gensim.models.base_any2vec:worker thread finished; awaiting finish of 5 more threads
INFO:gensim.models.base_any2vec:worker thread finished; awaiting finish of 4 more threads

但它永远不会完成剩余的线程。 这不是我第一次遇到这个问题,即使是小得多的火车语料库。通常,我会重新启动整个过程(词汇设置和模型训练),然后继续。

到现在为止,为了节省时间,我不想再次计算词汇表,将先前成功计算的词汇放在适当的位置,只尝试再次训练模型。有没有办法只保存模型的词汇部分,然后加载它以直接在训练语料库上训练模型?

【问题讨论】:

    标签: python pyspark gensim doc2vec


    【解决方案1】:

    就挂起的原因而言,看起来您通常都在做正确的事情,但您的 train_corpus 可能有问题,您尚未展示其构造。

    仔细检查其实现,并可能编辑您的问题以显示其类型/初始化的更多详细信息。查看日志以查看是否有证据表明任何线程遇到错误,导致它们处于未按要求返回报告的状态。

    您可以.save() Doc2Vec 模型的各个部分,例如 model.wv.save(wv_path) - 但没有简单的方法可以从这些子部分重建模型。 (这是可能的,但需要仔细注意对象的所需状态,从查看源代码开始,并且容易出错。)

    而且,更重要的是,您可以随时 .save() 完整的 Doc2Vec 模型 - 这可能是满足您需求的更好方法。也就是说,你可以在build_vocab()之后.save()它,或者在调用.train()等之后。

    如果实际上您当前的挂起是在某个笔记本中,您可以在其中中断挂起的操作,并在新单元格中执行新代码,您可能只需从那里保存模型,调试您的 train_corpus,然后重新加载& 重新训练——只要语料库大小/词汇与build_vocab() 中学到的相匹配。

    然而,这样一个训练有素的.save()最终会受到已经发生的几乎完全训练的影响。因此,最终结果将不仅仅是您的配置参数的真实反映,还包括大量的临时培训。

    如果您想在重新加载保存的Doc2Vec 模型后“清除”该部分训练的挥之不去的影响,我相信应该这样做:

    model.trainables.reset_weights(model.hs, model.negative, model.wv, model.docvecs)
    

    【讨论】:

    • 嗨,gojomo,谢谢。我会尝试在建立词汇表后保存模型,如果再次失败,我会在训练之前重置模型的权重。我编辑了问题以包括训练语料库的构建。如何从 gensim 获取更多日志以解释挂起?
    • ...而且我不明白火车语料库中有什么问题会产生这样的线程挂起。你有一些例子吗?
    • 我希望观看标准输出/标准错误控制台,以及您已经开始的 INFO 日志记录,以显示任何主要块 - 您只需梳理所有日志整个运行。 (您也可以尝试将 gensim 的日志级别设置为 DEBUG,但不确定是否会捕获任何其他相关信息。)我看到您使用的是 spark,这意味着可能会通过网络从许多来源收集数据——& 可能会引入其他可能的故障模式。因此,观看 spark 的日志记录/日志级别可能会有所帮助。您能否在 gensim 外部验证 train_corpus 将在重复迭代中提供 nb_rows 示例?
    • 当 toLocalIterator() 函数加载驱动程序中的每个 Spark 分区时,我增加了 Spark 驱动程序分配的内存(并减少了工作人员的内存),最后它工作了。但是,我不确定这是线程挂起的根本原因:同样的问题发生在很多小数据集(没有 Spark)上,如果我重新启动整个训练过程(包括词汇表),它工作得很好。如果 train 函数中有一个参数可以保存每个 epoch 之间的中间模型并允许在该点重新开始训练以防失败。
    • 无论如何,我将问题标记为已回答,因为您的提议可能是一个解决方案。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多