什么是位置编码?Transformer 如何知道词的顺序

Transformer 一次看所有 token,为什么还能分清“我喜欢你”和“你喜欢我”?位置编码是什么、有哪些做法、它和上下文长度有何关系,一文讲清。

什么是位置编码?Transformer 如何知道词的顺序
编辑部 ·

“我喜欢你”和“你喜欢我”包含相同的三个词,含义却完全不同。Transformer 的注意力机制可以同时看多个 token,但它天生不知道谁在前谁在后。给模型补上顺序信息的,就是位置编码(Positional Encoding)

一句话理解:给每个词贴上座位号

词向量告诉模型“这是什么词”,位置编码告诉模型“它在第几个位置”。两者结合后,模型才能理解主语、宾语、时间顺序和代码中的括号嵌套。

没有位置编码,模型看到的更像一袋词,而不是一句有顺序的语言。

常见的两种思路

绝对位置编码:直接为第 1、2、3……个位置提供不同表示。早期 Transformer 常使用固定的正弦、余弦函数,也可以学习一张位置向量表。

相对位置编码:更关注两个 token 相距多远、谁在谁之前。现代大模型常采用类似旋转位置编码(RoPE)的做法,使注意力在比较 token 时带上相对位置信息。

前者像记住每个人的座位号,后者更像记住“我在你左边两格”。

它和长上下文有什么关系

模型训练时见过的位置范围有限。若推理时给它远超训练范围的超长文本,位置表示可能失真,注意力更难稳定地关联遥远内容。这是长上下文并非只靠“把窗口调大”就能解决的原因之一。

即使模型支持很长的上下文窗口,也应把最关键的资料放在清晰位置,用标题和结构帮助模型定位;长文档最好检索相关片段,而不是期待它平均关注每一页。

为什么它对代码特别重要

代码高度依赖顺序:一个 else 对应哪个 if、变量在定义前能否使用、函数调用的参数位置是什么。位置编码帮助模型理解这些序列关系,但不等于它拥有真正的编译器能力。因此 AI 生成代码仍应运行测试和类型检查。

总结

位置编码让 Transformer 在并行处理 token 时保留顺序感:词向量回答“是什么”,位置编码回答“在哪里”。它是大模型理解语言、代码和长序列的基础之一,也解释了为什么长上下文需要额外的模型设计与良好的信息组织。