从0训练LLM · 现代大模型体系 阅读 + 实验 ≈ 20 分钟 页内实验 ×1
C2 位置:模型怎么知道顺序 第 1 课

同样三个 token 换个顺序,模型分得出来吗?

顺序从哪来
「小明打了小王」和「小王打了小明」切出来是同样三个 token。只有 Embedding 和注意力的模型分不开这两句话——这一课在浏览器里把那个恰好等于 0 的差值算出来。
❓

本课一问:「小明打了小王」和「小王打了小明」切出来是同样三个 token,只是顺序不同,意思完全相反。一个只有 Embedding 和注意力的模型,分得出这两句话吗?

这一课先不碰:位置信息具体怎么编码(第 2–4 课)、因果掩码(C3 讲,本课只在末尾预告一句)、多层堆叠(C4)。

从已有出发

C1 结束时,一句话已经变成了一个矩阵:切分 → Token ID → 查 Embedding 表,每个 token 一行 5,120 维向量。贯穿本章的两句话,用锚点模型 Qwen3.8 的真 tokenizer 切出来是这样:

句子切出的 tokenToken ID(Qwen3.8 真 tokenizer)
小明打了小王小明 · 打了 · 小王115942 · 111327 · 126835
小王打了小明小王 · 打了 · 小明126835 · 111327 · 115942

两句话用的是同一组 ID,只是排列不同。Embedding 查表只认 ID:ID 115942 不管出现在句首还是句尾,查到的都是表里同一行。所以进入模型的是同样三个向量,只换了排列顺序。

从已有出发 · 累计数据流 点已学环节看形状与参数
解码层

流水线里「位置」这一环就是本章要补的。补之前,先证明它非补不可:假设模型里只有 Embedding 和注意力,看它能不能自己分清先后。

先自己设计:什么都不加,直接让 token 互相看

注意力要到 C3 才细讲,这一课只需要它的一个事实:第 i 个位置的输出,是所有 token 的 v 向量按权重加起来;权重来自 qi 和每个 kj 的点积,再过 softmax。而 q、k、v 都是各自 token 的向量乘一个矩阵得来的。把公式逐项拆开看,顺序在哪一项丢掉的:

单头注意力的输出(C3 会从头推导它;这里只看它和顺序的关系)
= ( / √d)
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
WQ、WK、WV 是训练出来的参数,但它们对每个位置都一样——这一点决定了下面的结论对任何训练结果都成立。

公式看完,亲手跑一次。下面每个数都在你的浏览器里现算:

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案不加任何位置信息,直接做注意力
不加位置信息,交换顺序,真算一次注意力
看输入:每个 token 的 4 维向量与 WQ/WK/WV(教学构造)
先预测:交换成「小王打了小明」之后,「小明」这个 token 的输出向量会变吗?

🎯

试三件事:① 先按「会变 / 不会变」做预测,再对照三个差值;② 看两句话的权重矩阵:句子 B 的那张,就是句子 A 的那张把行和列按同一顺序换了位置——数值一个没变;③ 连点几次「换一组随机向量」,差值始终是 0。这说明它不是这组数字碰巧,而是运算结构决定的。

为什么差值恰好是 0:置换等变

把上面的现象写成一行代数。用 P 表示「把行重新排列」的矩阵(句子 A → 句子 B 就是一个这样的 P):

结论:置换输入,只会同样地置换输出 。数学上这叫置换等变。每个 token 得到的输出只取决于「句子里有哪些 token」,和它们的排列无关。

页面上的差值是精确的 0,还要多一个条件。浮点加法不满足结合律,(a+b)+c 和 (c+b)+a 可能差最后一位。为此,组件里对 j 的求和一律按 token ID 的固定顺序相加。换成 numpy 直接相加,差值是 2.2×10−16 级的舍入误差,数学上仍然恰为 0。

⚠

常见误解:「注意力训练久了,会自己学到顺序。」

不会。上面的推导对任何 WQ、WK、WV 都成立,而训练只能改这些矩阵里的数值,改不了「逐行乘矩阵 + 对集合求和」这个结构。没有位置信息进来,训练多少步,「小明打了小王」和「小王打了小明」里的每个 token 都得到同一个输出。要让模型分清先后,只能从外部把位置放进去:放进输入(第 2、3 课)、放进注意力的打分(第 4 课),或者靠掩码这类结构间接透露(第 5 课)。

有一个常见说法:「没有位置编码时,Transformer 看到的是一袋词。」它只能当入口用,要配上精确映射和失效点:

🔍 打开因果掩码会怎样?(第 5 课兑现)

上面的演示里勾选「加因果掩码」:每个位置只能看自己和前面的 token。句子 A 里「小明」排第 0,只能看到自己;句子 B 里它排第 2,能看到全部三个。能看到谁随位置变了,所以输出也变了,差值不再是 0。也就是说,掩码本身就透露了一点位置线索。GPT 这类模型都带掩码,那它们是不是不需要位置编码?第 5 课会拿真实模型的选择来回答:「不加位置编码(NoPE)」并不等于「完全不知道位置」,可是 2026 年的主流模型大多仍然保留了 RoPE。本课先关掉掩码,看最干净的情形:注意力运算本身对顺序没有感觉。

位置编码的演进,你在这里

位置编码的演进:每一代都被上一代的某个真数字逼出来
  1. 起点 不加任何位置信息 Vaswani 2017 §3.5 的前提 你在这里
    解决了注意力对所有 token 一视同仁,一次矩阵乘并行算完。
    卡在交换「小明打了小王」为「小王打了小明」,每个 token 的输出向量逐位相同,差值 = 0(第 1 课在浏览器里实算)。
  2. 朴素 ① 把编号直接加进向量 最容易想到的做法
    解决了每个位置一个不同的数,简单直接。
    卡在编号没有上限:在位置 37,内容只剩位置信号的 2.7%(内容 RMS = 1 时;按项目初始化尺度只剩 0.054%)。
  3. 第一代 可学习的绝对位置向量 GPT-2 等
    解决了位置也查表,和词向量一样训练出来。
    卡在表有多少行就只能处理多少个位置:GPT-2 的位置表 1,024 行 × 768 维 = 786,432 个参数,位置 1,024 没有对应的行。
  4. 第一代 · 公式版 Sinusoidal 正弦位置编码 Vaswani 2017
    解决了不背位置,用多组 sin/cos 现算,任意位置都算得出来;两个位置编码的点积只依赖距离。
    卡在「算得出」不等于「会用」:原文表 3 里它和可学习位置几乎一样(dev PPL 4.92 vs 4.92,BLEU 25.8 vs 25.7);而且加在输入上,整句平移后注意力分数会变。
  5. 第二代 相对位置(在注意力里按距离加项) Shaw 2018、T5 等
    解决了直接告诉注意力「相隔多远」,语言规律在文章各处一样。
    卡在要改注意力的计算,为每个距离单独加一项,距离还被截断在 [rmin, rmax] 之内(RoFormer §2.3 的综述)。
  6. 第三代 RoPE 旋转位置编码 Su et al. 2021
    解决了按位置旋转 Q、K,转完再点积,绝对位置被约掉,只剩 n − m;不加参数。
    卡在能算到任意长,却只在训练见过的角度内可靠:Qwen3 原生 32,768,64 个频率对里有 24 对一圈都没转满;Qwen3.8 原生 262,144,32 对里有 10 对。
  7. 解决了把新位置折算回见过的范围:Qwen3 32,768 → YaRN ×4 = 131,072;Qwen3.8 262,144 → ×4 ≈ 1M。
    卡在窗口 ≠ 有效长度:Qwen3.8-Flash-Next 技术报告自报,8 针 MRCR 在 128K 为 97.14,到 1M 只剩 20.71(全注意力版本)。
  8. 2026 分歧 部分 RoPE,还是干脆不要(NoPE) 2025–2026
    解决了Qwen3.8 只转 25% 的维度;Kimi K3、GLM-5.3-Flash 的全局注意力层不用任何位置编码,顺序交给线性注意力层。
    卡在Qwen 报告:全注意力层去掉 RoPE,预训练看不出差别,后训练后「停不下来」的比例明显升高——所以它保留了 RoPE。两条路线都做到了百万级上下文,没有唯一正解。
数字口径:GPT-2、Qwen3、Qwen3.8 的数字由 frontier-models.json / anchor-model.json 的官方 config 在构建时现算;表 3 数字出自 Vaswani 2017(本地 PDF);MRCR 数字出自 Qwen3.8-Flash-Next 技术报告表 3(官方自报,未经第三方复现);Qwen 的 NoPE 结论同一报告,只有定性描述。

证据三问

问本课的回答
① 它解决什么问题?这一课本身是「问题」:证明位置信息必须从外部注入,否则同一组 token 的任何排列对模型都一样
② 数学上为什么?置换等变:Attn(PX) = P·Attn(X),对任意参数成立
③ 实验上呢?不需要实验来支持:它是恒等式。页面上换任意随机向量都得到 0,只是在演示这个恒等式

一句话

📌

注意力只看「有哪些 token」,不看「谁在前」:不注入位置信息,换个顺序只会把输出换个顺序。

🚦

先停在这里:如果你只想知道「为什么需要位置编码」,读到这里就够了,直接去下一课。
再深一层:展开上面的「打开因果掩码会怎样」,再在演示里勾选掩码,看差值怎么变。

下一个缺口

那就把位置告诉它——最直接的办法是什么? → 第 2 课:直接把位置编号告诉模型,行不行?

两处回扣先记下:公式里 q、k、v 从哪来、为什么用点积打分,C3 第 1–2 课兑现;掩码透露位置线索这件事,本章第 5 课兑现。

你可能会问