导读

很多人讲位置编码时,会直接列几个名字:

  • Sinusoidal
  • Learned Position Embedding
  • Relative Position
  • RoPE
  • ALiBi

但如果不把它们放在同一条机制链里,你很难真正看懂:

它们到底各自修改了 Transformer 的哪一个最小单元。

这篇文章只做一件事:

把位置编码相关的关键改动,拆到公式级和数据流级。

我统一按同一个模板写:

  1. 来源
  2. 原始机制
  3. 原始公式
  4. 原始流程图
  5. 暴露的问题
  6. 改进机制
  7. 修改公式
  8. 修改后流程图
  9. 最小改动单元

一、为什么 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(dk QK)V

问题在于:

这套公式本身对输入顺序没有天然约束。

如果你把 token 重排,但同时保持 token 内容集合不变,那么 attention 机制本身并不会自动“知道谁在前谁在后”。

所以位置编码的本质任务不是装饰,而是:

给顺序无关的相似度机制注入顺序感。

更具体地说,位置编码大致有三条路线:

  1. 把位置信息加到输入表示里
  2. 把位置信息直接写进 attention score
  3. 把位置信息变成 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=XWQ,K=XWK,V=XWV

3. 原始流程图

Token Embedding x_pos

x_pos + PE_pos

Sin/Cos Position Vector PE_pos

Linear Proj to Q/K/V

Standard Self-Attention

4. 它解决了什么

它解决的是:

如果模型完全看不到位置,那么“猫咬狗”和“狗咬猫”在 bag-of-tokens 视角下很难区分。

Sinusoidal PE 让每个位置拥有唯一编码,同时不同频率维度允许模型用线性组合推断相对位移关系。

5. 它暴露了什么问题

这套方案有两个结构性局限:

  1. 位置信息是先加到输入,再经过投影和 attention
  2. 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,,pnRd

输入变为:

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} PRn×d

是可训练参数矩阵。

3. 原始流程图

Token Embedding X

X + Learned P

Trainable Position Matrix P

Projection to Q/K/V

Standard Attention

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=dk qikj

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=dk qi(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. 原始流程图

Current query

Base score

Current key

Relative position term

Relative score

Normalize scores

Weighted aggregation

Value plus relative value term

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=1d/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(nm)kn

这个式子非常关键,因为它说明:

相对位置 ( n − m ) (n-m) (nm) 直接内嵌进了 score。

3. 原始流程图

先看 Sinusoidal 的旧流程:

X

X + PE

Proj to Q/K/V

QK^T

softmax

RoPE 的新流程:

X

Proj to q/k/v

按位置旋转 q

按位置旋转 k

q'k'^T

softmax

v

weighted sum

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=dk qikj

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)=dk qikjmh(ij)

在因果 attention 中,通常只考虑 j ≤ i j \le i ji

其中:

  • m h m_h mh 是 head-specific slope
  • 距离越远,偏置越大或越小,取决于定义方向

3. 原始流程图

旧流程:

Input tokens

Project to Q K V

Build base scores

Normalize

ALiBi 新流程:

Input tokens

Project to Q K V

Build base scores

Distance matrix

Apply head slope

Add linear bias

Normalize

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 写成五步:

  1. 输入 token embedding
  2. 投影得到 q/k/v
  3. 形成 score
  4. score 做 softmax
  5. 聚合 V

那么这几类位置编码分别改的是:

1 输入 embedding

2 生成 q/k/v

3 形成 score

4 softmax

5 聚合 V

Sinusoidal / Learned

RoPE

Relative Position

ALiBi

这张图其实非常重要。

因为它说明:

大家都说自己是“位置编码”,但它们进入模型的位置完全不同。

这也是为什么它们的:

  • 实现难度不同
  • 长度外推行为不同
  • 与高效 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
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐