
为什么 Transformer 需要位置编码?
自注意力机制的核心运算是"Query 和 Key 做点积"——它只关心两个 token 之间的语义相关性,完全不考虑它们在序列中的先后顺序。把一句话的词语打乱顺序,对自注意力来说结果是一样的。这就是 Transformer 的"位置盲点"。
但自然语言中,词序是意义的核心载体。"我打你"和"你打我"用的词完全一样,意思截然相反。如果没有位置信息,模型就无法区分这两种情况。
位置编码(Positional Encoding)就是给每个 token 附加一个位置信号,告诉模型"这个词在第几个位置"。这样自注意力既能捕捉语义相关性,也能感知位置距离。
原始方案:正弦波位置编码
Transformer 原始论文(Vaswani et al., 2017)提出的方案是用不同频率的正弦和余弦波来编码位置。对于位置 pos,第 i 维的编码值为:
PE(pos, 2i) = sin(pos / 10000^(2i / d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i / d_model))
这个公式初看有点吓人,但实际上它的设计思路很巧妙:
- 不同维度对应不同频率。低维度(i 小)用高频波,相邻位置的编码值差异大,适合捕捉局部位置关系。高维度(i 大)用低频波,编码值变化平缓,适合捕捉全局位置关系。
- 有界且稳定。正弦/余弦值始终在 [-1, 1] 之间,不会像数值递增那样爆炸。
- 无需学习。编码值是固定的数学函数,不占用模型参数,不影响训练。
直观上可以这样理解:就像钟表的时针、分针、秒针以不同速度转动,组合起来能唯一标识一天中的任意时刻——不同频率的正弦波组合起来就能唯一编码任意位置。
Modern 改进:可学习位置嵌入
正弦波编码是手工设计的。后来 BERT 和 GPT 系列的做法更直接:让模型自己去学每个位置该长什么样。每句话固定长度(比如 512),每个位置初始化一个可训练的向量,在训练过程中自动调整。
可学习嵌入的好处是灵活——如果某个位置模式对当前任务特别重要,模型可以自己强化它。但它也有缺点:训练时见过的最大长度限制了推理时的长度,超过训练长度的位置模型从未见过,无法泛化。
GPT 系列(GPT-2/3/4)用的就是这个方案,最大长度从 512 到 2048 到 8192 一路提升。
当前主流:旋转位置编码(RoPE)
RoPE(Rotary Position Embedding,苏剑林等人,2021)是目前大模型最主流的位置编码方案。LLaMA、Mistral、Qwen、GLM 等主流模型都采用它。
RoPE 的核心思路不是在 embedding 上"加"一个位置信号,而是通过旋转矩阵对 Query 和 Key 向量进行变换,让它们的内积自然包含位置信息。具体来说:
- 把 d 维向量分成 d/2 个二维子空间
- 在每个子空间里,按位置角度旋转向量
- 位置 m 和 n 的向量做点积时,结果自动包含 sin(m-n) 项——位置差越大,内积衰减越多
RoPE 的几个关键优点解释了为什么它成为主流:
- 相对位置感知。内积结果只依赖两个位置的差值,而不是绝对位置。模型知道"token A 在 token B 前面 3 个位置",而不只是"token A 在位置 5,token B 在位置 8"。
- 长度泛化。可以通过调整旋转角度(NTK-aware scaling、YaRN 等方法)扩展到训练时未见过的长度。LLaMA 3 从 8K 扩展到 128K 就是靠的 RoPE 扩展技术。
- 没有额外参数。位置信息通过旋转嵌入,不需要额外的位置向量。
RoPE 的成功说明了一个规律:好的位置编码应该是"相对"的而不是"绝对"的,因为语言理解本质上依赖的是词与词之间的相对关系,而非它们在文档中的绝对坐标。
另一个方向:ALiBi
ALiBi(Attention with Linear Biases,Press et al., 2022)走了另一条路:不修改 embedding,而是在注意力分数上直接加一个位置偏置项。距离越远的 token 对,偏置越大(负值),注意力分数就被压得越低。
这个方案极其简单——只需在每层注意力分数上加一个固定的偏置矩阵,不增加任何参数。Bloom 系列模型用的就是 ALiBi。
ALiBi 的一个有趣特性是训练时长度可以很短,推理时直接泛化到极长序列。实验显示,在 512 长度上训练,ALiBi 可以直接外推到 2048 甚至更长。
小结
位置编码从 Transformer 的正弦波开始,经历了可学习嵌入、RoPE、ALiBi 几个阶段。RoPE 凭借相对位置感知和长度泛化能力成为当下主流。理解位置编码,就理解了 Transformer 处理序列结构的核心手段之一。
下一篇讲层归一化(Layer Normalization)——为什么每个 Transformer 层都要归一化,以及 RMS Norm 为什么比 Layer Norm 更受欢迎。
