Transformer中的相对位置编码

最近要开始使用Transformer去做一些事情了,特地把与此相关的知识点记录下来,构建相关的、完整的知识结构体系。

以下是要写的文章,本文是这个系列的第二十二篇,需要前面文章的同学点击链接进入文章列表

Overall

今天看一篇稍微简单的知识,那就是相对位置编码,虽然知识内容比较简单,但是确是Transformer中不可或缺的一个知识点。

最初是的Transformer使用的是三角函数进行位置编码,生成的都是固定的编码。这些固定编码被当做位置编码传送给模型。

这些固定的编码有两个缺点:

  1. 固定,所以capacity可能不如学习到的embedding大。
  2. 无法发现相对关系,假设A和B有相关关系,A和B的相对位置不变,但绝对位置发生了变化,那么用固定编码则无法发现这个关系。

回顾Transformer

在Transformer中,经过attention层的值计算方式如下:

其中αij是权重,计算方式:

上面三个公式和原始的Transformer中的公式是等价的。

相对位置编码

相对位置编码为每个不同的位置对都定义了两个向量,分别是αijV和αijK。在计算的时候,将上面的公式进行修改。

为每个位置对定义两个向量还是无法完成提取相对位置信息的,而且,空间复杂度也是N^2,所以,为了泛化和节省时间复杂度,将每个位置对用位置的差来代替。

对应的公式如下:

k对应着窗口大小,超过窗口就按照窗口最远的那个值进行计算。

实验效果

在翻译任务上,尤其是EN-DE上效果有明显的提升。

(0)

相关推荐