跳到主要内容
AI 丛编 Transformer 位置编码

位置编码

为什么自注意力不感知顺序,正弦位置编码、可学习编码与 RoPE 各有什么取舍。

自注意力对输入序列做的是置换等变的计算——把序列打乱重排, 每个位置的输出也跟着重排,但内容完全相同。换句话说, 「猫 追 狗」和「狗 追 猫」在没有位置信息时是同一句话。

正弦位置编码

原始 Transformer 把位置信息直接加在词向量上:

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

选择正弦函数的好处:PEpos+kPE_{pos+k} 可以表示为 PEposPE_{pos} 的线性变换, 模型更容易学到相对位置关系。

不同频率的三角函数像一组刻度尺:低频区分粗粒度的前后段, 高频区分相邻 token。把它们按维度交错拼起来,就得到每个位置的唯一指纹。

可学习位置编码

BERT 等模型把位置向量当作普通参数训练:

self.position_embeddings = nn.Embedding(max_seq_len, d_model)
x = token_embeddings + position_embeddings(positions)

实现简单,但序列长度被 max_seq_len 钉死,超长输入只能截断或插值。

RoPE:旋转位置编码

RoPE 不是相加而是旋转:按位置角度把 query/key 在二维平面上旋转, 旋转后两个向量的点积只依赖相对位置 mnm - n

f(qm,m),  f(kn,n)=g(qm,kn,  mn)\langle f(q_m, m),\; f(k_n, n) \rangle = g(q_m, k_n,\; m - n)

这让模型天然编码相对位置,长度外推能力明显好于绝对位置编码, 是 LLaMA、Qwen 等主流模型的选择。

小结

方案形式外推代表
正弦相加Transformer、GPT-2
可学习相加BERT
RoPE旋转较好LLaMA、Qwen

评论