bert中为什么使用nn.Embedding层进行位置编码?

问题描述 投票:0回答:1

bert模型的huggingface实现中,使用nn.Embedding进行位置嵌入。 为什么使用它而不是变压器论文中描述的传统正弦/余弦位置嵌入?这两件事怎么相同?

我也对 nn.Embedding 层感到困惑?有很多词嵌入,例如 word2vec、glove。其中哪个实际上是nn.Embedding层?您能详细解释一下 nn.Embedding 的内部结构吗? 这个问题也出现在我的脑海里。

pytorch nlp huggingface-transformers bert-language-model word-embedding
1个回答
0
投票

nn.Embedding
只是一个向量表。它的输入是表的索引。其输出是与输入的索引相关联的向量。从概念上讲,它相当于将 one-hot 向量乘以一个矩阵,因为结果只是 one-hot 输入选择的矩阵内的向量。

BERT 基于 Transformer 架构。 Transformer 架构需要将位置信息添加到普通令牌中,以便区分每个令牌所在的位置。 Transformer 架构原始公式中的位置信息可以通过 2 种不同的方式合并(两者都具有相同的性能数字):

  • 静态正弦向量:位置嵌入是预先计算的。
  • 训练的位置嵌入:位置嵌入是学习的。

BERT 文章的作者决定采用经过训练的位置嵌入。无论如何,在这两种情况下,位置编码都是使用普通嵌入层来实现的,其中表的每个向量都与输入序列中的不同位置相关联。

更新

位置嵌入与词嵌入没有本质区别。唯一的区别在于他们的训练方式。

在词嵌入中,您获得向量,以便可以使用它们来预测训练数据中与向量单词接近的其他单词。

在位置嵌入中,表的每个向量都与表示令牌位置的索引相关联,并且您训练嵌入,以便与特定位置关联的向量在添加到该位置的令牌嵌入时对任务有帮助模型经过训练(BERT 的 masked LM,原始 Transformer 的机器翻译)。

因此,位置嵌入最终会得到取决于位置的信息,因为位置嵌入向量是根据其将用于的标记的位置来选择的,并且已经过训练以对任务有用。

后来,Transformer 文章的作者发现他们可以简单地设计一个“静态”(未经训练)版本的嵌入(即正弦嵌入),从而减少要存储的模型的总大小。在这种情况下,预先计算的位置向量中的信息以及学习到的标记嵌入足以使模型达到相同的性能水平(至少在机器翻译任务中)。

© www.soinside.com 2019 - 2024. All rights reserved.