Transformer 位置编码对比
Transformer 位置编码(以原始正弦余弦位置编码为代表)和旋转位置编码(RoPE)是两种常用的序列位置信息编码方式,核心差异体现在原理、相对位置建模能力、长度扩展性等方面,具体区别如下:
1. 原理不同
-
原始 Transformer 位置编码(正弦余弦)
直接通过正弦和余弦函数生成绝对位置编码,公式为:
对于序列中位置为iii的 token,其位置编码的第kkk维(kkk为偶数时)为PE(i,k)=sin(i/100002k/dmodel)\text{PE}(i, k) = \sin(i / 10000^{2k/d_{\text{model}}})PE(i,k)=sin(i/100002k/dmodel);第kkk维(kkk为奇数时)为PE(i,k)=cos(i/100002k/dmodel)\text{PE}(i, k) = \cos(i / 10000^{2k/d_{\text{model}}})PE(i,k)=cos(i/100002k/dmodel),其中dmodeld_{\text{model}}dmodel是模型维度。
最终将生成的位置编码与输入的词向量直接相加,作为 Transformer 的输入。
-
旋转位置编码(RoPE)
通过旋转矩阵动态编码位置信息,核心是将位置嵌入到 query 和 key 向量中。对于位置为iii的 token,其 query/key 向量会被乘以一个与位置iii相关的旋转矩阵,使得向量 “旋转” 一定角度(角度随位置iii增大而增大)。
旋转矩阵的参数由位置iii和维度kkk共同决定,最终通过 query 与 key 的点积计算,让注意力权重自然体现相对位置关系(而非直接与词向量相加)。
2. 相对位置建模能力不同
-
原始位置编码
设计初衷是通过正弦余弦的周期性捕捉相对位置(利用sin(a+b)\sin(a+b)sin(a+b)和cos(a+b)\cos(a+b)cos(a+b)的三角恒等式),但本质上是绝对位置编码。
实际中,其对相对位置的表达能力有限:当序列过长时,不同绝对位置的正弦余弦值可能非常接近(如位置 1000 和 1001 的编码差异很小),导致模型难以区分远距离的相对位置。
-
RoPE
天然建模相对位置:通过旋转矩阵的性质,query(位置iii)与 key(位置jjj)的点积结果**仅依赖于相对位置**** **,与绝对位置无关。
这种机制让模型对相对位置的敏感程度更高,尤其在长序列中,对 “距离ddd的两个 token” 的建模一致性更好(如距离 5 的两个 token,无论在序列的开头还是中间,其注意力计算方式一致)。
3. 长度扩展性不同
-
原始位置编码
位置编码是预定义的(依赖训练时的最大序列长度)。若测试时序列长度超过训练时的最大长度(如训练用 512,测试用 1024),超出部分的位置编码会使用未训练过的正弦余弦值,可能导致模型性能下降,长度扩展性差。
-
RoPE
旋转矩阵可通过位置iii动态计算(无需预定义),无论序列长度是多少(即使远超训练时的最大长度),都能生成对应的位置编码,天然支持任意长度的序列,长度扩展性显著优于原始位置编码,更适合长文本任务(如文档级理解、长对话)。
4. 计算效率不同
-
原始位置编码
预计算后可直接复用,与词向量的加法操作耗时极短,计算效率高。
-
RoPE
需对每个 query 和 key 向量应用旋转矩阵(可通过复数运算优化,将旋转转化为复数乘法),计算量略高于原始位置编码,但优化后(如利用 GPU 并行计算)效率仍可接受,且收益(更好的长序列性能)远超额外开销。
总结
维度 | 原始 Transformer 位置编码(正弦余弦) | 旋转位置编码(RoPE) |
---|---|---|
原理 | 正弦余弦函数生成,与词向量相加 | 旋转矩阵编码,融入 query/key 向量 |
相对位置建模 | 弱(依赖三角恒等式,远距离区分差) | 强(点积仅依赖相对位置) |
长度扩展性 | 差(依赖预定义最大长度) | 好(支持任意长度序列) |
计算效率 | 高(仅加法) | 中(需旋转矩阵运算,可优化) |
典型应用 | BERT、GPT-1 等早期模型 | LLaMA、ChatGLM 等现代大语言模型 |