位置编码
Transformer本身不处理序列顺序,位置编码为模型注入序列中元素的位置信息,是Transformer的重要组成部分。
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技术扩展上下文