Vector 如何将BERT单词嵌入保存为.vec类似于word2vec

Vector 如何将BERT单词嵌入保存为.vec类似于word2vec,vector,word2vec,word-embedding,glove,torchtext,Vector,Word2vec,Word Embedding,Glove,Torchtext,我想使用生成的BERT单词嵌入作为在Torchtext中构建vocab的向量 我可以加载向量,如手套或word2vec 但是我不知道如何将单词embedding从BERT保存到Torchtext vocab可以接受的格式 当我尝试这个代码时 txt_field.build_vocab(train, vectors=bertVec) 我得到这个错误: ValueError: Got input vectors of type <class 'torch.Tensor'>, expec

我想使用生成的BERT单词嵌入作为在Torchtext中构建vocab的向量 我可以加载向量,如手套或word2vec 但是我不知道如何将单词embedding从BERT保存到Torchtext vocab可以接受的格式

当我尝试这个代码时

txt_field.build_vocab(train, vectors=bertVec)
我得到这个错误:

ValueError: Got input vectors of type <class 'torch.Tensor'>, expected str or Vectors object
ValueError:获取类型为的输入向量,应为str或vectors对象

没有直接的方法为BERT嵌入创建Vocab

原因如下:

  • 若你们看一下Mikolv或GLOVE的嵌入,那个么在一个庞大的数据集上计算出的只是单词嵌入。对于Mikolov的嵌入,您有大约300万个单词及其嵌入。 然而,BERT使用单词片段嵌入,其vocab中大约有30000个单词片段
  • 现在您可以考虑计算单词块嵌入。是的,从技术上讲,你必须能够做到这一点。然而,对于伯特来说,你不能。这是因为,在Mikolov或Glove的情况下,嵌入向量仅基于单词,并且取决于计算嵌入值时影响的上下文。但是,对于BERT,嵌入基于3个因素:
  • 单词(-piece)嵌入
  • 位置嵌入和
  • 段嵌入
  • 因此,同一个单词“Hello”可能会根据它出现在句子的哪个位置而有不同的嵌入,这是受位置嵌入的影响


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

    谢谢你的回复,但我不明白你所说的“嵌入段”是什么意思。丁伯特在两个任务上接受了训练,即,掩蔽语言模型和下一个句子预测任务。为了训练下一个句子预测任务,它保持了段嵌入。来自同一句子(段)的两个tok将具有相同的段嵌入(理想情况下,来自同一段的所有标记将具有相同的段嵌入)。本文实际上解释了嵌入的细节。