使用 gensim 从 fasttext 库中高效地加载预训练词嵌入的内存

Memory efficiently loading of pretrained word embeddings from fasttext library with gensim

我想使用 gensim 从 fasttext 库加载预训练的多语言词嵌入;这里 link 到嵌入:

https://fasttext.cc/docs/en/crawl-vectors.html

特别是,我想加载以下词嵌入:

Gensim 提供了以下两种加载快速文本文件的选项:

  1. gensim.models.fasttext.load_facebook_model(path, encoding='utf-8')

    • Load the input-hidden weight matrix from Facebook’s native fasttext .bin output file.
    • load_facebook_model() loads the full model, not just word embeddings, and enables you to continue model training.
  2. gensim.models.fasttext.load_facebook_vectors(path, encoding='utf-8')

    • Load word embeddings from a model saved in Facebook’s native fasttext .bin format.
    • load_facebook_vectors() loads the word embeddings only. Its faster, but does not enable you to continue training.

来源 Gensim 文档: https://radimrehurek.com/gensim/models/fasttext.html#gensim.models.fasttext.load_facebook_model

由于我的笔记本电脑只有 8 GB 内存,我继续收到 MemoryErrors 或加载需要很长时间(最多几分钟)。

是否有选项可以更有效地从磁盘加载这些大型模型?

由于向量通常至少需要与其磁盘存储一样多的可寻址内存,因此将这些向量的全功能版本加载到只有 8GB RAM 的机器中将是一项挑战。特别是:

  • 一旦你开始对这些向量进行最常见的操作——找到目标 most_similar() 单词的列表 word/vector——gensim 实现也会想要缓存一个一组已归一化为单位长度的词向量——这几乎是所需内存的两倍

  • gensim 的 FastText 支持的当前版本(至少通过 3.8.1)也在一些不必要的分配上浪费了一些内存(尤其是在全模型情况下)

如果您只使用向量而不进行进一步训练,您肯定只想使用 load_facebook_vectors() 选项。

如果您愿意放弃模型为词汇外单词合成新向量的能力,在训练期间没有看到,那么您可以选择只加载来自纯文本 .vec 文件。例如,只加载第一个 500K 向量:

from gensim.models.keyedvectors import KeyedVectors
KeyedVectors.load_word2vec_format('cc.de.300.vec', limit=500000)

因为通常对此类向量进行排序以将更频繁出现的词放在最前面,所以通常丢弃低频词的长尾并不是什么大损失。