我从英文维基百科垃圾堆中提取了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)
我是不是犯了一些明显的错误?用错了吗?
但我认为在大多数情况下,我也可以用向量来缩小向量。
可寻址内存中所需的模型大小很大程度上取决于所需权重的数量、唯一单词和唯一doc标记的数量。在
使用145000000个独特的doc标记,无论您限制自己的单词数是多少,仅培训中的原始文档向量就需要:
你可以试试更小的数据集。你可以缩小向量的大小。你可以得到更多的记忆。在
我会先尝试其中的一个或多个,只是为了验证你是否能够让事情顺利进行,并取得一些初步的结果。在
有一个技巧,最好是实验性的,它可以训练更大的doc向量集,但代价是额外的复杂性和较低的性能:}。在
docvecs_mapfile
参数{通常,您不希望
Word2Vec
/Doc2Vec
样式的培训会话使用任何虚拟内存,因为任何使用较慢磁盘IO的方法都会使培训变得极其缓慢。但是,对于一个只按一个顺序迭代的大型doc集,在使用内存映射文件支持doc向量数组之后,性能可能会受到影响。基本上,每一个训练过程都会从一个字体到另一个文件进行扫描,一次读取每个部分,然后将其分页一次。在如果您提供一个
docvecs_mapfile
参数,Doc2Vec
将分配doc vectors数组作为磁盘文件的后盾。因此,磁盘上有一个数百GB的文件(最好是SSD),其范围根据需要被调入/调出RAM。在如果您尝试这样做,请确保首先在小型运行中试用此选项,以熟悉其操作,特别是在保存/加载模型方面。在
还要注意,如果对doc向量做了一个默认的
most_similar()
,那么必须从原始数组中创建另一个174GB的单位规范化向量数组。(您可以在调用任何其他需要单位赋范向量的方法之前显式地调用init_sims(replace=True)
调用,从而强制在适当的地方完成这项工作,删除现有的原始值。)相关问题 更多 >
编程相关推荐