python - gensim-Doc2Vec : MemoryError when training on english Wikipedia

标签 python out-of-memory gensim doc2vec

我从英语维基百科转储中提取了 145,185,965 个句子 (14GB),我想根据这些句子训练 Doc2Vec 模型。不幸的是,我“只有”32GB RAM,并且在尝试训练时出现MemoryError。即使我将 min_count 设置为 50,gensim 也会告诉我它需要超过 150GB 的 RAM。我认为进一步增加 min_count 不是一个好主意,因为生成的模型不会很好(只是猜测)。不过不管怎样,我会用500来尝试一下,看看内存是否足够。

是否有可能用有限的 RAM 来训练如此大的模型?

这是我当前的代码:

corpus = TaggedLineDocument(preprocessed_text_file)
model = Doc2Vec(vector_size=300, 
                window=15, 
                min_count=50,  #1
                workers=16, 
                dm=0, 
                alpha=0.75, 
                min_alpha=0.001, 
                sample=0.00001,
                negative=5)
model.build_vocab(corpus)
model.train(corpus, 
            epochs=400, 
            total_examples=model.corpus_count, 
            start_alpha=0.025, 
            end_alpha=0.0001)

我可能犯了一些明显的错误吗?使用完全错误吗?

我也可以尝试减小向量大小,但我认为这会导致更糟糕的结果,因为大多数论文都使用 300D 向量。

最佳答案

可寻址内存中所需的模型大小很大程度上取决于所需权重的数量、唯一单词和唯一文档标签的数量。

拥有 145,000,000 个独特的文档标签,无论您限制自己使用多少个单词,仅训练中的原始文档向量就需要:

145,000,000 * 300 dimensions * 4 bytes/dimension = 174GB

您可以尝试较小的数据集。您可以减小矢量大小。你可以获得更多内存。

我会首先尝试其中的一个或多个,只是为了验证您是否能够让事情正常运行并获得一些初步结果。

有一个技巧,最好考虑为实验性的,它可能有助于训练更大的文档向量集,但代价是额外的复杂性和较低的性能:Doc2Vec 的 docvecs_mapfile 参数.

通常情况下,您不希望 Word2Vec/Doc2Vec 式的训练 session 使用任何虚拟内存,因为任何对较慢磁盘 IO 的依赖都会使训练变得极其缓慢。然而,对于仅以一个顺序迭代的大型文档集,在使文档向量数组由内存映射文件支持后,性能损失可能是可以克服的。本质上,每次训练都会从头到尾扫描文件,读取每个部分一次并分页一次。

如果您提供 docvecs_mapfile 参数,Doc2Vec 将分配由该磁盘文件支持的 doc-vectors 数组。因此,您将在磁盘(最好是 SSD)上有一个数百 GB 的文件,其范围根据需要调入/调出 RAM。

如果您尝试此操作,请务必先在小规模运行中尝试此选项,以熟悉其操作,尤其是在保存/加载模型方面。

另请注意,如果您对文档向量执行默认的 most_similar(),则必须从原始数组创建另一个 174GB 单位标准化向量数组。 (您可以通过在调用任何其他需要单位范数向量的方法之前显式调用 init_sims(replace=True) 调用来强制就地完成此操作,从而破坏现有的原始值。)

关于python - gensim-Doc2Vec : MemoryError when training on english Wikipedia,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50390455/

相关文章:

python - 无法导入 random.randint

python - 这个程序在逻辑上是错误的还是有我似乎找不到的语法?

python - 优化 Gensim word mover 的速度距离函数 (wmdistance)

python - 如何通过 gensim 将训练集的分布保存在经过训练的 LDA 模型上?

python - Word2vec 模型尺寸很小,无法识别单词

python - OpenAI gym mujoco ImportError : No module named 'mujoco_py.mjlib'

python - 如何列出 dict.items() 中所有可能的 3 个字母组合?

c# - 使用 EmguCV QueryGrayFrame() 处理视频时如何修复此内存不足异常

c# - 如何预测内存不足?

java - 在 Spring Batch 中,ThreadPoolTask​​Executor 引用不会被垃圾回收