首页 > 解决方案 > 如何将 BERT 词嵌入保存为 .vec,类似于 word2vec

问题描述

我想使用生成的 BERT 词嵌入作为在 Torchtext 中构建词汇的向量 我可以加载诸如 GloVe 或 word2vec 之类的向量,但我不知道如何将 BERT 中的词嵌入保存为 Torchtext 词汇可接受的格式

当我尝试这段代码时

txt_field.build_vocab(train, vectors=bertVec)

我收到此错误:

ValueError: Got input vectors of type <class 'torch.Tensor'>, expected str or Vectors object

标签: vectorword2vecword-embeddingglovetorchtext

解决方案


没有直接的方法可以为 BERT 嵌入创建词汇。

下面是原因:

  1. 如果您查看 Mikolv 或 GLOVE 的嵌入,就会发现只有在庞大的数据语料库上计算出的词嵌入。对于 Mikolov 的嵌入,您有大约 300 万个单词及其嵌入。然而,BERT 使用 word-piece 嵌入,其词汇中大约有 30K word-piece。
  2. 现在您可能会想到计算 word-piece 嵌入。是的,从技术上讲,您必须能够做到。但是,对于 BERT,你不能。这是因为,在 Mikolov 或 Glove 的情况下,嵌入向量仅基于单词,并且取决于在计算嵌入值时影响的上下文。但是,对于 BERT,嵌入基于 3 个因素:
    1. WORD(-piece) 嵌入,
    2. 位置嵌入和
    3. 段嵌入。

所以,同一个词“Hello”,可能会根据它出现在句子的哪个位置而有不同的嵌入,这是受位置嵌入的影响。

因此,使用 BERT 为单词构建词汇表可能是不可能的,因为相同的单词可能采用不同的嵌入。


推荐阅读