从0训练LLM · 现代大模型体系 导读 6 课 + 1 条岔路 + 1 节实验课 ≈ 4.5 小时
C11 更大更省:MoE、线性/稀疏注意力与长上下文 章导读

更大更省:MoE、线性/稀疏注意力与长上下文

C10 让放不下的模型跑了起来。这一章问另一件事:参数要更多、上下文要更长,但每个 token 的计算和显存不能跟着等比例涨。FFN 那边用 MoE 把「参数」和「每个 token 的计算」分家;注意力那边用线性注意力和稀疏注意力把 KV 与计算从长度里解放出来——锚点 Qwen3.8 另外 48 层就在这里揭晓;训练那边用「先短后长」把长序列的成本压到预算的一小角。

主线定位

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

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

贯穿例句仍是「小明把苹果给了小王」,Qwen3.8 真 tokenizer 切成 5 个 token:小明 · 把 · 苹果 · 给了 · 小王。它在第 1、3、4 课和岔路课里被继续加工;负载均衡、稀疏注意力和长度课程这三件事要么是整批统计量、要么只在长序列上才有意义,那几课会写明为什么换例子。

本章问题链

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

课这一课的问题朴素方案在哪个真数字上失败一句话
第 1 课更多参数,但不要更多算力?dense 放大到 2.4T:每 token 前向约 4.84 TFLOPs,是锚点 27B 的 94 倍MoE 让容量跟着专家总数涨、每 token 的计算只跟着 k 涨;但所有专家的权重都得常驻显存
第 2 课专家为什么抢活、闲置?不做均衡的微训练:一个专家拿走 74.4% 的 token,两个几乎为 0路由会自我强化地偏心;偏置只改「选谁」、不碰梯度;统计范围比「用不用 loss」更要紧
第 3 课专家该大还是小?16 选 2 只有 120 种组合专家切细,同样的参数和计算拼出多得多的组合;共享专家不是共识
第 4 课长文本的 KV 还能再压吗?(揭晓另外 48 层)只加不减的线性注意力:同一个键写两次,读回两个值之和先擦后写、每步衰减的固定状态;锚点 3:1 把 KV 降到 1/4,代价是容量有限
第 5 课稀疏注意力省了什么,没省什么?DSA 只读 2,048 条,KV 一条不少:每 token 48,068 字节按内容挑 top-k 省计算不省 KV;要省内存得压序列、压层、压精度
第 6 课训练 4K,使用 128K?从头长训:64 层全注意力在 128K 时每 token 训练成本是 4K 时的 2.95 倍先在短序列上学语言,最后用很少的 token 把长度拉上去;注意力变便宜后,课程也在缩短
岔路只预测下一个 token,是不是太短视?—MTP 让每个位置多学一个更远的目标,推理时还能当草稿;它是可以拆掉的辅助项
实验课4 个专家在我们自己的模型上抢活吗?—同一模型只改均衡方式:先预测,再看负载与 loss,连同比较口径一起报告

演进地图

本章演进图:每一代都被上一代的某个真数字逼出来
① 更多参数,不要更多算力(MoE)
  1. 朴素 dense 直接放大 算力 ∝ 参数
    解决了结构最简单:所有参数对每个 token 都生效。
    卡在锚点 Qwen3.8-27B 每 token 前向约 51.2 GFLOPs;同家族 2.4T 规模若是 dense,约 4.84 TFLOPs(94 倍)。
  2. 第一代 稀疏门控 MoE Shazeer 2017 → GShard → Switch
    解决了每个 token 只算 top-k 个专家:Qwen3.8-2.4T-A95B 每 token 约 186.5 GFLOPs,是同参数 dense 的 26 分之一。
    卡在路由会自我强化地偏心:8 个专家全挤到 1 个时,Switch 负载损失从 0.01 升到 0.08;所有专家的权重仍要常驻显存。
  3. 改进 ① 辅助损失 α·N·Σf·P Switch 2021(α = 10⁻²)
    解决了把「均衡」写进 loss,路由器被梯度推向均匀。
    卡在α 难调:太小拉不平,太大干扰主 loss(Switch 在 10⁻¹ 到 10⁻⁵ 之间扫;Wang 2024 的出发点)。
  4. 改进 ② 无辅助损失偏置 Wang 2024 → DeepSeek-V3
    解决了偏置只改「选谁」,不进门控、不产生干扰梯度;DeepSeek-V3 前 14.3T token 用 γ = 0.001,最后 500B 设为 0。
    卡在固定步长在近千个专家时太慢或来回震荡(Kimi K3 报告)→ Quantile Balancing;而且统计范围(整批 vs 单条序列)比「有没有 loss」更要紧。
  5. 改进 ③ 细粒度专家 + 共享专家 DeepSeekMoE 2024
    解决了同参数同计算,16 选 2 的 120 种组合变成 64 选 8 的 4,426,165,368 种;共享专家装公共知识。
    卡在显存账不减:Qwen3.8-2.4T 路由专家占主干参数 97.98%,BF16 权重 4.89 TB。
  6. 2026 极高稀疏度与分歧 Qwen3.8 · K3 · V4.1
    解决了Qwen3.8-2.4T 512 选 10 + 1 共享;K3 896 选 16 + LatentMoE + Quantile Balancing;V4.1 图文两套偏置。
    卡在共享专家 0、1、2 个都有人用(Qwen3 一个不设),稀疏度从 32 到 64 都有(GLM-5.3 与 V3 为 32、GLM-5.3-Flash 36、K2 48、Qwen3.8 51、K3 56、V4.1-Flash 64)——都是实验选择。
② 长文本:KV 与计算不再随长度等比例涨
  1. 解决了每个 token 都能精确回看任意一个前文 token。
    卡在KV ∝ 长度:锚点若 64 层全是全注意力,262,144 token 时 64 GiB。
  2. 第一步 线性注意力 Katharopoulos 2020
    解决了去掉 softmax,求和提前累加成一个固定大小的状态,与长度无关。
    卡在只加不减:同一个键写两次,读回的是两个值之和;状态最多装 d 对互不干扰的键值(C0 岔路)。
  3. 第二步 Gated DeltaNet · 3:1 混合 Schlag 2021 → Yang 2024 → Qwen3-Next、3.8
    解决了写前先擦(delta)、每步衰减(门):锚点 48 层状态共 144 MiB(FP32)、与长度无关;KV 降到四分之一(262,144 时 16 GiB 对 64 GiB)。
    卡在剩下四分之一的全注意力层仍按长度涨;容量有限,3:1 是实验选出来的。
  4. 工程化 KDA + 衰减下界 Kimi Linear → K3 → GLM-5.3-Flash 等
    解决了每通道一个衰减;g_min = −5 让 16 token 块内累积不低于 −80,e⁸⁰ ≈ 5.5 × 10³⁴ 在 BF16 范围内(上限约 3.4 × 10³⁸),慢路径删除。
    卡在MiniMax M1 用线性混合、M2 又退回全注意力:大规模下多跳推理缺陷、训练受访存限制、低精度与缓存难题(官方博客)。
  5. 另一条路 稀疏注意力 DSA DeepSeek-V3.2 2025
    解决了lightning indexer 每个 query 只挑 top-2048 条做核心注意力。
    卡在省计算不省内存:KV 一条不少,每 token 48,068 B;indexer 本身仍要扫全部前文。
  6. 2026 压序列 + 压层 + 压精度 DeepSeek-V4 CSA + HCA → V4.1 CSA2 + CED
    解决了V3.2 每 token 48,068 B → V4-Flash 3,514 B → V4.1-Flash 890 B(1M 时 0.87 GiB)。
    卡在是近似:V4.1 自陈 Bounded Replay「数学上不等价」、选择误差可能在未测过的边界情况退化。
③ 训练 4K,使用 128K
  1. 解决了推理时把新位置折算回训练见过的角度范围。
    卡在零样本外推有代价,方法的超参数带着它被调出来时的规模(C2 第 5 课与项目实测)。
  2. 朴素 从头就用长序列训 最直接的想法
    解决了训练与使用同一个长度,不需要任何折算。
    卡在注意力项随长度涨:Qwen3-32B(64 层全注意力)在 131,072 时注意力项是 6N 的 215%;早期长序列还带来梯度方差极端值(Li 2021)。
  3. 现代做法 先短后长 + ABF BERT → Llama 3 → DeepSeek-V3 · Qwen3
    解决了DeepSeek-V3 的 14.8T token 全在 4K,之后两段各 1,000 步扩到 32K、128K,只占全部训练 token 的 0.84%;Llama 3 405B 六段、约 800B token。
    卡在长序列阶段的数据要专门配(长度上采样、领域均衡、合成跨全文任务)。
  4. 2026 分歧 课程在缩短 Kimi K3 · DeepSeek-V4.1
    解决了K3:8K → 64K → 256K → 1M(NoPE 也照走课程);V4.1 注意力从头就是压缩稀疏的,直接从 64K 起训。
    卡在各家配方大多只公开阶段、不公开每段 token 数,无法横向比较成本。
  5. 岔路 多 token 预测 MTP Stern 2018 → Gloeckle 2024 → DeepSeek-V3
    解决了每个位置多学一个更远的目标;推理时当草稿,接受率 α 时每步期望产出 1 + α 个 token。
    卡在DeepSeek-V3 第 2 个 token 接受率 85%–90%,实测 1.8 倍 TPS;V4.1 预训练干脆去掉 MTP,没有公开消融。
数字口径:锚点、Qwen3.8-2.4T、Qwen3-32B、DeepSeek 各代的数字由 anchor-model.json / frontier-models.json(DeepSeek-V3.2、V4-Flash 取本章补充 config)在构建时现算;KV 字节按 FlashMLA 官方 README 的缓存格式计(indexer key 为推算,见第 5 课);FLOPs 只数矩阵乘,乘加记 2。Switch α、DeepSeek-V3 的 γ 与长上下文两段、K3 的 g_min 与长度课程出自各自原文(本地 PDF 已核);MiniMax 的理由出自其官方博客(2025-10-29)。

三层交互

层本章里的组件在哪一课
概念动画路由选择链逐步展开(分数 → 索引 → 掩码 → 门控);4 × 4 状态逐步写入;稀疏选择链;层排布条第 1、4、5 课
算法模拟器(真算法、小数据)4 个专家的浏览器内微训练(不均衡 / 辅助损失 / 偏置 / Quantile Balancing,真梯度下降);QB 逐步求解;专家切细的组合数;加法 / delta / 门控 delta 三种写法;DSA 式 top-k 召回;两本账、混合栈账本、KV 阶梯、长度成本,全部由官方 config 现算第 1–6 课、岔路
真模型 / 真数据我们自己从 0 训练的 4 专家 MoE:三种均衡方式的逐层负载与 val loss(真实日志回放);Qwen3.8-27B / 2.4T、DeepSeek V3 / V3.2 / V4 / V4.1、Kimi K3、GLM-5.3 的官方 config;HF transformers 的 Qwen3.5 源码;贯穿例句的真 token第 1–5 课与实验课

项目推进:给我们的模型换上 MoE

对应 04-实践项目/MILESTONES.md 的「C11 MoE 与长上下文」。代码 AI 来写,决策你来做。MoE 模块(n_experts、moe_top_k、moe_aux_loss_coef、moe_bias_update_rate)、逐层负载日志与对照脚本 experiments/exp_c11_moe.py 已经写好,实验导出本章组件读取的 c11-moe.json。

🧭

你要拍板的三件事

  1. 和稠密模型比,用什么口径?项目里每个专家和稠密 FFN 一样宽,于是 MoE 的总参数和激活参数都比稠密大。「总参数相同」「激活参数相同」「训练 FLOPs 相同」三种口径,结论可能完全不同(第 1 课、实验课)。
  2. 负载均衡用辅助损失还是偏置更新?理由要同时引用负载曲线与 val loss,并说明差距是否超出重跑噪声(第 2 课、实验课)。
  3. 长上下文怎么训?C2 给出了训练 128、读 512 的零样本缩放结果;续训(init_from)还没排期。写下你会怎么排长度课程、每段用多少 token(第 6 课)。

验收标准(全部可测):

项目实测 · 验收表(稠密 vs 三种均衡方式)

坑与带走

坑症状后果怎么办
以为 MoE 省显存按激活参数估显存,上机就爆2.4T 的权重 BF16 要 4.89 TB显存按总参数算;MoE 省的是每 token 的计算(第 1 课、C9、C10)
MoE 与稠密比较不写口径「MoE 更好」的结论换个口径就反过来决策失误写明总参数、激活参数、训练 FLOPs 三个数(第 1 课、实验课)
不做负载均衡某几个专家长期触顶、另几个接近 0死专家 = 白花了参数;专家并行时所有卡等最忙的那张辅助损失或偏置;看负载曲线,不只看 loss(第 2 课)
把偏置乘进门控输出随偏置变化偏置变成了会干扰学习的参数偏置只进「选谁」,门控仍用原分数(第 2 课)
均衡范围太细(按单条序列)专家学不出领域分工效果变差按整批 / 全局批统计(DeepSeek-V3 §4.5.3、Qwen3)(第 2 课)
按 MPS 的动态形状分发 token每步重编译,60 步用了 107 秒训练慢到不可用小实验用「每个专家都算、乘掩码」的固定形状实现(项目实测 6.6 秒)(实验课)
以为线性注意力在任何长度都更省短请求显存反而更大部署估算失误锚点交叉点 768 token;短于它,固定状态比 KV 还大(第 4 课)
以为 GDN 层也做 RoPE读不懂源码、改位置编码改错层长上下文扩展失败只有全注意力层旋转 Q、K;GDN 不接收位置编码(第 4 课)
以为稀疏注意力省显存1M 上下文照样爆选型失误DSA 省计算不省 KV;要省存储得压序列 / 层 / 精度(第 5 课)
直接横比「每 token KV 字节」不同精度、不同层数混在一起比结论失真对齐精度、是否含索引器、滑窗与固定状态是否另计(第 5 课)
从头就用长序列训每步成本翻倍,早期还不稳预算浪费先短后长;长序列阶段只占预算的一小角(第 6 课)
以为 NoPE 模型不需要长上下文训练长度外推「能跑」但用不好长文能力缺失K3 用 NoPE 照样走四段课程(第 6 课)

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

深入这一章

每条都在 2026-09-26 实际打开核对过:写清它讲清了什么、对应哪一课、为什么推荐。站外资料标「需联网」;本地 PDF 断网可读。spaces.ac.cn 对脚本访问有防护,浏览器里打开正常。

🎮 想更直观 10–30 分钟

先玩本章的组件;下面两条是外部最好的可视化入口
30 min英文需联网 2024-10-07
用几十张图把 dense 层拆成专家、路由器、top-k、辅助损失、专家容量、Switch 的容量因子一路画出来,末尾对照 Mixtral 8x7B 的「激活参数 vs 稀疏参数」。
对应第 1、2 课的直觉层。注意:它讲到 Switch 与 Mixtral 为止,没有无辅助损失偏置、细粒度专家与共享专家(第 2、3 课补)。
10–15 min英文需联网 Gemma 4 26B(Q4_K 量化)· 30 层 × 128 专家 · top-8
用真实模型的路由记录,逐 token 回放每一层点亮了哪几个专家,并累计成热力图;可按写作、经济、历史、软件工程等领域切换提示。
少见的用真模型数据而非示意图做的路由可视化,对应第 2、3 课「专家不是按学科分工」。旧版课程写成了 Gemma 2,本轮打开核实后更正。

🔬 想吃透原理 1–3 小时

唯一必看:Songlin Yang《DeltaNet Explained (Part I)》(Gated DeltaNet 一作本人)。其余按课挑
40 min英文需联网 2024-12-03
从「线性注意力就是带矩阵状态的 RNN」讲起,说明只加不减为什么在按内容回忆上吃力,delta rule 怎么把写入变成「只修正差额」,以及它为什么更擅长上下文检索。
对应第 4 课的核心,作者正是 Gated DeltaNet 论文的一作;全网多数中文资料只转述结论,这篇把每一步为什么这样改讲清了。Part II(分块并行算法)、Part III(QK 归一化、短卷积、混合模型)按需再读。
各 30–40 min中文需联网 2025-02-08 / 02-21 / 03-05;第 2、3 篇:spaces.ac.cn/archives/10735、10757
第 1 篇把 FFN 写成 n 个向量之和,推出「只挑模长最大的 k 个」就是 MoE;第 2 篇讲辅助损失的来历与 STE 视角;第 3 篇把 Loss-Free 的偏置更新解释成对「负载偏离」的梯度下降。
对应第 1、2 课。「偏置为什么只进选择、不进门控」这件事,第 3 篇讲得最透。
按节读 20–60 min英文需联网 2025-07 起持续更新
按模型逐个画架构图:DeepSeek-V3 的 MoE 与共享专家、Qwen3 MoE 为什么去掉共享专家、Qwen3-Next 的专家大小与 Gated DeltaNet 混合、Kimi Linear、DeepSeek V3.2 的稀疏注意力。
对应第 3、4、5 课的横向对照。只读第 1、6、12、14、16 节即可。
30 min英文需联网
用几十行 PyTorch 写出去掉短卷积的简化 Gated DeltaNet,标出 α(衰减门)与 β(写入门),并按公式估算 KV 与固定状态的显存。
对应第 4 课:想把 FormulaAnatomy 里的每一项落到代码上,读这一篇。它明确写了 Qwen3-Next 用每头一个标量的门、Kimi Linear 细到每个通道。
60 min英文需联网 2023-12-11
从 1991 年的思想、Shazeer 2017、GShard、Switch 到 ST-MoE,含负载均衡、容量因子、微调与服务的实证表格。
对应第 1、2 课的历史线;是 2023 年的综述,不含无辅助损失偏置与细粒度专家。
20 min英文需联网 2025-10-29,M2 预训练负责人
一家先用过线性注意力混合、后来退回全注意力的公司自己讲原因:小规模榜单看不出、大规模暴露多跳推理缺陷;评测贵;线性注意力训练受访存限制、对低精度敏感、难兼容前缀缓存与投机解码。
对应第 4 课「为什么不全换成线性层」。负面经验的一手来源很少见;K3 后来逐条给了工程回答。

📄 想读原文 按需

有本地 PDF 的直接打开(断网可读);其余链 arXiv 或官方仓库(需联网)
Fedus et al. 2021
§2.1 top-1 路由与式 (2);§2.2 容量因子与式 (4)–(6) 的负载均衡损失、α = 10⁻² 与扫描范围;同 FLOPs 预训练最高 7 倍加速。
第 1、2 课的主要出处。
DeepSeek-AI 2024
§2.1.2 细粒度专家 + 共享专家、无辅助损失偏置式 (16) 与序列级损失;§2.2 串行 MTP;§4.2–4.3 γ、α、λ 的取值与 4K → 32K → 128K 两段扩展;§4.5.2–4.5.3 两组消融;§5.4.3 MTP 接受率。
第 1、2、3、6 课与岔路课反复引用的原文,每处只有半页。
DeepSeek-AI 2024
236B / 21B 的 MoE:相对 67B 训练成本 −42.5%、KV −93.3%、最大生成吞吐 5.76 倍。
第 1 课「dense → MoE 的算力账」的一手数字。
Kimi Team 2026
§2.1.1 KDA 的下界衰减 g_min = −5(式 5)、NoPE 的 Gated MLA;§2.3 LatentMoE 与 Quantile Balancing(式 13–14、图 5);§3.3–3.4 8K → 64K → 256K → 1M。
第 2、4、6 课。图 5 画的是一步更新的机制,不是「一步到位」的保证(第 2 课实算)。
DeepSeek-AI 2026
CSA(m = 4、top-k)与 HCA(m′ = 128)的压缩与稀疏选择;1M 下相对 V3.2 的 FLOPs 与 KV(V4-Flash 10% / 7%);4K → 16K → 64K → 1M 的长度课程。
第 5、6 课。
Zhipu AI 2026
MLA + DSA 的「采用」(adopts)与训练细节;IndexShare 不在这份报告里(它是 GLM-5.2 的新增,出自 IndexCache)。
第 5 课的归属核对。
DeepSeek-AI 2026-09需联网
CSA2 + CED + FP4 KV:全局 KV 890 B/token、约 V4-Flash 的 1/4、67B 的 1/437;4K → 1M decode FLOPs 只多 1/4;64K 起训、34T 时扩到 1M;去掉预训练 MTP。
第 5、6 课与岔路课。本地论文库暂无 PDF。
Shazeer 2017 等需联网
Shazeer 2017(arXiv 1701.06538)稀疏门控;GShard(2006.16668)top-2 与 600B;DeepSeekMoE(2401.06066)细粒度 + 共享;Loss-Free Balancing(2408.15664);Qiu 2025 全局 batch LBL(2501.11873);Qwen3 技术报告(2505.09388)。
第 1–3 课的出处链,每篇读摘要与方法节即可。
Yang et al. 2024 等需联网
Gated DeltaNet(2412.06464);Katharopoulos 2020《Transformers are RNNs》(2006.16236);Schlag 2021 delta rule(2102.11174);Kimi Linear(2510.26692);混合注意力的表达力分层(2602.01763);Qwen3.8-Flash-Next 技术报告(GitHub QwenLM/Qwen3.8-Flash-Next)。
第 4 课的出处链。
DeepSeek-V3.2 等需联网
DeepSeek-V3.2 的 DSA(2512.02556);IndexCache(2603.12201);HISA(2603.28458);Llama 3(2407.21783)的 6 段长度课程;ABF(2309.16039);Fu 2024 的 128K 数据工程(2402.10171);Gloeckle 2024 MTP(2404.19737)。
第 5、6 课与岔路课的出处链。
🚫

排除了什么(也是筛选标准):① CSDN《DeepSeek 核心策略解析:为何 MoE 负载均衡是关键选择?》(2025,面试题体)——例题把加了偏置之后的分数 0.39 直接乘进专家输出算出 124.5,正好和 DeepSeek-V3 式 (16)「门控值仍由原始分数得出」相反,文末是课程广告;② CSDN《【深度拆解 Qwen3-Next】Gated DeltaNet 线性注意力的实现与优化》(2026-01)——源码逐行注释有参考价值,但开篇把固定状态说成「内存占用仅呈线性增长」「彻底解决长文本卡顿」,且讲的是 Qwen3-Next 旧版的合并投影(in_proj_qkvz),与 Qwen3.5 / 3.8 的写法不同;③ 旧版课程的 RouteCompareDemo 里「1M 时 GLM 56% / K3 26% / V4 3%」——常数是示意值、K3 一列还漏乘了潜向量折扣,本章改由官方 config 现算;④ 旧版课程里 IndexShare 的「1.82× / 1.48×」——2026-09-26 已在 IndexCache 原文核到(arXiv 2603.12201 摘要与表 1,需联网):那是 30B 的 DSA 模型、200K 上下文、只保留 1/4 索引器时的 prefill 与单请求 decode 加速,不能拿来给 GLM-5.2 的 1M 背书,所以本章不当作 IndexShare 的收益引用(口径见 C14 岔路)。