位置编码(Positional Encoding)

为Transformer注入序列顺序信息的机制。由于注意力机制本身是顺序无关的,位置编码通过给每个位置添加独特向量来区分token的先后关系。常见方案包括正弦编码和旋转位置编码(RoPE)。

位置编码(Positional Encoding)

一句话理解

给序列中每个位置一个独特的数学标记,让 Transformer 分得清"谁在前、谁在后"。

为什么需要位置编码

Transformer 的 Self-Attention 是置换不变的——把输入 token 打乱顺序,注意力分数完全不变。但对语言来说,顺序至关重要:

"狗咬人" ≠ "人咬狗"

不加位置编码,Transformer 处理的是无序集合而不是有序序列。

工作方式

位置编码是一个与 token embedding 同维度的向量,直接加到 token embedding 上:

Input=TokenEmbedding+PositionalEncoding\text{Input} = \text{TokenEmbedding} + \text{PositionalEncoding}Input=TokenEmbedding+PositionalEncoding

正弦/余弦编码(原始论文)

原始 Transformer 用不同频率的正弦和余弦函数生成位置向量:

PE(pos,2i)=sin(pos100002i/d)PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right)PE(pos,2i)=sin(100002i/dpos) PE(pos,2i+1)=cos(pos100002i/d)PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right)PE(pos,2i+1)=cos(100002i/dpos)

优点:无需训练,且理论上可以外推到更长的序列。

旋转位置编码(RoPE)

现代大模型(LLaMA、GPT-NeoX 等)普遍采用 RoPE(Rotary Position Embedding),通过旋转矩阵将位置信息融入 Q/K 的点积计算中,在长文本上表现更好。

直觉类比

想象一排座位上坐着一群人,每个人胸口挂着一个编号牌。即使你不认识他们,也能通过编号牌知道谁坐在前面、谁坐在后面。位置编码就是给 token 挂上的"编号牌"。

关键特性

  • 加法融合:位置编码与 token embedding 直接相加,而非拼接
  • 唯一性:每个位置的编码向量都不同,模型可以通过它区分位置
  • 长度外推:好的位置编码方案(如 RoPE + NTK 插值)可以处理训练时未见过的更长序列

引用本术语的文章