位置编码

Transformer本身不处理序列顺序,位置编码为模型注入序列中元素的位置信息,是Transformer的重要组成部分。

共 3 篇文章·阅读时间:约35分钟

01为什么需要位置编码

自注意力机制本身是位置无关的,位置编码为模型提供了序列顺序信息。

位置信息的重要性

自然语言是序列数据,词的顺序影响语义。例如:

  • "狗咬人" vs "人咬狗" —— 顺序不同,意思相反
  • "我喜欢苹果" —— 可能是水果,也可能是手机品牌

但自注意力的计算是完全对称的:

自注意力的位置无关性

由于Q、K、V都是通过线性变换从输入得到, 如果输入的词序被打乱,输出也会以同样方式打乱, 模型无法区分"狗咬人"和"人咬狗"。

位置编码方案

类型代表方法特点
绝对位置编码Sinusoidal每个位置有唯一编码
可学习位置编码BERT作为参数学习
相对位置编码Shaw, T5编码相对距离
旋转位置编码RoPE绝对位置,相对效果

02正弦余弦位置编码

原始Transformer使用的位置编码,使用不同频率的正弦和余弦函数编码位置信息。

编码公式

对于位置 pos 和维度 i,编码值为:

PE(pos, 2i) = sin(pos / 100002i/d)

PE(pos, 2i+1) = cos(pos / 100002i/d)

性质与优点

编码性质

- 每个位置的编码是唯一的
- 不同位置的编码存在线性关系
- 可以推广到任意长度的序列

相对位置特性

由于正弦函数的线性组合性质, PE(pos+k) 可以表示为 PE(pos) 的线性函数, 使得模型能够轻松学习相对位置关系。

可推广性

训练时未见过的位置也可以得到有效的编码, 因为正弦函数可以计算任意位置的值。

注意:现代大模型如LLaMA、GLM等已转向使用RoPE, 因为RoPE在处理长序列时表现更好。

03旋转位置编码RoPE

RoPE(Rotary Position Embedding)是一种相对位置编码,通过旋转操作将位置信息注入到Query和Key中。

RoPE原理

RoPE的核心思想是将位置信息编码为旋转矩阵,通过旋转Q和K向量来实现位置感知。

二维情况

对于二维向量 (q0, q1),位置m的旋转为:

Rm(q) = (cos(mθ) -sin(mθ); sin(mθ) cos(mθ)) · (q0; q1)

内积性质

经过精心设计,旋转后的Q和K的内积只与相对位置有关:

Rm(q) · Rn(k) = q · k · f(m-n)

这意味着RoPE天然编码了相对位置信息

RoPE的优势

相对位置编码

自然地编码相对位置,内积只依赖于相对位置而非绝对位置。

长序列友好

不需要像绝对位置编码那样预定义最大长度, 可以处理任意长度的序列(受限于上下文窗口)。

计算高效

旋转操作可以通过复数乘法或矩阵乘法高效实现, 计算开销可接受。

广泛采用

LLaMA、GLM、Qwen、Mistral、DeepSeek等主流大模型都使用RoPE。

RoPE变体

  • Linear RoPE:优化旋转计算,支持更长上下文
  • Yarn RoPE:调整RoPE的频率范围
  • RoPE + NTK:结合NTK技术扩展上下文
----