gensim Doc2Vec:英语维基百科培训时的记忆错误

2024-04-26 01:36:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我从英文维基百科垃圾堆中提取了145185965个句子(14GB),我想基于这些句子训练一个Doc2Vec模型。不幸的是,我只有32GB的内存,在训练时内存错误。即使我把min_计数设置为50,gensim告诉我它需要超过150GB的RAM。我不认为进一步增加min_计数是个好主意,因为结果模型不是很好(只是猜测)。但不管怎样,我会用500来试试,看看内存是否足够。

有没有可能用有限的内存训练这么大的模型?

以下是我当前的代码:

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)

我是不是犯了一些明显的错误?用错了吗?

但我认为在大多数情况下,我也可以用向量来缩小向量。


Tags: 内存模型alphamodelcount错误corpusmin
1条回答
网友
1楼 · 发布于 2024-04-26 01:36:44

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

使用145000000个独特的doc标记,无论您限制自己的单词数是多少,仅培训中的原始文档向量就需要:

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

你可以试试更小的数据集。你可以缩小向量的大小。你可以得到更多的记忆。在

我会先尝试其中的一个或多个,只是为了验证你是否能够让事情顺利进行,并取得一些初步的结果。在

有一个技巧,最好是实验性的,它可以训练更大的doc向量集,但代价是额外的复杂性和较低的性能:docvecs_mapfile参数{}。在

通常,您不希望Word2Vec/Doc2Vec样式的培训会话使用任何虚拟内存,因为任何使用较慢磁盘IO的方法都会使培训变得极其缓慢。但是,对于一个只按一个顺序迭代的大型doc集,在使用内存映射文件支持doc向量数组之后,性能可能会受到影响。基本上,每一个训练过程都会从一个字体到另一个文件进行扫描,一次读取每个部分,然后将其分页一次。在

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

如果您尝试这样做,请确保首先在小型运行中试用此选项,以熟悉其操作,特别是在保存/加载模型方面。在

还要注意,如果对doc向量做了一个默认的most_similar(),那么必须从原始数组中创建另一个174GB的单位规范化向量数组。(您可以在调用任何其他需要单位赋范向量的方法之前显式地调用init_sims(replace=True)调用,从而强制在适当的地方完成这项工作,删除现有的原始值。)

相关问题 更多 >