位置编码显微镜:Sinusoidal、Learned、Relative、RoPE、ALiBi 到底改了哪一步
导读
很多人讲位置编码时,会直接列几个名字:
- Sinusoidal
- Learned Position Embedding
- Relative Position
- RoPE
- ALiBi
但如果不把它们放在同一条机制链里,你很难真正看懂:
它们到底各自修改了 Transformer 的哪一个最小单元。
这篇文章只做一件事:
把位置编码相关的关键改动,拆到公式级和数据流级。
我统一按同一个模板写:
- 来源
- 原始机制
- 原始公式
- 原始流程图
- 暴露的问题
- 改进机制
- 修改公式
- 修改后流程图
- 最小改动单元
一、为什么 Transformer 一定需要位置编码
在 self-attention 里,如果输入表示矩阵是:
X = [ x 1 , x 2 , … , x n ] ⊤ ∈ R n × d X = [x_1, x_2, \dots, x_n]^\top \in \mathbb{R}^{n \times d} X=[x1,x2,…,xn]⊤∈Rn×d
标准 attention 计算是:
Q = X W Q , K = X W K , V = X W V Q = XW_Q,\quad K = XW_K,\quad V = XW_V Q=XWQ,K=XWK,V=XWV
A t t n ( X ) = s o f t m a x ( Q K ⊤ d k ) V \mathrm{Attn}(X)= \mathrm{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V Attn(X)=softmax(dkQK⊤)V
问题在于:
这套公式本身对输入顺序没有天然约束。
如果你把 token 重排,但同时保持 token 内容集合不变,那么 attention 机制本身并不会自动“知道谁在前谁在后”。
所以位置编码的本质任务不是装饰,而是:
给顺序无关的相似度机制注入顺序感。
更具体地说,位置编码大致有三条路线:
- 把位置信息加到输入表示里
- 把位置信息直接写进 attention score
- 把位置信息变成 q/k 的几何变换
后面的所有方法都可以归到这三类里。
二、最原始版本:Sinusoidal Positional Encoding
来源
- Vaswani et al., Attention Is All You Need (2017)
https://arxiv.org/abs/1706.03762
1. 原始机制
最早的 Transformer 没有 RNN 的顺序扫描,也没有 CNN 的局部卷积核,所以作者直接在输入嵌入上加一个确定性的位置向量:
X ′ = X + P E X' = X + PE X′=X+PE
其中 P E PE PE 是一个只由位置决定的矩阵。
也就是说,最初的位置编码方案不是改 attention,而是:
先把“位置信息”塞进 token embedding,再让后续线性层自己去学怎么用。
2. 原始公式
对位置 pos 和维度索引 i:
P E p o s , 2 i = sin ( p o s 10000 2 i / d ) PE_{pos,2i} = \sin\left(\frac{pos}{10000^{2i/d}}\right) PEpos,2i=sin(100002i/dpos)
P E p o s , 2 i + 1 = cos ( p o s 10000 2 i / d ) PE_{pos,2i+1} = \cos\left(\frac{pos}{10000^{2i/d}}\right) PEpos,2i+1=cos(100002i/dpos)
加到 embedding 后:
x p o s ′ = x p o s + P E p o s x'_{pos} = x_{pos} + PE_{pos} xpos′=xpos+PEpos
再做:
Q = X ′ W Q , K = X ′ W K , V = X ′ W V Q = X'W_Q,\quad K = X'W_K,\quad V = X'W_V Q=X′WQ,K=X′WK,V=X′WV
3. 原始流程图
4. 它解决了什么
它解决的是:
如果模型完全看不到位置,那么“猫咬狗”和“狗咬猫”在 bag-of-tokens 视角下很难区分。
Sinusoidal PE 让每个位置拥有唯一编码,同时不同频率维度允许模型用线性组合推断相对位移关系。
5. 它暴露了什么问题
这套方案有两个结构性局限:
- 位置信息是先加到输入,再经过投影和 attention
- attention score 里并没有显式的“相对位置项”
也就是说,位置关系是间接学出来的,不是直接写进 score 的。
6. 最小改动单元
Sinusoidal PE 改动的最小单元是:
token embedding
它没有改动:
- attention score
- q/k 结构
- softmax
它只是给输入表示加了一层位置偏置。
三、Learned Positional Embedding:把位置向量从固定函数变成可训练参数
来源
- BERT 等后续 Transformer 体系广泛使用 learned position embedding
例如 Devlin et al., BERT (2018)
https://arxiv.org/abs/1810.04805
1. 原始机制
如果说 Sinusoidal PE 是一个固定函数,那么 learned PE 的想法是:
既然位置向量最终也要服务任务,不如直接让它参与训练。
于是为每个位置学习一个参数向量:
p 1 , p 2 , … , p n ∈ R d p_1, p_2, \dots, p_n \in \mathbb{R}^d p1,p2,…,pn∈Rd
输入变为:
x i ′ = x i + p i x'_i = x_i + p_i xi′=xi+pi
2. 原始公式
X ′ = X + P X' = X + P X′=X+P
其中:
P ∈ R n × d P \in \mathbb{R}^{n \times d} P∈Rn×d
是可训练参数矩阵。
3. 原始流程图
4. 和 Sinusoidal 的最小差别
注意,这里改动并不在 attention 内部。
真正最小差别只是:
位置向量的生成方式:从固定函数变成参数表
原来:
P E p o s = deterministic function ( p o s ) PE_{pos} = \text{deterministic function}(pos) PEpos=deterministic function(pos)
后来:
P E p o s = p p o s , p p o s is trainable PE_{pos} = p_{pos}, \quad p_{pos} \text{ is trainable} PEpos=ppos,ppos is trainable
5. 暴露的问题
learned PE 的问题是长度外推更弱。
因为:
- 训练时只见过一部分位置
- 位置向量本身是查表参数
一旦超出训练长度,模型缺少自然外推机制。
6. 最小改动单元
仍然是:
token embedding
它依然没有进入 attention score。
四、Relative Position Representations:第一次把位置显式推进到 attention score 相关项
来源
- Shaw et al., Self-Attention with Relative Position Representations (2018)
https://arxiv.org/abs/1803.02155
1. 原始机制
前面两种方法的共性是:
位置先加到输入表示中,再由 attention 自己去吸收。
Relative Position 的关键转变是:
不再只编码“这个 token 在第几位”,而是直接编码“两个 token 相距多远”。
2. 原始公式
标准 attention score:
e i j = q i ⊤ k j d k e_{ij} = \frac{q_i^\top k_j}{\sqrt{d_k}} eij=dkqi⊤kj
Relative Position 版本引入与相对距离有关的向量 a i j K a_{ij}^K aijK:
e i j = q i ⊤ ( k j + a i j K ) d k e_{ij}= \frac{q_i^\top (k_j + a_{ij}^K)}{\sqrt{d_k}} eij=dkqi⊤(kj+aijK)
输出也可加入相对位置值项 a i j V a_{ij}^V aijV:
z i = ∑ j α i j ( v j + a i j V ) z_i = \sum_j \alpha_{ij}(v_j + a_{ij}^V) zi=j∑αij(vj+aijV)
3. 原始流程图
4. 它到底改了哪里
这一步非常关键。
因为位置关系第一次不是“先加到输入”,而是直接进入:
- score 计算
- value 聚合
也就是说,位置从输入属性变成了:
attention 层内部的显式关系变量
5. 暴露的问题
Relative Position 更强,但实现和缓存更复杂。
因为对于每个 ( i , j ) (i,j) (i,j),你都要考虑相对位置索引。
6. 最小改动单元
它改动的最小单元是:
pairwise token relation
不再是单个 token 自己带一个位置向量,而是 token 对之间拥有相对位置关系。
五、RoPE:把位置关系变成 q/k 的旋转几何
来源
- Su et al., RoFormer: Enhanced Transformer with Rotary Position Embedding (2021)
https://arxiv.org/abs/2104.09864
1. 原始机制
相对位置方法已经意识到“关系比分别位置更重要”。
RoPE 再往前走一步:
不再单独加一个相对位置向量,而是直接把位置写成 q/k 的旋转变换。
2. 原始公式
先看二维子空间旋转矩阵:
R θ = [ cos θ − sin θ sin θ cos θ ] R_\theta = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} Rθ=[cosθsinθ−sinθcosθ]
在高维空间里,把维度按 2 维一组分块旋转:
R ( m ) = ⨁ r = 1 d / 2 R θ r ( m ) \mathcal{R}(m)=\bigoplus_{r=1}^{d/2} R_{\theta_r(m)} R(m)=r=1⨁d/2Rθr(m)
对位置 m m m 的 query、位置 n n n 的 key:
q m ′ = R ( m ) q m , k n ′ = R ( n ) k n q'_m = \mathcal{R}(m)q_m,\qquad k'_n = \mathcal{R}(n)k_n qm′=R(m)qm,kn′=R(n)kn
于是分数变成:
⟨ q m ′ , k n ′ ⟩ = ⟨ R ( m ) q m , R ( n ) k n ⟩ \langle q'_m, k'_n \rangle = \langle \mathcal{R}(m)q_m, \mathcal{R}(n)k_n \rangle ⟨qm′,kn′⟩=⟨R(m)qm,R(n)kn⟩
利用旋转矩阵正交性,可写成:
⟨ q m ′ , k n ′ ⟩ = ⟨ q m , R ( n − m ) k n ⟩ \langle q'_m, k'_n \rangle= \langle q_m, \mathcal{R}(n-m)k_n \rangle ⟨qm′,kn′⟩=⟨qm,R(n−m)kn⟩
这个式子非常关键,因为它说明:
相对位置 ( n − m ) (n-m) (n−m) 直接内嵌进了 score。
3. 原始流程图
先看 Sinusoidal 的旧流程:
RoPE 的新流程:
4. 和 Relative Position 的区别
Relative Position 是:
给 token pair 单独加相对位置项
RoPE 是:
直接修改 q/k 的几何结构,让相对位置自然出现在内积里
这使得实现上更优雅,也更适合高效 attention 实现。
5. 最小改动单元
RoPE 改动的最小单元是:
q/k 向量在形成 score 之前的几何变换
不是 embedding,不是 logit bias,而是:
score kernel 的输入几何
六、ALiBi:不改表示,不改几何,直接改 logit
来源
- Press, Smith, Lewis, Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation (2021/2022)
https://arxiv.org/abs/2108.12409
1. 原始机制
RoPE 很优雅,但仍然需要对 q/k 做位置相关变换。
ALiBi 更激进:
连位置向量都不显式加了,直接给 attention score 一个距离相关的线性偏置。
2. 原始公式
标准 attention score:
s i j = q i ⊤ k j d k s_{ij} = \frac{q_i^\top k_j}{\sqrt{d_k}} sij=dkqi⊤kj
ALiBi 改为:
s i j ( h ) = q i ⊤ k j d k − m h ⋅ ( i − j ) s_{ij}^{(h)}=\frac{q_i^\top k_j}{\sqrt{d_k}}- m_h \cdot (i-j) sij(h)=dkqi⊤kj−mh⋅(i−j)
在因果 attention 中,通常只考虑 j ≤ i j \le i j≤i。
其中:
- m h m_h mh 是 head-specific slope
- 距离越远,偏置越大或越小,取决于定义方向
3. 原始流程图
旧流程:
ALiBi 新流程:
4. 它为什么简单
因为它不改:
- input embedding
- q/k 旋转
- value 聚合
它只改:
score matrix 的每一个元素
这就让实现特别轻。
5. 它暴露的取舍
ALiBi 的优势是:
- 简单
- 外推方便
- 对解码实现友好
但它表达的位置结构更偏“单调距离偏置”,不像 RoPE 那样有更丰富的旋转几何。
6. 最小改动单元
ALiBi 改动的最小单元是:
attention logit s_ij
这是最纯粹的 logit-level 改动。
七、把这几种位置编码压成一张机制表
| 方法 | 来源 | 改动位置 | 原始公式位置 | 新公式位置 | 最小改动单元 |
|---|---|---|---|---|---|
| Sinusoidal PE | Vaswani 2017 | 输入层 | x_i |
x_i + PE_i |
token embedding |
| Learned PE | BERT 等 | 输入层 | x_i |
x_i + p_i |
token embedding |
| Relative Position | Shaw 2018 | score/value 关系层 | q_i^T k_j |
q_i^T(k_j+a_ij^K) |
token pair relation |
| RoPE | Su 2021 | q/k 几何层 | q_i,k_j |
R(i)q_i, R(j)k_j |
q/k geometry |
| ALiBi | Press 2021 | logit 层 | s_ij |
`s_ij - m_h | i-j |
八、如果用“改了哪一步”来理解,这五类方法其实非常清楚
可以把标准 attention 写成五步:
- 输入 token embedding
- 投影得到 q/k/v
- 形成 score
- score 做 softmax
- 聚合 V
那么这几类位置编码分别改的是:
这张图其实非常重要。
因为它说明:
大家都说自己是“位置编码”,但它们进入模型的位置完全不同。
这也是为什么它们的:
- 实现难度不同
- 长度外推行为不同
- 与高效 attention 的兼容性不同
- 对推理缓存的影响不同
九、最后给一个最关键的结论
位置编码方法的进化,不是简单从旧到新替换,而是在不断把位置信息往 attention 核心推进:
- 最早:位置是输入的附加标签
- 后来:位置变成 token pair 的关系项
- 再后来:位置直接变成 q/k 的几何变换
- 或者:位置直接变成 score 的显式 bias
所以真正的问题不是:
哪个位置编码“更高级”
而是:
你希望位置信息在模型中的哪个层级起作用。
如果你希望它是:
- 输入级属性,用 Sinusoidal / Learned
- 关系级变量,用 Relative Position
- 内核级几何,用 RoPE
- logit 级先验,用 ALiBi
这才是最稳的理解方式。
参考文献
- Vaswani et al., Attention Is All You Need (2017): https://arxiv.org/abs/1706.03762
- Devlin et al., BERT (2018): https://arxiv.org/abs/1810.04805
- Shaw et al., Self-Attention with Relative Position Representations (2018): https://arxiv.org/abs/1803.02155
- Su et al., RoFormer (2021): https://arxiv.org/abs/2104.09864
- Press et al., ALiBi (2021/2022): https://arxiv.org/abs/2108.12409
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)