我正在使用gensim框架中的doc2vec模型来表示1550万个简短文档(最多300个单词)的语料库:

gensim.models.Doc2Vec(sentences, size=400, window=10, min_count=1, workers=8 )

创建矢量后,有超过18000000个矢量表示单词和文档。

我想找到给定项目最相似的项目(单词或文档):
 similarities = model.most_similar(‘uid_10693076’)

但是当计算相似度时出现MemoryError:
Traceback (most recent call last):

   File "article/test_vectors.py", line 31, in <module>
    similarities = model.most_similar(item)
  File "/usr/local/lib/python2.7/dist-packages/gensim/models/word2vec.py", line 639, in most_similar
    self.init_sims()
  File "/usr/local/lib/python2.7/dist-packages/gensim/models/word2vec.py", line 827, in init_sims
    self.syn0norm = (self.syn0 / sqrt((self.syn0 ** 2).sum(-1))[..., newaxis]).astype(REAL)

我有一台具有60GB Ram和70GB交换空间的Ubuntu计算机。我检查了内存分配(在htop中),发现没有完全使用内存。我还将python中可能锁定在内存中的最大地址空间设置为无限制:
resource.getrlimit(resource.RLIMIT_MEMLOCK)

有人可以解释此MemoryError的原因吗?我认为可用内存应该足以进行此计算。可能是python或OS中的一些内存限制吗?

提前致谢!

最佳答案

该模型的syn0数组的18M向量* 400维* 4字节/浮点数= 28.8GB(训练的向量)

syn1数组(隐藏权重)也将为28.8GB,即使syn1确实不需要doc-vector的条目,在训练过程中也不是目标预测。

词汇结构(vocab dict和index2word表)可能会增加另一个GB或更多。这就是您所有的60GB RAM。

用于相似度计算的syn0norm数组将需要另外28.8GB,总使用量约为90GB。这是在syn0norm创建过程中遇到的错误。但是,即使syn0norm创建成功,那么深入虚拟内存也可能会破坏性能。

某些步骤可能会有所帮助:

  • 使用至少2的min_count:一次出现的单词不太可能贡献很大,但可能会占用大量内存。 (但是由于单词只占syn0的一小部分,因此只会节省一点。)
  • 在训练之后但在触发init_sims()之前,请丢弃syn1数组。您将无法进行更多的训练,但是仍然可以访问现有的word/doc矢量。
  • 经过训练后,但在调用most_like()之前,请使用replace = True参数自己调用init_sims(),以丢弃未归一化的syn0并将其替换为syn0norm。同样,您将无法进行更多的训练,但是您将保存syn0内存。

  • 正在进行的将文档和单词向量分离出来的工作(最终将在版本0.11.1之后的gensim中出现)最终也应会有所缓解。 (它将syn1缩小为仅包含单词条目,并允许doc-vectors来自文件支持的(具有内存映射的)数组。)

    关于python - Doc2vec MemoryError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30488695/

    10-09 03:53