【问题标题】:Memory efficiently loading of pretrained word embeddings from fasttext library with gensim使用 gensim 从 fasttext 库中有效加载预训练词嵌入的内存
【发布时间】:2019-12-11 09:29:46
【问题描述】:

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

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

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

  • cc.de.300.vec (4.4 GB)
  • cc.de.300.bin (7 GB)

Gensim 提供以下两种加载 fasttext 文件的选项:

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

    • 从 Facebook 的原生 fasttext 加载隐藏输入的权重矩阵 .bin 输出文件。
    • load_facebook_model() 加载完整模型,而不仅仅是 词嵌入,并使您能够继续模型训练。
  2. gensim.models.fasttext.load_facebook_vectors(path, encoding='utf-8')

    • 从以 Facebook 的原生 fasttext .bin 格式保存的模型加载词嵌入。
    • load_facebook_vectors() 仅加载词嵌入。它更快,但无法让您继续训练。

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

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

是否可以从磁盘加载这些大型模型以提高内存效率?

【问题讨论】:

    标签: python nlp gensim word-embedding fasttext


    【解决方案1】:

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

    • 一旦你开始对这些向量进行最常见的操作——找到目标词/向量的 most_similar() 词的列表——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)
    

    因为这些向量通常被排序以将出现频率较高的词放在首位,所以通常丢弃低频词的长尾并不是什么大损失。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2019-10-27
    • 2019-11-26
    • 2019-12-30
    • 1970-01-01
    相关资源
    最近更新 更多