位置编码
概述
自注意力机制本质是对序列中所有token做加权平均,但它是位置无关的——交换两个token的位置,计算结果完全一样。而自然语言中词序非常重要,"我爱你"和"你爱我"意思完全不同。因此必须想办法向模型注入位置信息,这就是位置编码要解决的问题。
为什么需要位置编码
我们来看严格的推导:假设两个词向量 qm 在位置 m,kn 在位置 n。在没有位置信息时,注意力权重计算为:
a(m,n)=qm⋅kn
如果交换两个词的位置,变成 qn 在位置 m,km 在位置 n,点积还是 qn⋅km=qm⋅kn,注意力权重完全一样。也就是说,模型无法区分词的位置,不管两个词放在哪里,它们之间的注意力权重都一样。
这显然不对——我们期望两个词距离越近,注意力权重应该越大;距离越远,权重越小。位置编码就是为了解决这个问题:给每个词向量注入位置信息,让注意力权重和相对位置相关。
绝对位置编码
绝对位置编码直接将位置信息加到输入词向量上:在输入第k个向量 xk 中加入位置向量 pk,得到 pk+xk,其中 pk 只和位置k有关。
常见的绝对位置编码有两种:训练式位置编码和Sinusoildal位置编码。
1. 训练式位置编码
原理:给每个位置训练一个位置向量,和词嵌入一起训练。比如模型最大输入长度为512,词维度为768,就初始化一个 512 × 768 的矩阵,参与训练学习。
优点:简单直接,让模型自己学习位置信息,数据驱动更灵活。
缺点:不具备长度外推性。位置矩阵大小是预设的,超出训练长度的位置没有训练过,无法处理更长序列。
应用:早期Transformer模型如BERT、GPT、ALBERT都使用训练式位置编码。
2. Sinusoidal(正弦余弦)位置编码
这是Transformer原始论文提出的固定位置编码,不需要训练。公式如下:
PE(pos,2i)=sin(100002i/dpos)
PE(pos,2i+1)=cos(100002i/dpos)
其中:
pos:位置索引
i:维度索引
d:位置编码维度,等于词嵌入维度
性质:
- 周期性:每个分量都是正弦/余弦函数,具有周期性
- 远程衰减性:两个位置向量的内积随着相对距离增大而衰减
- 任意长度外推:可以直接生成超出训练长度的位置编码,不需要训练
优点:不需要训练,不会占用参数,可以外推到更长序列。
缺点:是固定的,不随数据学习。
相对位置编码
相对位置编码不直接在输入加位置向量,而是在计算注意力分数时,注入相对位置信息。
回忆带绝对位置编码的注意力分数:
a(m,n)=(xm+pm)T(xn+pn)=xmTxn+xmTpn+pmTxn+pmTpn
可以看到,注意力分数分成四项,只有第一项和位置无关,后三项都和位置有关。相对位置编码就是修改后三项,直接用相对位置 (m−n) 来建模位置关系。
常见的相对位置编码方案:
XLNet式相对位置编码
将绝对位置编码中的 pn 和 pm 替换为根据相对位置生成的 Rm−n,并引入两个可学习的参数u和v:
a(m,n)=xmTxn+xmTRm−n+uTxn+vTRm−n
T5式相对位置编码
T5认为输入和位置不该有过多交互,直接去掉前两项位置相关项,只保留一个可训练的偏置 bm−n,加到注意力分数上:
a(m,n)=xmTxn+bm−n
非常简单,只需要一个可训练的偏置项,根据相对位置查表加上去就行。
DeBERTa式相对位置编码
DeBERTa保留了x和相对位置的交互,去掉了最后一项:
a(m,n)=xmTxn+xmTrm−n+xnTrn−m
其中 rm−n 是相对位置 (m−n) 的可学习向量。
旋转位置编码(RoPE)
核心思想
RoPE(Rotary Position Embedding)是现在最流行的位置编码方案,被LLaMA、PaLM、GLM-130B等广泛采用。
RoPE的核心思想是:对Q和K直接做旋转变换,让它们的内积天然带有相对位置信息。它希望满足:
f(qm,m)Tf(kn,n)=g(qm,kn,m−n)
也就是说,经过位置变换后,q和k的内积只和相对位置 (m−n) 有关,天然满足相对位置编码的性质。
原理推导(二维简化)
用复数形式最容易理解。将二维向量看作复平面上的点,乘以 eimθ 就是逆时针旋转 mθ 角度:
- qm 旋转后:qmeimθ
- kn 旋转后:kneinθ
- 内积(复数实部):Re[qmeimθkneinθ]=Re[qmknei(m−n)θ]
结果只和相对位置 (m−n) 有关!完美满足要求。
推广到d维就是将d维两两分组,每组二维分别旋转,最后拼接起来。
优点
- 用绝对位置编码的方式实现了相对位置编码,不改变注意力计算结构
- 良好的长度外推性,可以处理比训练长度长得多的序列
- 实践效果很好,现在成为大模型的主流选择
ALiBi (Attention with Linear Biases)
核心思想
ALiBi不改变输入词嵌入,也不需要给Q/K加位置编码,直接在注意力分数上加上一个和相对距离成正比的偏置:
a(m,n)=qmTkn−mi×∣m−n∣
其中 mi 是第i个注意力头对应的斜率,是预设好的,不需要训练。
偏置的含义:相对距离越远,惩罚越大,所以注意力分数越小,符合直觉。
优点
- 非常简单,不需要参数,只加个偏置
- 极好的长度外推性,直接推广到任意长度
- 效果不错,训练更快,不增加任何参数
应用:BLOOM等模型使用了ALiBi。
长度外推问题
什么是长度外推问题
长度外推就是:模型在较短的上下文长度训练,推理时要处理比训练长得多的上下文,性能掉得很厉害。原因主要有两点:
- 位置编码不一致:推理时出现了训练没见过的位置编码,模型不认识
- 注意力跨度不一致:推理需要更大的注意力跨度,分布偏移导致熵增性能下降
常见解决方法
位置编码层面:
- ALiBi:天然支持外推,不需要新位置参数
- RoPE + NTK插值:对RoPE做插值,可以不需要微调直接外推(目前效果最好的免微调方案)
- XPOS:对RoPE的改进,更好的外推性
- Sandwich、KERPLE:其他改进方案
注意力分数层面:
- Softmax归一化时加上一个系数
log(n)/log(512) 补偿注意力跨度变化,n是当前序列长度
各类位置编码对比
| 方法 | 类型 | 是否需要训练 | 外推性 | 实现复杂度 | 应用模型 |
|---|
| 训练式绝对编码 | 绝对 | 是 | 差 | 简单 | BERT、GPT |
| Sinusoidal | 绝对 | 否 | 好 | 简单 | 原始Transformer |
| XLNet相对位置 | 相对 | 是 | 一般 | 复杂 | XLNet |
| T5相对偏置 | 相对 | 是 | 一般 | 简单 | T5 |
| RoPE | 相对(绝对实现) | 否 | 很好 | 中等 | LLaMA、PaLM、ChatGLM |
| ALiBi | 相对 | 否 | 极好 | 极简单 | BLOOM |
面试常见问题
1. 为什么Transformer需要位置编码?
回答要点:
- 自注意力本质是位置无关的,交换两个token位置计算结果不变
- 自然语言中词序非常重要,必须让模型感知位置信息
- 没有位置编码,模型无法区分"我爱你"和"你爱我"
2. 绝对位置编码和相对位置编码的区别?
回答要点:
- 绝对位置编码:直接把位置向量加到词嵌入上,每个位置有一个固定向量,简单直接
- 相对位置编码:在注意力计算时注入相对位置信息,更符合"注意力依赖相对距离"的直觉
- 相对位置编码通常外推性更好,处理长文本更有优势
3. RoPE的原理是什么?为什么好?
回答要点:
- RoPE通过对Q/K做旋转变换,让内积结果只和相对位置有关,用绝对位置编码方式实现了相对位置编码
- 不需要训练参数,实现简单,不改变注意力结构
- 外推性好,可以处理更长序列,实践效果稳定,现在是大模型主流选择
4. ALiBi是什么?有什么优缺点?
回答要点:
- ALiBi直接在注意力分数上加一个和相对距离成正比的负偏置,距离越远惩罚越大
- 优点:不需要任何可训练参数,实现极简单,外推性极好,可以直接处理任意长度
- 缺点:相比RoPE,效果略差一点,但差距不大
5. 什么是长度外推性?为什么重要?
回答要点:
- 长度外推指模型在短上下文训练后,能推广到比训练更长的上下文推理且性能下降不大
- 由于计算资源限制,大模型通常只能在较短上下文训练,实际应用需要更长上下文
- 好的位置编码应该有好的外推性,不用重新训练就能处理长文本
6. Sinusoidal位置编码有什么优点?
回答要点:
- 不需要训练,不占用参数
- 可以外推到任意长度,不会因为长度不够无法处理
- 具有天然的周期性和相对距离衰减性,符合直觉
7. 为什么现在大模型倾向用RoPE?
回答要点:
- RoPE效果好,实践稳定
- 不需要训练参数,实现相对简单
- 外推性好,支持长文本
- 不改变Attention计算架构,容易集成
- LLaMA等开源模型带火了RoPE,生态好