Transformer中的位置编码演进:从绝对到旋转(RoPE)

Transformer中的位置编码演进:从绝对到旋转(RoPE)

本文档整理了关于Transformer模型中位置编码(Positional Encoding)技术的演进过程,从最初的绝对位置编码,到相对位置编码,再到目前最主流的旋转位置编码(RoPE),并包含了对RoPE设计哲学的深入探讨。

1. 为什么需要位置编码?

Transformer模型的核心是自注意力机制(Self-Attention)。这个机制在计算时,会同等看待输入序列中的所有词元(token),它本身无法感知到词元的先后顺序。为了让模型理解序列顺序,我们必须人为地给模型注入位置信息,这就是位置编码的作用。

2. 绝对位置编码 (Absolute Position Encoding)

核心思想:为序列中的每一个绝对位置(第1个、第2个、第3个…)分配一个独一无二的位置向量,然后将这个位置向量加到对应的词元嵌入(Token Embedding)上。

  • **正弦/余弦位置编码 (Sinusoidal)**:原始Transformer论文提出的方法。使用sincos函数生成固定的、无需训练的位置向量。理论上可外推到更长的序列。
  • **可学习的绝对位置编码 (Learned)**:BERT、GPT系列早期使用的方法。创建一个可学习的位置嵌入矩阵,通过训练得到位置向量。优点是简单,缺点是外推性差,无法处理超过预设最大长度的序列。

3. 相对位置编码 (Relative Position Encoding)

核心思想:模型不应该关心一个词的绝对位置,而应该更关心两个词之间的相对距离(例如,A词在B词左边3个位置)。

  • 做法:它不再将位置信息加到词元嵌入上,而是在计算注意力分数时引入一个代表相对距离的“偏置项”(bias)。
  • 优点:具有更好的泛化性和平移不变性,能更好地处理不同长度的序列。
  • 代表模型:T5, Transformer-XL。

4. RoPE (Rotary Position Embedding, 旋转位置编码)

RoPE是目前大语言模型(如Llama系列、PaLM)中最主流、最成功的方案之一。它巧妙地结合了绝对位置和相对位置的思想

  • 核心思想:通过旋转词元嵌入向量来注入位置信息。
  • 实现方式:它在计算注意力分数之前,对Query (Q) 和 Key (K) 向量进行旋转操作。旋转的角度由该词元的绝对位置决定。
  • 数学魔术:最奇妙的地方在于,两个经过不同角度旋转的向量,它们的内积(点积)结果,只取决于它们之间的角度差。而这个角度差,正好就代表了它们的相对位置
  • 优点
    1. 极佳的性能和外推性:在保持高性能的同时,具有很好的长度外推能力。
    2. 实现优雅:它直接修改Q和K,而不需要改变注意力计算公式本身。
    3. 无需额外训练参数

Brainstorm Q&A: RoPE的设计哲学

问:RoPE的设计目标是什么?为什么说之前的方法不完美?

答: RoPE的设计,源于一个“理想”的数学目标:一个好的位置编码方法,应该让注意力分数只依赖于词元之间的相对位置,而不是它们的绝对位置。

这个目标可以被抽象成一个数学公式:⟨f(x, i), f(y, j)⟩ = g(x, y, i - j)

  • f(x, i) 是我们想设计的函数,它结合了词元x和其绝对位置i
  • ⟨ , ⟩ 代表内积(注意力分数的核心计算)。
  • g(x, y, i - j) 代表最终结果只和词元本身以及它们的相对位置 i-j 有关。

之前的方法不完美的原因:

  • 正弦/余弦编码:采用加法 v_x + PE_i。其内积展开后会包含 ⟨v_x, PE_j⟩⟨PE_i, v_y⟩ 这样的“交叉项”,导致结果中单独包含了绝对位置 ij,不满足理想条件。
  • 相对位置编码:它是在计算完内积后,再额外加上一个偏置项。这相当于在标准注意力计算上“打补丁”,虽然有效,但破坏了原始内积的简洁性和数学优雅性。

RoPE通过旋转操作,完美地满足了这个理想公式,因为它利用了“旋转后向量的内积只取决于角度差”这一数学性质,从而在数学上更为优雅和自洽。

问:RoPE在代码中是如何实现的?

答: RoPE的实现分为两步,发生在计算出Q和K向量之后,但在它们进行点积之前:

  1. 获取旋转矩阵:根据每个词元的绝对位置ID position_ids,通过一个预定义的rotary_emb模块,利用sincos函数计算出一系列用于旋转的cossin值。这些值构成了旋转操作所需的“旋转矩阵”。
  2. 应用旋转:调用一个apply_rotary_pos_emb函数,使用上一步生成的cossin值,分别对Q和K向量进行旋转操作。这个操作会就地修改Q和K向量,将位置信息“注入”其中。

经过旋转后,新的Q和K向量就包含了各自的位置信息,可以直接用于后续标准的注意力分数计算。值得注意的是,Value (V) 向量不参与旋转,因为它只负责提供内容信息。


整理自: WordNet:历久弥新


Transformer中的位置编码演进:从绝对到旋转(RoPE)
http://zl1bks.github.io/2025/09/20/Transformer中的位置编码演进:从绝对到旋转(RoPE)/
作者
zl1bks
发布于
2025年9月20日
许可协议