我有超过3700万个句子的文档,并且我正在使用Gensim的Doc2Vec进行培训。模型训练适用于较小的数据集,例如5M-10M记录。但是,在对整个数据集进行训练时,该过程通常会在“重置图层权重”阶段终止。有时候,它死了。
我怀疑这是内存问题。我有16 GB的RAM和4核。如果确实是内存问题,有什么办法可以分批训练模型。通过阅读文档,在新文档没有新词汇的情况下,train()似乎很有用。但是,我的文档不是这种情况。
有什么建议吗?
答案 0 :(得分:0)
并不是使语料库的原始大小本身会使模型变大,而是要模型进行训练的唯一单词/文档标签的数量。
如果您使用的是3,700万个唯一文档,每个文档都有其自己的ID作为其文档标签,并且使用的是通用矢量大小(例如300个维度),则仅这些文档矢量就需要:
37 million * 300 dimensions * 4 bytes/dimension = 44.4 GB
唯一的单词和内部模型权重将需要更多的RAM,但不如这些具有正常大小的词汇量和合理选择min_count
的doc-vector来丢弃稀有单词。
Gensim支持的流式训练不需要为更大的语料库提供更多的内存,但是如果您想在同一模型中最终得到4,700万个300维向量,那么仍然需要大量可寻址内存。
您最好的选择是在适合可寻址内存的较小的,代表性的子集(可能只是随机子集)上训练模型。然后,当您需要其他文档的向量时,可以使用infer_vector()
一次计算一次,然后将它们存储在其他位置。 (但是,您仍然没有将它们全部存储在内存中,这对于进行most_similar()
或其他全语系比较的足够快速的扫描来说至关重要。)
使用具有大量RAM的机器可以更轻松地处理如此大的向量集。
(另一个可能的技巧是使用mapfile_path
参数-但除非您熟悉操作系统如何处理内存映射文件,并且了解如何进一步使用/转换大型docvecs-array,对于以后的操作,这可能会带来更多的麻烦,而且还涉及性能下降,这可能仅在您的文档具有单个唯一ID标签的情况下才可以容忍,因此对mmapped文件的访问方式为总是在训练和相似性中,以相同的原始顺序搜索简单的前后负载。有关更多详细信息,请参见this answer。