在 Transformer 模型中,为什么要将位置编码与嵌入相加而不是连接它?

数据挖掘 nlp 编码 变压器 注意机制
2021-10-13 01:00:46

在回顾 Transformer 架构时,我意识到了一些我没想到的事情,那就是:

  • 位置编码与词嵌入相加
  • 而不是连接到它。

位置编码与词嵌入相加

http://jalammar.github.io/images/t/transformer_positional_encoding_example.png

根据我看到的编码图,这意味着:

  • 嵌入的前几位完全不能被网络使用,因为位置编码会使它们失真很多,
  • 而嵌入中也有大量位置仅受位置编码的轻微影响(当您进一步靠近末端时)。

图表显示位置编码对第一个 logits 的影响很大,最后一个 logits 几乎没有

https://www.tensorflow.org/beta/tutorials/text/transformer_files/output_1kLCla68EloE_1.png

那么,为什么不使用更小的词嵌入(减少内存使用)和更小的位置编码,只保留最重要的编码位,而不是将词的位置编码相加,而是将其连接到词嵌入?

4个回答

连接时,您必须先验地定义要连接的每个向量的大小。这意味着,如果我们要连接令牌嵌入和位置嵌入,我们将必须定义二维,d 对于令牌和 dp 对于位置,具有总维数 d=d+dp, 所以 d>dd>dp. 我们将减少用于标记的总大小以支持位置信息。

然而,将它们加在一起可能是串联的一个超级案例:想象一下,有一个理想的分裂 d 进入 ddp在最小化损失方面;然后,训练可以收敛到位置向量,只需要d 元素,使其余为零,并且位置被学习并且发生相同,取互补 dp 元素,其余元素为零。

因此,通过添加它们,我们留下了使用的优化 d优化过程的维度,而不是假设存在向量分量的最佳分区并设置新的超参数进行调整。此外,向量空间的使用不受向量分量中硬分割的限制,而是占用整个表示空间。

所以问题是为什么位置嵌入直接添加到词嵌入而不是连接。这是一个特别有趣的问题。要回答这个问题,我需要首先区分 RNN 和 Transformer 等顺序网络之间的差异,然后很好地引入这个问题。

在 RNN 中,我们以顺序的方式将数据(比如说一系列单词)输入到模型中。这意味着在输入单词序列的上下文中,模型确实可以得到一个一个输入的标记顺序。

另一方面,使用转换器时,序列中的所有单词都会一次全部输入。这意味着,到目前为止,Transformer 没有任何词序的概念。因此,我们需要位置嵌入来告诉模型每个单词在序列中的位置。


我相信我们将它们添加到词嵌入的原因是因为我们希望在模型中保持与 RNN 类似的输入,它也将词嵌入作为其输入。我认为你的问题是一个很好的问题,也许你应该尝试使用更压缩的词嵌入及其位置嵌入,并将你的方法与更“传统”的方法进行比较,看看你会产生什么结果。我会很高兴见到他们。

已经有一段时间了,但我认为任何最终来到这里的人也可能对阅读以下论文感兴趣:

位置嵌入学到了什么?预训练语言模型位置编码的实证研究(Yu-An Wang, Yun-Nung Chen)

https://www.aclweb.org/anthology/2020.emnlp-main.555

我不会更改已接受的答案,因为本文并不具体。

嵌入的前几位完全不能被网络使用,因为位置编码会使它们失真很多

起初这让我非常困惑,因为我正在考虑使用预训练词嵌入的模型。然后该嵌入的任意初始块被位置编码严重篡改。

然而,至少在原始的 Transformer 模型中,嵌入是从头开始训练的,所以这并不适用。整体嵌入的初始块将用于位置信息,其余部分将用于单词信息。

这仍然不能解释为什么我们使用这种方法而不是连接 - 请参阅其他答案 - 但它确实解释了为什么该方法并不疯狂。

也就是说,我不知道,即使使用预训练的词嵌入,该方法也可能运行良好。如果是这样,那就很难解释了。