• 为什么需要位置编码:因为计算注意力中,没有区分词的顺序,没办法区分 “你爱我”和“我爱你”,位置编码就来解决这一问题

  • 为什么不直接使用顺序编码,比如1 2 3 4 5 6,序列太长影响,并且不能固定序列长度

Transformer位置编码

第 pos 个 token 的输入 = 第 pos 个 token 的词向量 + 第 pos 个位置的位置编码向量

PositionalEncoding是个什么计算:

  • :单词在序列中的位置
  • :词向量的维度(固定值)
  • :位置编码向量中的维度索引,范围在 位置编码向量的维度是成对设计的:偶数维用 ,奇数维用 。所以 只需要遍历前一半的索引,就能生成长度为 的完整位置编码向量。

推导过程

目的是寻找到式子满足:pos+k的位置编码可以由于pos的位置线性表示就行

从论文已知

可以合并为矩阵写法

从数学上看,在固定 的情况下,较小的 对应更高频的变化,位置编码随位置变化更快,因此更侧重刻画局部位置信息;较大的 对应更低频的变化,位置编码变化更平缓,因此更适合表达全局位置信息

举个例子

序列长度为 4,词向量维度为 4。

这里 ,所以

于是:

  • 第 0 维:
  • 第 1 维:
  • 第 2 维:
  • 第 3 维:

所以 4 个位置 的位置编码矩阵为:

近似数值是:

ROPE位置编码

Transformer原生词向量算法的问题:位置权重直接累加在词向量上,污染了语义,分不清是哪一部分

结果 = 纯语义*纯语义+噪声1+噪声2+纯相对位置

核心思想:位置权重加法改为了旋转

很纯净

推导过程

已知逆时针旋转矩阵

且如果是第 个词,就逆时针旋转 个角度;第 个词,就逆时针旋转 个角度。

假设原始向量是 ,旋转后的向量分别是

已知注意力公式,点积注意力分数(未缩放)

缩放后的注意力分数

Softmax 归一化之后的注意力权重矩阵

Scaled Dot-Product Attention 输出

则有

假设

并且

最终

这样一个对焦块的形式

举个例子