从0训练LLM · 现代大模型体系 导读 5 课 + 1 条岔路 + 1 节实验课 ≈ 3.5 小时
C2 位置:模型怎么知道顺序 章导读

位置:模型怎么知道顺序

Embedding 只说明了每个 token 是什么,没说明它在哪里。这一章从「不加位置分不清顺序」出发,经过直接塞编号、可学习位置、正弦公式,一路被真数字逼到 RoPE,再追到长上下文扩展。

主线定位

累计数据流 · 从文字到下一个 token 的概率 已学本课新增还没学
解码层

点任一已学环节,看这一步的输入 → 输出形状、参数量,以及它解决了什么问题(数字取自 Qwen/Qwen3.8-27B 真实 config)。

本章问题链

每一课只回答一个问题;上一课的失败,逼出下一课的问题。

课这一课的问题朴素方案在哪个真数字上失败一句话
第 1 课同样三个 token 换个顺序,模型分得出来吗?不加位置:两句话里同一个 token 的输出,最大差值恰为 0注意力只看「有哪些 token」,不看「谁在前」
第 2 课直接把位置编号告诉模型,行不行?位置 37 时内容只剩 1/37;GPT-2 的位置表只有 1,024 行编号会淹没内容;位置表有多少行,就只认多少个位置
第 3 课没训练过的位置,能不能用公式算出来?算得出,但越过训练长度 loss 照样变坏(项目实测)位置可以现算,但「算得出」不等于「会用」
第 4 课RoPE 到底旋转了什么?位置加在输入上:整句平移后打分变了(交叉项)转 Q、K,点积里只剩 n − m
岔路RoPE 丢了绝对位置吗?LLM 的设计是证明出来的吗?—用绝对位置去转,在点积里只留相对距离;设计靠三层证据
第 5 课能算出位置编码,就能读懂长文吗?Qwen3 原生 32,768 之内,64 组里有 24 组没转满一圈,直接外推越界越界的是低频组,PI/NTK/YaRN 把它们折算回来;窗口 ≠ 有效长度
实验课三种位置编码在我们自己的模型上比一比—只改一项、跑三个种子、连同条件报告结论

演进地图

位置编码的演进:每一代都被上一代的某个真数字逼出来
  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 结论同一报告,只有定性描述。

三层交互

层本章里的组件在哪一课
概念动画正弦位置编码的 8 根指针(可播放);2D 的 q、k 按位置旋转第 3 课、第 4 课
算法模拟器(真算法、小数据)置换演示(真注意力,3 个真 token);直接加编号的尺度崩塌;加法式与旋转式打分对照;多频率 RoPE(真实 config);长上下文扩展四种做法 + 远程衰减上界第 1、2、4、5 课
真模型 / 真数据我们自己从 0 训练的小模型:四组位置编码、三个种子、128 训练 / 512 测试的真实日志回放;GPT-2、Qwen3、Qwen3.8、DeepSeek-V4.1 的官方 config;Qwen3.8 真 tokenizer 的切分第 2、3、5 课与实验课

项目推进:给我们的模型选位置编码

对应 04-实践项目/MILESTONES.md 的「C2 位置」。分工照旧:代码 AI 来写,决策你来做。位置编码的四种实现、RoPE 缩放(PI / NTK / YaRN)和对照实验脚本 experiments/exp_c2_position.py 已经写好,实验导出本章组件读取的 c2-position.json。

🧭

你要拍板的三件事

  1. 位置编码选哪种,理由是什么?理由要同时引用训练长度之内的 val loss 和超出训练长度之后的表现(第 2–5 课与实验课)。
  2. RoPE 的 base(rope_theta)取 10,000 还是更大?它决定最慢的一组有多慢、哪些组在训练长度内转不满一圈(第 4、5 课的组件可以直接算)。
  3. 如果要支持训练长度 2–4 倍的上下文:直接外推、PI、NTK 还是 YaRN?零样本还是准备续训?

验收标准(全部可测):

项目实测 · 验收用的基线表(三个种子的均值 ± 标准差)

坑与带走

坑症状后果怎么办
位置编码没加或加错「猫追狗」和「狗追猫」输出接近模型对词序不敏感注意力本身没有位置概念,必须显式注入(第 1 课)
把位置编号直接加进向量位置越靠后 loss 越怪内容被位置淹没,位置 37 时只剩 1/37位置要做成有界的向量(第 2 课)
用可学习位置,推理时输入更长越界报错;强行延长后 loss 在训练长度处跳升长输入不可用换成能现算的位置编码,或截断(第 2 课、实验课)
sinusoidal 直接加在很小的 embedding 上训练长度之内就明显更差位置信号淹没内容先把 embedding 乘 √dmodel(原论文 §3.4;我们踩过,第 3 课)
以为 RoPE 加在 embedding 上、以为每一维都转读 config 读不懂 partial_rotary_factor张量形状、参数量都对不上RoPE 在每个全注意力层里转 Q、K;Qwen3.8 只转 64 / 256 维(第 4 课)
相邻配对与 rotate_half 两种写法的权重混用换实现后输出完全乱掉模型等于报废两者差一个固定置换,移植权重要重排 Q、K(第 4 课 Dig)
零样本用 PI 扩长度连训练长度之内的 loss 都变高短文本也变差PI 要续训;零样本优先只压低频的 NTK-aware(第 5 课、实验课)
把「窗口 1M」当「有效 1M」生产环境长文检索翻车高估能力窗口看 config,有效长度看 NIAH / MRCR / RULER(第 5 课)
以为 DeepSeek-V4.1 的 1M 是原生 RoPE 外推高估长上下文可靠性选型失误config:65,536 × YaRN 16 = 1,048,576,是插值扩展的(第 5 课)
把小模型上的实验结论直接搬到大模型结论与论文相反错误决策引用实验结论时带上规模与条件(岔路、实验课)

这一章你应该带走的(各课「一句话」):

深入这一章

每条都实际打开核对过(2026-09-26):写清它讲清了什么、对应哪一课、为什么推荐。spaces.ac.cn 对脚本访问有防护,浏览器里打开正常。

🎮 想更直观 10–30 分钟

先玩本章的组件;下面两条是外部最好的可视化入口
20 min英文需联网 Christopher Fleetwood · 2024-11-25
从 Llama-3.2-1B 里两个 dog 输出完全相同讲起,依次排除「整数编号 → 归一化编号 → 二进制」,推到 sinusoidal,再推出「平移就是旋转」和 RoPE。
和本章问题链几乎同构,对应第 1–4 课,适合学完后用英文再走一遍。注意:文中把 2π·10000 ≈ 6.3 万说成上下文长度的「理论上限」,这个说法不准确(第 5 课讲了低频组越界不等于上限);它也不讲 PI、NTK、YaRN 和部分旋转。
10 min英文需联网 浏览器里跑真 GPT-2 small
页面写明 GPT-2 从头训练自己的位置编码矩阵,并把它和词向量相加;可以看到真实的数。
对应第 2 课的「可学习绝对位置」:看一个真模型里这张表长什么样。它不演示外推,也不涉及 RoPE。

🔬 想吃透原理 1–3 小时

唯一必看:苏剑林《Transformer 升级之路》第 2 篇(RoPE 作者本人)。其余按课挑
40–60 min中文需联网 RoPE 作者 · 2021-03-23
先立下「内积之后只剩相对位置」这个方程,用复数解出来就是旋转矩阵;给出高效实现、θi = 10000−2i/d 的选择,以及用 Abel 变换推出的远程衰减上界。
对应第 4 课,也是第 5 课「远程衰减」的出处。全网多数资料倒着讲结论,他正着推,读完你会知道 RoPE 是被解出来的。
40 min中文需联网 2021-03-08
把注意力分数泰勒展开,分出绝对位置项和相对位置项,并推出正弦编码的远程衰减。
对应第 3 课:「加在输入上,打分里混着交叉项」背后的完整数学。
40 min中文需联网 2023-07-06
把 RoPE 读成 β 进制数:直接外推、线性插值、改 base 分别对应「多写一位」「压缩」「换进制」,推出 NTK-aware 为什么是「高频外推、低频内插」;附作者自己的零样本对照表。
对应第 5 课的 NTK-aware。和我们实验课的零样本结果可以对照着读。
60 min中文需联网 2024-01-26
从「每个频率在训练中转了几圈」推出 YaRN 的分段规则,解释温度系数的来历,并讨论 PI 的局部失真与动态缩放。
对应第 5 课的 YaRN,和本章 RopeScalingViz 是同一个视角。
30 min英文需联网 2021-04-20
复数推导,以及在 125M、1.4B 模型上和可学习绝对位置、T5 相对位置的对照实验。
对应第 4 课与岔路课的「实验验证」一层:一个工程团队怎么验证 RoPE。文中正文与图注的模型规模写法不一致(125M/150M、1.4B/1.5B)。
18 + 17 min中文需联网 E05:BV1qVmYBzE2d
按标题:E04 讲 RoPE 的几何视角、Qwen3 的 RoPE 计算细节、与 interleaved 写法的对比;E05 讲远程衰减的推导、同时编码长短距离、base 与上下文窗口的关系。
对应第 4 课的 Dig(配对写法)与第 5 课的远程衰减。内容尚未核实:两集都没有公开字幕和章节标记,转写因 B 站风控暂停,这里只按标题推荐;核实后可能升为必看。
46 min中文需联网 官方 YouTube;B 站常见的是转载版
讲义明确说自注意力里没有位置信息,要给每个位置加一个独有的向量,可以手工设计,也可以学。
对应第 1、2 课:「位置编码为什么必须存在」讲得最扎实的中文课堂。

📄 想读原文 按需

有本地 PDF 的直接打开;其余链 arXiv 或官方仓库
Vaswani 2017
§3.5 正弦位置编码的公式与选择理由;§3.4 embedding 先乘 √dmodel;表 3 第 (E) 行可学习位置与正弦位置的对照。
第 1、3 课引用的三处原文都在这里,各只有几行。
Su et al. 2021
§3.4 旋转恒等式,§3.4.3 远程衰减上界,表 1、表 5 的实验,§4.5.5 作者自述的局限。
第 4 课与岔路课的出处。先读苏剑林的博客再读论文。
Chen et al. 2023需联网
直接外推时注意力分数可能大到灾难性的程度;插值后的上界小约 600 倍;不超过 1,000 步微调把 Llama 扩到 32,768。
第 5 课「改进一」的出处。本地论文库暂无 PDF。
Peng et al. 2023需联网
NTK-by-parts 的分段规则(α = 1、β = 32)、注意力温度 0.1·ln s + 1,以及比先前方法少用 10 倍 token、2.5 倍步数的结果。
第 5 课「改进三」的出处,也写明了 NTK-aware 为什么仍会让部分维度越界。本地论文库暂无 PDF。
bloc97 · 2023-06-29需联网
「改 base,不改位置」的原始提出,在 LLaMA-7B 上不微调扩到 8K 以上。
第 5 课「改进二」。NTK-aware 出自论坛帖子,不是论文,引用时要写对出处。
Men et al. 2024需联网
从远程衰减的一条新性质推出:目标上下文长度对 base 有一个下限;base 太小时困惑度正常,长距离检索却失败。
第 5 课「另一个旋钮:base 本身」。
Kazemnejad et al. 2023需联网
比较绝对位置、T5 相对位置、ALiBi、RoPE 与不加位置编码,并证明不加位置编码也能表示绝对与相对位置。
第 5 课误解二与岔路课的出处;实验是合成任务上的小模型。
Qwen Team 2025需联网
长上下文阶段在 32,768 长度上用 ABF 把 RoPE base 从 10,000 调到 1,000,000;推理时 YaRN 加 DCA 扩 4 倍。
第 5 课代际对照里 Qwen3 那一行的出处(对话样本里那组 32K → 128K 的数字属于它)。
Qwen Team 2026-08需联网
第 4 页:全注意力层去掉 RoPE,后训练后无限生成比例明显升高;表 3:8 针 MRCR 从 128K 的 97.14 掉到 1M 的 20.71 / 26.44。
第 5 课两个误解的出处。官方自报,未经第三方复现。
🚫

排除了什么(也是筛选标准):① 火山引擎开发者社区《从 ROPE 到 Yarn,一条通用公式速通…》(转载自知乎)——把 NTK-by-parts 讲反了,说高频插值、低频不动;② CSDN《一篇搞明白上下文长度扩展:从 RoPE 到 YARN》——多平台同步的转载,称 YaRN 把 Qwen3-32B「从 40K 扩展至 128K」(原生是 32,768),还有无出处的「99.8%」「显存降低 70%」;③ 博客园《大模型长度扩展:直接外推, PI, NTK-aware…》(2024-07)——目录逐节照搬另一篇 CSDN 文章,未注明出处;④ CSDN《【位置编码速通】从 ROPE 到 Yarn》——返回 521,且是同一篇速通文的转载;⑤ 对话样本引用的转载站 chenshi221.github.io——改为直接引用 Qwen3 技术报告原文。另注:B 站上李宏毅课程多为转载,本章给的是官方 YouTube。