Transformer 的位置编码是怎样的?
- 标签:Transformer、位置编码
🏛 业务架构师
Transformer 的位置编码,我按"为什么—怎么做—怎么演进"讲:
为什么需要:自注意力对输入是"集合"式处理——打乱 token 顺序注意力结果不变(置换不变性),但语言顺序承载语义("狗咬人"≠"人咬狗")。必须显式注入位置信息。
经典方案·正弦位置编码(原论文):每个位置用不同频率的 sin/cos 函数生成固定向量(频率从高到低,像二进制计数器的各位翻转速度)——与词 embedding 相加输入模型。特点:无需学习、理论上可外推到训练外长度;但与词向量相加是"软融合",效果有限。
可学习位置编码(GPT-2 时期):位置 embedding 当参数训练——效果稳定,但绑定最大长度(训练 1024 就只能 1024)、外推差。
现代主流·RoPE 旋转位置编码(Llama 系标配):把 Q/K 向量按位置"旋转"不同角度——两 token 的注意力点积只依赖相对位置差(相对位置特性)。优点:天然编码相对位置(语言里重要的是"相隔多远")、外推友好(配合插值/NTK/YaRN 技巧可把 4K 窗口扩到 128K+)、不占上下文长度。这是 2026 年大模型的事实标准。
辅助方案·ALiBi:注意力得分直接减去与距离成比例的偏置——实现简单、外推好,BLOOM/Mistral 部分版本采用。
业务视角的价值:位置编码决定了模型的上下文扩展能力——RoPE 系的可扩展性是这轮"窗口军备竞赛"(4K→128K→1M)的技术底座。企业选型时,模型用什么位置编码决定了"长上下文能力是原生的还是魔改的",直接影响长文档任务的真实效果与可靠性。
🏗 系统架构师
位置编码 = 给注意力注入顺序信息的机制(注意力本身对位置无感——打乱 token 顺序注意力机制无法区分)。我按演化谱系讲:
绝对位置编码(原始 Transformer,2017):固定的 sin/cos 函数——第 pos 个位置、第 i 维用不同频率的 sin/cos 组合:
PE(pos, 2i) = sin(pos/10000^(2i/d))。特点:无需学习、相对位置可由线性变换表达(三角恒等式);加到 token embedding 上;缺点:训练长度外推差;可学习绝对编码(BERT/GPT-2)——灵活性没提升,上限固定死训练长度;RoPE 旋转位置编码(现代 LLM 事实标准):Q/K 向量按位置旋转——Q 位置 m、K 位置 n 点积时旋转角相减,注意力分数天然只依赖相对距离 (m-n):绝对位置通过旋转"相消",相对性数学内生。优点:相对位置直接获得、长度的外推扩展友好(位置插值 PI / NTK-aware scaling 做长上下文扩展的事实标准工具链)、无额外参数、与注意力计算融合高效;
ALiBi(另一路线):不做位置嵌入,直接在注意力分数上按距离加线性惩罚(远处的注意力分数打折)——极简、外推性不错,BLOOM/MPT 采用过;表达力弱于 RoPE,现较少用于主流 LLM;
架构师视角:位置编码的演化主线是从"标注位置"到"编码关系"——绝对编码给位置贴标签,RoPE 让位置参与运算并自然产出相对性;它决定了长上下文扩展的难易度(外推 = 改频率基底 vs 重训),是"模型架构决定推理工程上限"的典型例子。
💻 全栈开发专家
Transformer 位置编码的演进(每代解决上一代的问题):
1. 正弦绝对位置编码(原版 2017):
- 做法:d 维向量用不同频率的 sin/cos 生成,加到 token embedding 上;
- 特点:无需学习、 theoretically 可外推;但绝对位置表达相对关系间接,实测外推一般。
2. 可学习绝对位置(BERT/GPT-2):
- 位置查表(nn.Embedding(max_len, d)),训练学出来;
- 缺点:max_len 硬编码(BERT 512)、不能外推(超训练长度直接崩)。
3. 相对位置编码(Transformer-XL/T5):
- 核心洞察:语言里重要的是相对距离不是绝对坐标;
- T5 的做法:给注意力分数加一个只依赖相对距离的 bias(30 个桶,对数分桶)——简单有效。
4. RoPE 旋转位置编码(现代主流,LLaMA/Qwen 系):
- Q/K 向量按位置「旋转」,点积自动带上相对位置依赖(正交性保模长);
- 优点:相对位置语义、不占参数、外推友好——配合位置插值(PI)/NTK/YaRN 缩放技巧,4k 训练扩到 128k+,这是长上下文模型的基础设施。
5. ALiBi(BLOOM/MPT 用):
- 不加位置项,直接给注意力分数按距离线性惩罚(越远分越低);
- 外推能力好、实现极简,适合训练时上下文有限的场景。
工程视角的实用点:
- 部署时 RoPE 的
rope_scaling配置必须和训练/微调一致,不一致的症状是长文本「前后张冠李戴」; - 想扩模型上下文:YaRN/NTK 微调几百步即可,别硬塞没缩放的长度;
- 面试讲清「绝对→相对→旋转」的动机链(可学习→外推需求→相对语义)就是完整答案。