Representing The Order of The Sequence Using Positional Encoding
正如我们到目前为止所描述的那样,模型中缺少的一件事是解释输入序列中单词顺序的方法。
为了解决这个问题,transformer 在每个输入嵌入中添加一个矢量。这些向量遵循模型学习的特定模式,这有助于它确定每个单词的位置,或序列中不同单词之间的距离。这里的直觉是,将这些值添加到嵌入中,一旦它们投射到Q/K/V矢量中,并在点积 attention 期间,嵌入向量之间会提供有意义的距离。
如果我们假设嵌入的维数为4,那么实际的位置编码将是这样的
这个模式会是什么样子呢?
在下面的图中,每一行对应一个向量的位置编码。所以第一行就是我们对输入序列中第一个单词的嵌入加上的向量。每行包含512个值,每个值在1到-1之间。我们对它们进行了颜色编码,这样图案就可以看到了。
本文描述了位置编码的公式(第3.5节)。您可以在 get_timing_signal_1d() 中看到生成位置编码的代码。这不是位置编码的唯一可能方法。然而,它的优点是能够扩展到看不见的序列长度(例如,如果我们训练的模型被要求翻译一个比我们训练集中的任何句子都长的句子)。
上面显示的位置编码来自Transformer的Tensor2Tensor实现。该方法并不是直接连接,而是将两个信号交织在一起,因此略有不同。下图显示了它的样子。下面是生成它的代码
Reference
https://jalammar.github.io/illustrated-transformer/