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论文提出的方法。使用
sin和cos函数生成固定的、无需训练的位置向量。理论上可外推到更长的序列。 - **可学习的绝对位置编码 (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) 向量进行旋转操作。旋转的角度由该词元的绝对位置决定。
- 数学魔术:最奇妙的地方在于,两个经过不同角度旋转的向量,它们的内积(点积)结果,只取决于它们之间的角度差。而这个角度差,正好就代表了它们的相对位置。
- 优点:
- 极佳的性能和外推性:在保持高性能的同时,具有很好的长度外推能力。
- 实现优雅:它直接修改Q和K,而不需要改变注意力计算公式本身。
- 无需额外训练参数。
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⟩这样的“交叉项”,导致结果中单独包含了绝对位置i或j,不满足理想条件。 - 相对位置编码:它是在计算完内积后,再额外加上一个偏置项。这相当于在标准注意力计算上“打补丁”,虽然有效,但破坏了原始内积的简洁性和数学优雅性。
RoPE通过旋转操作,完美地满足了这个理想公式,因为它利用了“旋转后向量的内积只取决于角度差”这一数学性质,从而在数学上更为优雅和自洽。
问:RoPE在代码中是如何实现的?
答: RoPE的实现分为两步,发生在计算出Q和K向量之后,但在它们进行点积之前:
- 获取旋转矩阵:根据每个词元的绝对位置ID
position_ids,通过一个预定义的rotary_emb模块,利用sin和cos函数计算出一系列用于旋转的cos和sin值。这些值构成了旋转操作所需的“旋转矩阵”。 - 应用旋转:调用一个
apply_rotary_pos_emb函数,使用上一步生成的cos和sin值,分别对Q和K向量进行旋转操作。这个操作会就地修改Q和K向量,将位置信息“注入”其中。
经过旋转后,新的Q和K向量就包含了各自的位置信息,可以直接用于后续标准的注意力分数计算。值得注意的是,Value (V) 向量不参与旋转,因为它只负责提供内容信息。
整理自: WordNet:历久弥新