Attention→K3 三十天课 · Day 12 / 30 课程首页 面试视角 自测题
Day 12 · 位置编码

位置编码:为什么大模型天生不分前后顺序?

RNN 天生按时间步串行处理,所以自带前后顺序感;但 Transformer 为了并行,把所有 token 一股脑扔进了矩阵。这时出现了一个诡异的 Bug:如果你把「猫追狗」打乱成「狗追猫」,自注意力算出的结果居然完全相同!为了让模型感知语序,作者给每个 token 发了一张神奇的「正弦波座位号」——位置编码(Positional Encoding)。

学完你能回答
为什么纯自注意力会「不分前后」(置换不变性)?
学完你能回答
正弦余弦波是怎么巧妙表达「相对距离」的?
学完你能回答
为什么 2017 正弦编码后来被 RoPE 淘汰了?

1起点:这些你早就会了

位置编码的设计哲学,就像电影院里的排座系统:

你已经会的AI 世界里对应的东西
菜篮子买菜:先放番茄还是先放鸡蛋,篮子里东西完全一样置换不变性(Permutation Invariance):自注意力对输入顺序天然脱敏
电影票座位号:「3排5座」贴在每个观众身上位置编码(Positional Encoding):直接把位置向量加进词嵌入中
时钟指针:秒针转得极快、分针转得慢、时针几乎不动几何级数波长:高频正弦波区分相邻细微距离,低频波刻画全篇长距离
三角公式:cos(α + β) = cos α · cos β − sin α · sin β相对距离线性变换:固定偏移 k 的位置编码可以由当前编码线性表示
排队时不说「我是 37 号」,而说「我前面还有 3 个人」相对位置:比起绝对排位,语言规律更依赖两个 token 之间隔了多远
死记硬背某句话在课本第 58 页,换一本页码不同的书就找不到绝对位置编码的外推短板:只见过训练长度的编号,遇到更长文本就失灵

2致命 Bug:自注意力天生是「词袋」

考虑两个语义完全相反的句子:

核心机制:内积与集合性质
在纯自注意力计算中,每个 token 的 Q 都要去和序列中所有 token 的 K 做点积并加权汇总。

如果没有位置信息:
• 对「追」这个 token 来说,输入池里都是一个「猫」向量和一个「狗」向量;
• 无论「猫」排在第 1 位还是第 3 位,算出来的内积得分和加权输出绝对一模一样!

严格来说:纯 Transformer(不考虑因果掩码时)本质是一个无序集合处理器(Set Processor)。如果不强行注入位置信息,它根本分不清谁主谁宾!
置换不变性:没有位置编码时,语序打乱输出不变 左侧猫追狗和右侧狗追猫,在无位置编码时得到的自注意力矩阵完全相同 没有位置编码时:自注意力是「盲人摸象」(无法感知语序) 输入 A: 「猫」 「追」 「狗」 输出表示 = 集合 {猫, 追, 狗} 汇总 ≡ 输入 B: 「狗」 「追」 「猫」 输出表示 = 集合 {狗, 追, 猫} 汇总
图 12.1:置换不变性(Permutation Invariance)。不加位置编码,模型就把自然语言降级成了无序词袋。

3给每个 token 发座位号:正弦与余弦几何级数

为了注入位置,2017 论文在输入嵌入层(Embedding)上直接加(Add)了一个同维度的位置向量 PE:

最终输入向量 = Word Embedding + PE

PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))

其中 pos 是 token 在句子里的排位(第 0, 1, 2... 个),i 是特征维度的索引(第 0 到 255 维)。

核心类比:多频率时钟指针
为什么公式里会出现 10000^(2i/d_model)?
• 当 i=0 时,分母是 1,正弦波波长是 2π ≈ 6.28,像秒针一样疯狂震荡——用来精细分辨第 1 个 token 和第 2 个 token 的微小差异;
• 当 i 逐渐增大,波长呈几何级数急剧拉长,直到最大波长变成 10000 × 2π ≈ 62800,像时针一样极其缓慢地变化——用来感知长篇大论中宏观的全局距离。

严格来说:时钟指针是连续走动的,而位置编码只是在每个整数排位上对正弦波「采样取值」——单个维度并不唯一(波长 2π 的维度每隔约 6 个 token 就重复一圈),靠的是 512 个维度组合起来才几乎不会撞号。

4数学巧思:为什么三角函数能天然感知「相对距离」?

作者之所以不用简单的一维数字(如 1, 2, 3...),也不用纯随机编号,是因为三角函数自带一条奇妙的数学性质:两角和差公式。

和差化积的线性变换 根据三角恒等式:
cos(α + β) = cos α · cos β − sin α · sin β
sin(α + β) = sin α · cos β + cos α · sin β

对于任意固定的相对偏移距离 k(比如两个 token 相隔 5 个位置):
PE(pos + k) = M_k · PE(pos)
其中 M_k 是一个只和相对距离 k 有关的常数旋转矩阵!

物理意义:模型只要在注意力矩阵里做简单的内积,就能自然感知两个 token 之间相对隔了多远,而不需要死记硬背它们各自的绝对排位!
进阶小注 ·为什么正弦和余弦要成对出现?同一频率的 sin 与 cos 各占一个维度(2i 与 2i+1),两个分量配合才能凑出完整的旋转矩阵——只留下一个的话,相差半个波长的两个位置会读出相同的值,相对偏移就算不准了。

52017 论文的乐观假设与后续淘汰(伏笔)

在 2017 年论文的消融实验中,作者对比了「正弦固定编码」和「可学习位置嵌入(Learned Embedding)」,发现两者在 WMT 翻译任务上效果几乎平手。作者在论文里写下一句著名推测:「我们选择正弦版本,是因为它可能允许模型外推到比训练更长的序列。」

后来的事实:绝对位置编码的外推幻象 后来的大模型实践发现:直接把绝对位置加在 Embedding 上的做法,外推能力极差!
• 训练时只见过 2048 长度,一旦测试 4096 长度(长度数字为示意),超出范围的正弦位置直接变成了生疏的噪点,模型性能发生崩溃;
• 这直接促使了后来 RoPE(旋转位置编码,苏剑林/LLaMA) 以及 Kimi K3 采用的 NoPE(无显式编码隐式衰减) 的诞生(我们将在第 3 周 Day 16 深度考古)。

6面试视角

面试视角 · 高频考点
面试官可能会问:「为什么 Transformer 需要位置编码?2017 原版正弦编码的设计逻辑是什么?它有什么缺陷?」
八股答「因为自注意力是置换不变的,不加位置编码分不清顺序。正弦编码用不同频率的 sin/cos 函数,可以通过三角函数线性表示相对位置。缺陷是长度外推性不好,所以后来被 RoPE 替代了。」——答得挺好,如果能把正余弦几何级数波长和绝对相加的缺陷点透就更完美。
本课答「核心分为三层:① 必要性:自注意力基于集合运算,对输入序列具有置换不变性,必须引入位置信息打破空间对称;② 正弦设计的巧妙性:作者构建了一组波长从 2π 到 10000 × 2π 几何递增的基函数,利用三角和差化积性质,使任意固定相对距离 k 的编码可表示为当前编码的线性变换 M_k · PE(pos);③ 历史缺陷与淘汰原因:2017 版将绝对位置以加法(Additive)形式混入输入 Embedding,在深层传播中位置信号被反复稀释,且在自注意力内积时会产生语义-位置交叉杂项,更无法真正外推到未见长度,最终在近十年被将旋转矩阵直接作用于 Q/K 的 RoPE 所全面取代。」

7映射到原文:Attention 论文 §3.5

论文原文对照 · 《Attention Is All You Need》§3.5 位置编码
“Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence… We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, PE(pos+k) can be represented as a linear function of PE(pos).”

逐词翻译:「由于我们的模型不包含循环和卷积,为了让模型利用序列的顺序信息,我们必须注入相对或绝对位置信息……我们之所以选择这个函数,是因为假设它能让模型轻松学会按相对位置关注,因为对任意固定偏移 k,PE(pos+k) 都可以表示为 PE(pos) 的线性函数。」

2π
最高频正弦波的基准波长
62800
最低频正弦波的超长周期
d_model
位置编码向量维度 = 512(论文 base 配置)
+
2017版位置与语义的融合方式(加法)

8自测题(先自己答,再点开看解析)

Q1 什么是注意力的「置换不变性」?
解析:如果不加位置编码,随意打乱输入序列中 token 的物理顺序,自注意力算出的所有输出向量集合完全不变。模型无法感知前因后果。
Q2 2017 原版位置编码是「加」在嵌入上,还是「拼(Concat)」在嵌入上?
解析:是直接相加(Element-wise Add):输入 = Embedding + PE。因此 PE 的维度必须与模型维度 d_model = 512 严格相等。
Q3 为什么正弦位置编码要有不同的频率?波长短和波长长各管什么?
解析:高频短波长(分母小)随位置剧烈变动,负责刻画相邻几个 token 的近距离语序;低频长波长(分母大)平缓变化,负责标识文章开头、中间、结尾的宏观全局位置。
Q4 相对位置编码和绝对位置编码的核心区别是什么?
解析:绝对位置编码给每个 token 打上绝对标号(如第 5 个、第 10 个 token);相对位置编码关心的是两个 token 之间的间距(如相隔 3 个位置),语言语法规律通常更依赖相对间距。
Q5 2017 原版的正弦绝对位置编码后来为什么被 RoPE(旋转位置编码)取代?
解析:原版加法正弦编码直接加在词向量上,深层容易被稀释,且面对未见过的长文本无法良好外推;RoPE 直接在计算 Q 和 K 时通过旋转矩阵注入相对位置,数学性质更纯粹且外推性更优。
《从 Attention 到 K3 · 大模型近十年设计演进》30 天课 · Day 12 / 30 · 返回课程首页