Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python gensim-Doc2Vec:在英语维基百科上培训时的记忆错误_Python_Out Of Memory_Gensim_Doc2vec - Fatal编程技术网

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

Python gensim-Doc2Vec:在英语维基百科上培训时的记忆错误,python,out-of-memory,gensim,doc2vec,Python,Out Of Memory,Gensim,Doc2vec,我从英文维基百科的垃圾堆中提取了145185965个句子(14GB),我想根据这些句子训练一个Doc2Vec模型。不幸的是,我的内存“只有”32GB,在尝试训练时会出现内存错误。即使我将min_计数设置为50,gensim告诉我它需要超过150GB的RAM。我认为进一步增加min_计数不是一个好主意,因为生成的模型不是很好(只是一个猜测)。但不管怎样,我会用500块试试看内存是否足够 有没有可能用有限的内存来训练如此大的模型 这是我目前的代码: corpus = TaggedLineDocume

我从英文维基百科的垃圾堆中提取了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)
我是否犯了一些明显的错误?使用它完全错误


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

可寻址内存中所需的模型大小在很大程度上是所需权重数、唯一单词数和唯一文档标记数的函数

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

145,000,000 * 300 dimensions * 4 bytes/dimension = 174GB
您可以尝试更小的数据集。你可以减少向量的大小。你可以得到更多的记忆

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

有一个技巧,最好考虑是实验性的,它可以训练更大的文档向量集,但代价是额外的复杂性和更低的性能:
docvecs\u mapfile
Doc2Vec
参数

通常,您不希望使用
Word2Vec
/
Doc2Vec
式的培训会话来使用任何虚拟内存,因为任何对较慢磁盘IO的求助都会使培训极其缓慢。但是,对于仅以一个顺序迭代的大型文档集,在使文档向量数组由内存映射文件支持后,性能影响可能仍然存在。基本上,每个培训过程都会从字体到背面扫描文件,将每个部分读入一次,然后分页一次

如果您提供一个
docvecs\u mapfile
参数,
Doc2Vec
将分配要由磁盘文件上的doc vectors数组支持的doc vectors数组。因此,磁盘(理想情况下是SSD)上会有数百GB的文件,其范围会根据需要在RAM中进行分页

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


还请注意,如果您对文档向量执行默认的
most_similable()
,则必须从原始数组中创建另一个174GB的单位规范化向量数组。(在调用任何其他需要单位赋范向量的方法之前,通过显式调用
init_sims(replace=True)
调用,可以强制执行该操作,对现有的原始值进行删除。)

好的,感谢您的详细解释。因此,似乎造成巨大内存需求的主要原因是我每个句子都有一个标签。你认为如果我把它训练成整段或整篇文章,而不是句子,但仍然只使用句子进行推理,这也行吗?我猜不会,但也许我错了。你得试试。它可能很有效,甚至比短句更好。(Doc2Vec又名“段落向量”,最常与多句文本一起使用。)关于设置的单独说明:•大多数d2v工作使用10-20个培训通行证(不是课堂默认的5个,也不是你的
epochs=400
)您的模式,
dm=0
,不使用
窗口
或训练词向量(除非您还设置了
dbow\u words=1
)从来没有理由使用高的
alpha=0.75
(尽管在这里它是无害的,但是当你调用
train()
)时,会使用一个可感知的值)。我训练了一些模型,并在MS Reporthrase数据库中对它们进行了评估。结果还可以,但不是非常好(AUC约为0.7至0.75,EER约为0.3,平均精度约为0.85)。我认为用更多的数据进行训练会更好。我将尝试更小的向量,但现在有更大的训练数据集。你说alpha=0.75非常高。我用alpha=0.025和min_alpha=0.0001进行训练。这样更好吗?我使用了100个纪元,也许这太多了,尽管我发现一篇论文使用了400个纪元()有没有一种方法可以在不需要调用循环中的train的情况下每X个纪元保存一次模型?可能使用(未记录的)回调?除非使用多个
train()
调用,否则无法保存中期培训。(如果这样做,请小心选择
年代
和alpha值,以获得相同的总通过率/alpha衰减效应。)10-20次通过率更高,有时在小数据集上更高–Lau/Baldwin论文是一个离群值(虽然它有很多有用的评估,但它的方法/写作的其他方面对我来说似乎很困惑——请参阅评论,包括从:)开始的论坛帖子链接。是的,0.025到0.0001是默认/常见的alpha选择。