【问题标题】:how to save BERT word embedding as .vec similar to word2vec如何将 BERT 词嵌入保存为 .vec,类似于 word2vec
【发布时间】:2019-11-17 10:43:46
【问题描述】:

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

当我尝试这段代码时

txt_field.build_vocab(train, vectors=bertVec)

我收到此错误:

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

【问题讨论】:

    标签: vector word2vec word-embedding glove torchtext


    【解决方案1】:

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

    原因如下:

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

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

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

    【讨论】:

    • 感谢您的回复,但我不明白您所说的 Segment embedding 是什么意思
    • Bert 在两个任务上进行训练,分别是 Masked 语言模型和下一句预测任务。为了训练下一句预测任务,它维护了段嵌入。来自同一个句子(片段)的两个标记将具有相同的片段嵌入(理想情况下,来自同一片段的所有标记都将具有相同的片段嵌入)
    • 论文中实际上解释了嵌入的细节。
    猜你喜欢
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2020-06-18
    • 2020-11-14
    • 2021-01-16
    • 2018-05-18
    • 1970-01-01
    • 2020-07-14
    相关资源
    最近更新 更多