时长 6–7 小时:§1 九讲一条线(0.5h)· §2 Transformer 看图:ViT 与视觉语言模型(1.5h)· §3 扩散语言模型(2h)· §4 回到基础(1h)· §5 效率与交叉(0.5h)· §6 应用、挑战与怎么跟上(0.5h)· §A–§C(1h)
对应正课 Lecture 9:回顾(九讲)、超越”基于 Transformer 的 LLM”(Transformer 用于图像:ViT;视觉语言模型的两种接法;DiT 等)、扩散语言模型(自回归的局限、图像扩散的直觉、掩码扩散、更少的前向次数、优势与挑战)、结语(模态之间的交叉借鉴、回到基础的研究问题、质量–成本前沿、硬件、应用、仍未解决的问题、怎么跟上进展)。学习计划说这一讲”轻松,重点是建立自己的追踪机制”。我们在它的基础上把两个最有技术含量的点讲透:ViT 和掩码扩散。
配套代码
w5day1_checks.py(纯 numpy):ViT 的 token 数与参数量、patch 嵌入 = 步长卷积、视觉 token 的上下文预算、掩码扩散的目标恰好等于所有生成顺序的自回归损失、并行解码的独立性误差、模型坍缩、Muon 的 Newton–Schulz 迭代、解码注意力的算术强度§B 参考实现(
code/目录):w5d1_vit_mdm.py(在合成图形上训练一个小 ViT;在一个有”禁止转移”的马尔可夫链语言上对比掩码扩散模型与自回归模型;用前向–后向算出的”神谕模型”检验损失与解码的实现)。今天的目标:能说清 ViT 怎么把图变成 token、为什么需要大数据;能画出视觉语言模型的两种接法并比较代价;能推出掩码扩散的训练目标(为什么是 1/t)并说清它和 BERT、和自回归的关系;能解释并行解码为什么要用步数换质量;能说出 Lecture 9 列出的几个开放问题;建立一个每周能坚持的论文追踪流程。
§0 这一周在做什么
第 5 周是收尾周:
Day 1 Lecture 9:前沿趋势 九讲回顾 · ViT 与视觉语言模型 · 掩码扩散语言模型 · 回到基础的问题 · 硬件 · 怎么跟上
Day 2 期末考试与错题溯源 2025 期末真题(Lecture 5–8)· 错题溯源表 · 补漏 · 自编模拟卷与详解
Day 3 系统复习(一):全景图 从一个 token 到一个助手 · 一个模型的全部数字 · 官方大纲逐条核对
Day 4 系统复习(二):推导默写 25 个核心推导的提纲、坑与数值验证 · 代码默写练习
Day 5 面试冲刺 答题结构 · 分层题库 · 估算题 · 系统设计题:公司内部知识库问答
Day 6 Capstone 与延伸阶段 三个方向的项目计划 · 实验方法论(种子、误差棒、多重比较)· 四条支线 · 全课总结
这一周的主线:前四周是”学进去”,这一周是”拿出来”:考得出(Day 2)、画得出(Day 3)、推得出(Day 4)、讲得出(Day 5)、做得出(Day 6)。
今天要用到的旧结论:自注意力的置换等变(Week 1 Day 1 §1.5);BERT 的 MLM 与”为什么不能直接生成”(Week 1 Day 6 §4.2、§4.7);自回归分解(Week 0 Day 5 §1.1);KV Cache 与 roofline(Week 1 Day 4 §1.4–1.5);“尺子”视角的优化器(Week 0 Day 2 §1.5);Chinchilla 与数据用完(Week 2 Day 1 §4.3);拒绝采样与可验证奖励(Week 3 Day 5 §2);质量–成本前沿(Week 4 Day 5 §4.5)。
§1 九讲一条线
Lecture 9 用一条时间线把九讲串了起来。下表是它的内容,以及我们在哪里学的:
| 讲 | 主题 | 回答的问题 | 我们的周 / 天 |
|---|---|---|---|
| 1 | Transformer | 怎么让每个词看见整句话?(注意力、Q/K/V、多头、编码器–解码器) | Week 0 全周;Week 1 Day 1–3 |
| 2 | 基于 Transformer 的模型与技巧 | 怎么编码位置、怎么省显存、怎么做理解任务?(RoPE、MQA/GQA、BERT 家族、高效注意力) | Week 1 Day 4–6 |
| 3 | 大语言模型 | 为什么是 decoder-only、怎么把模型做大又不贵、怎么用?(MoE、解码、提示、CoT) | Week 2 Day 1–3 |
| 4 | LLM 训练 | 规模怎么分配、硬件怎么用、怎么微调?(缩放律、FlashAttention、预训练 → 微调 → 偏好调优、量化、LoRA) | Week 2 Day 1、4–6;Week 1 Day 6 |
| 5 | LLM 调优 | 怎么让模型的回答”更好”而不只是”像示范”?(奖励模型、RLHF / PPO、DPO) | Week 3 Day 2–4 |
| 6 | LLM 推理 | 怎么让模型”想得更好”?(CoT → R1、GRPO、测试时缩放) | Week 3 Day 5–6 |
| 7 | 智能体化的 LLM | 怎么让模型用外部知识、调用工具、自己完成任务?(RAG、工具、ReAct、MCP、A2A) | Week 4 Day 1–4 |
| 8 | LLM 评测 | 怎么知道它好不好?(评委、偏差、基准) | Week 4 Day 5–6 |
| 9 | 前沿 | 还能往哪里走? | 今天 |
一条线串起来:Lecture 9 的回顾图是这样读的:一个 token 进入模型(L1–L2 的架构),模型被做大、被训练(L3–L4),被调成人喜欢的样子(L5),学会想(L6),学会用工具和行动(L7),最后被评测(L8)。Day 3 会把这条线画成一张全景图。
§2 Transformer 看图:ViT 与视觉语言模型
2.1 为什么 Transformer 能迁移
Lecture 9 列出 Transformer 的几个特点:2017 年为机器翻译提出;基于自注意力;有查询、键、值的概念;归纳偏置弱;因此通用性强。
归纳偏置是模型结构里预先写死的假设。CNN 假设”相邻的像素相关”(局部性)和”同一个图案在哪里出现都一样”(平移等变);RNN 假设”按顺序处理”。这些假设在对的场景下让模型用更少的数据学得更好,但也限制了它能学什么。自注意力几乎没有这种假设:它不知道谁和谁相邻(没有位置编码时甚至是置换等变的,Week 1 Day 1 §1.5),每个 token 可以直接看任何 token,关系完全从数据里学。只要能把输入切成一串 token,Transformer 就能处理:文字、图像块、音频帧、蛋白质序列、推荐系统里的用户行为……
2.2 ViT:一张图就是 16×16 个词
ViT(Vision Transformer,Dosovitskiy et al. 2020,论文标题就是”一张图值 16×16 个词”)的做法(Lecture 9 的端到端例子):
一张 H×W×C 的图
│ 切成 P×P 的小块(patch),共 N = (H/P)·(W/P) 块
▼
每块拉平成 P·P·C 维 ──线性映射──> D 维 ← 就是 token 嵌入
│
▼
前面加一个可学习的 [CLS] token(和 BERT 一样,Week 1 Day 6 §4.3)
加上可学习的位置嵌入(N+1 个) ← 位置感知的嵌入
│
▼
标准的 Transformer 编码器(双向注意力,L 层)
│
▼
取 [CLS] 位置的输出 ──> 前馈网络 ──> 类别("泰迪熊")
w5day1_checks.py 第 1 组算了 ViT-B/16(224×224 的图,patch 16,D = 768,12 层):196 个 patch + 1 个 [CLS] = 197 个 token,参数 86.57M(论文报告 86M)。一个 16×16×3 的 patch 拉平后是 768 维,恰好等于 D:一个 patch 就像一个”词”。
patch 嵌入就是一个卷积:对每个不重叠的 P×P 块做同一个线性映射,等价于”D 个 P×P×C 的卷积核、步长为 P”。第 2 组数值上验证了两者完全相等(最大差 ),所以很多实现直接写 Conv2d(C, D, kernel_size=P, stride=P)。
分辨率的代价:token 数 ,注意力的计算量按 增长:
| 分辨率 / patch | token 数 | 注意力矩阵(相对 224/16) |
|---|---|---|
| 224 / 16 | 196 | 1× |
| 336 / 14 | 576 | 8.6× |
| 448 / 14 | 1024 | 27× |
| 1024 / 16 | 4096 | 437× |
这就是 ViT 用 16×16 这么”粗”的 patch 的原因,也是高分辨率图像(文档、截图、图表)对多模态模型来说很贵的原因。
2.3 归纳偏置与数据量
弱归纳偏置是一把双刃剑。ViT 论文的发现:只在 ImageNet(约 130 万张图)上训练时,ViT 比同等大小的 ResNet 差几个百分点;在更大的数据集(1400 万张的 ImageNet-21k、3 亿张的 JFT-300M)上预训练后,ViT 追上并超过了 CNN。直觉:CNN 的”局部性、平移等变”是免费的先验,数据少时很有用;ViT 必须从数据里自己学出这些规律,数据多了之后,它学到的比人写死的先验更好。这和 Week 2 Day 1 缩放律的精神一致:足够的数据和算力,会让通用的结构胜过精心设计的结构。
w5d1_vit_mdm.py --vit 在合成的”圆 / 方 / 三角”图片上训练一个 15 万参数的小 ViT(32×32 的图、8×8 的 patch、16 个 token),各跑 3 个种子:有位置嵌入 0.887 ± 0.015,没有位置嵌入 0.890 ± 0.015(随机猜是 0.333)。两者分不出差别:在这个任务上,局部的边缘(弧线、直角、斜边)已经携带了大部分信息,“一袋 patch”也能分类。位置信息有多重要,取决于任务(数物体、读文字就离不开它)。
2.4 视觉语言模型:两种接法
问题(Lecture 9):“这只泰迪熊有多可爱?“加上一张图,怎么让 LLM 看懂图?
方法 1:复用 decoder-only 结构(LLaVA,Liu et al. 2023)。图像编码器(CLIP 的 ViT)把图变成一串 patch 向量,经过一个投影层映射到 LLM 的词嵌入空间,直接当作 token 插进输入序列:
[图像 token × 576] [文字 token:这只泰迪熊有多可爱?] ──> 普通的 LLM ──> 很可爱!
LLaVA 的训练分两步:先只训练投影层,让图像特征和词嵌入对齐(图文对数据);再端到端地在视觉指令数据上微调(Week 2 Day 6 的 SFT)。好处:LLM 一点不改,所有 LLM 的技巧(KV Cache、量化、LoRA)照用。代价:图像占上下文。第 3 组:LLaVA-1.5(336×336、patch 14)一张图 576 个 token;高分辨率切 4 块再加一张缩略图就是 2880 个 token;以 Llama 3 8B 的 KV Cache(每 token 128 KiB)计,一张 2880 token 的图就占 360 MiB。多图、视频很快就是几万个 token。
方法 2:插入交叉注意力层(Flamingo,Alayrac et al. 2022;Llama 3 的视觉版本)。图像特征不进入 LLM 的序列,而是在 LLM 的层之间插入新的交叉注意力层,让文字 token 去”读”图像特征(这就是 Week 1 Day 2 §4.2 编码器–解码器里的交叉注意力)。Llama 3 的做法是训练这些新层(以及图像编码器),不更新原来的语言模型参数,保证纯文本的能力不受影响。好处:图像不占上下文;文本能力不变。代价:新增大量参数;和原模型的推理栈耦合更深。
| 方法 1:图像当 token | 方法 2:交叉注意力 | |
|---|---|---|
| 改动 | 加一个投影层 | 在 LLM 中间插入新层 |
| 图像占上下文 | 占(几百到几千 token) | 不占 |
| 文本能力 | 微调时可能受影响 | 冻结 LLM,不受影响 |
| 代表 | LLaVA 系列;很多开源 VLM | Flamingo;Llama 3 视觉版本 |
2.5 其他领域
Lecture 9 的小结:“Transformer 实际上被用在很多地方”:文本生成(这门课)、视觉理解(ViT)、图像生成(DiT:把扩散模型里的 U-Net 换成 Transformer,Peebles & Xie 2022;MM-DiT 让文字和图像 token 在同一个 Transformer 里做联合注意力),还有语音、推荐系统等。
§3 扩散语言模型
3.1 自回归的瓶颈
Lecture 9 从一个熟悉的画面开始:[BOS] → “A” → “A teddy” → “A teddy bear” → …… 这就是自回归建模(ARM):一次生成一个 token,每个 token 都依赖前面所有的 token(Week 0 Day 5 §1.1)。
问题:推理不能并行(虽然训练可以,Week 1 Day 1 §5.4)。生成 个 token 就要 次前向,而每次前向(batch 小时)都是访存瓶颈:把几十 GB 的权重和整个 KV Cache 从显存读一遍,只为了算出一个 token(Week 1 Day 4 §1.5;第 8 组:解码时注意力的算术强度只有 1–4 FLOP/字节,而 H100 的拐点在 295)。推测解码(Week 3 Day 1 §3.2)是在自回归框架内的一种补救;扩散语言模型是换一个框架。
3.2 图像扩散的直觉
Lecture 9 用了米开朗基罗的比喻:“雕像本来就完整地在大理石里,我只是凿去多余的部分。“图像生成模型的目标是:学一个从噪声到数据分布的变换。选择噪声作为起点,是因为它容易采样、而且这个变换在数学上有良好的定义。
扩散的两个过程(DDPM,Ho et al. 2020):
- 前向过程(固定的,不用学):一步步往图里加噪声,直到变成纯噪声。
- 反向过程(要学的):训练一个网络,从加了噪声的图预测”原来的图”(或加进去的噪声),一步步去噪。
生成时从纯噪声出发,反复去噪,得到一张新图。关键在于:每一步去噪都同时作用于所有像素,生成不是一个像素一个像素地来的。
3.3 从图像到文本:掩码扩散
问题:文字是离散的,没法”加一点高斯噪声”。Lecture 9 的类比:图像的”噪声”对应文本的 [MASK]。
- 前向过程:每个 token 以概率 被独立地换成 [MASK], 从 0(原句)到 1(全是 [MASK])。
- 反向过程:训练一个双向的 Transformer,看着部分被遮住的句子,预测被遮住的 token。
这就是掩码扩散模型(MDM;SEDD,Lou et al. 2023;MDLM,Sahoo et al. 2024;LLaDA,Nie et al. 2025 做到了 8B 参数)。
训练目标:
看起来就是 BERT 的 MLM(Week 1 Day 6 §4.2),只有两个区别:掩码率 不是固定的 15%,而是在 0 到 1 之间随机;损失要除以 。这两个区别让它从一个”理解模型”变成了一个”生成模型”。
为什么是 ,推导:
(a) 量级。 小时遮得少,每个样本只有少数位置有损失;除以 把它放大回整条序列的量级:,与 无关。第 4 组的蒙特卡洛是 3.980(应为 4);但这个估计量的方差其实是无穷大: 在 处发散。实践中会把 限制在 (参考代码用 )。
(b) 更深一层:它恰好等于负对数似然。假设模型给出的正好是真实的条件分布 ( 是没被遮住的位置)。遮住的集合 (大小 )出现的概率是 ,乘上 再对 积分:
这个数正是”在一个均匀随机的生成顺序里,轮到位置 时,已经生成的恰好是集合 “的概率:位置 前面恰好是 里的 个位置(任意顺序, 种),后面是 里除 之外的 个( 种),除以总的排列数 。所以
最后一步是因为每一种顺序的自回归分解都等于 (链式法则)。掩码扩散 = 对所有生成顺序做平均的自回归。第 4 组在一个 4 token 的随机联合分布上逐位验证了这个等式:
| 序列 | 掩码扩散目标(精确) | 不加 | 固定 15% 掩码(BERT 式) | |
|---|---|---|---|---|
| (0, 0, 2, 0) | 2.3420 | 2.3420 | 1.3612 | 1.4931 |
| (1, 2, 2, 0) | 3.2483 | 3.2483 | 1.9402 | 1.6847 |
不加 或用固定的掩码率,得到的数和似然对不上:BERT 的目标不是一个生成模型的训练目标,这正是 Week 1 Day 6 §4.7 说 BERT 不能直接生成的数学原因。真实训练中模型的条件分布不完美、彼此也不一定自洽,这时目标是 的上界(负 ELBO)。
3.4 解码:更少的步数,以及代价
生成(Lecture 9 的图):从全是 [MASK] 开始,每一步让模型预测所有被遮住的位置,揭开一部分(其余继续遮住),重复,直到没有 [MASK]。 个 token 用 步生成,前向次数更少。
代价:同一步揭开的 token 彼此独立。模型给的是每个位置各自的条件分布。第 5 组的最小例子:训练数据里 “New York” 和 “San Francisco” 各占一半。两个位置都被遮住时,第一个位置 New / San 各 0.5,第二个 York / Francisco 各 0.5;同一步独立地揭开两个,一半的概率拼出 “New Francisco”。损失的信息量正是两个位置的互信息(log 2)。
一个更真实的例子(第 5 组):一个有 50% “禁止转移”的马尔可夫链语言,长 16;每个位置的条件分布用前向–后向算法精确地算出(相当于一个完美的模型)。生成合法序列的比例:
| 步数 | 每步揭开 | 随机挑位置 | 挑最有把握的位置 |
|---|---|---|---|
| 16 | 1 | 1.000 | 1.000 |
| 8 | 2 | 0.742 | 0.514 |
| 4 | 4 | 0.336 | 0.168 |
| 2 | 8 | 0.047 | 0.285 |
| 1 | 16 | 0.000 | 0.000 |
读法:
- 每步只揭开 1 个 token 时,采样是精确的(这就是自回归,只是顺序不固定)。一步揭开得越多,依赖越容易被破坏。步数是质量与速度之间的旋钮,即使模型是完美的也逃不掉。
- “先揭开最有把握的位置”并不总是更好:在这条链上,刚被揭开的位置的邻居最有把握,于是它倾向于同时揭开相邻的位置,而相邻位置恰恰相关性最强( = 8、4 时反而更差)。实际的扩散语言模型常把”按置信度挑”和分块、从左到右的半自回归顺序结合起来。挑哪些位置一起揭开,要和数据的依赖结构一起设计。
3.5 在小模型上试一试
w5d1_vit_mdm.py --mdm 在同一个马尔可夫链语言上训练两个一样大的小 Transformer(约 34 万参数):一个用掩码扩散目标(双向注意力),一个用自回归目标(因果注意力)。
先检验实现(--selftest):把”神谕模型”(前向–后向算出的精确条件分布)代入 mdm_loss,30 次平均得到每 token 0.5414,真实 NLL 是 0.5411;用神谕模型每步揭开一个 token,生成的序列全部合法;一步揭开全部 16 个,合法率 0.000。损失函数和解码循环都写对了。
再看训练:
这次用的语言是 6 个词、长 16、64% 的转移被禁止的马尔可夫链,真实分布下每个 token 的 NLL 是 0.5378(code/logs/w5d1_mdm.txt,单个种子):
| 模型 | 训练步数 | 测试 NLL(扩散模型是上界) | 生成 2000 条的合法率 |
|---|---|---|---|
| 自回归 | 1500 | 0.5389 | 0.997 |
| 掩码扩散 | 1500 | 1.0759 | 0.014(每步揭开 1 个) |
| 掩码扩散 | 3000 | 0.5504 | 0.940 |
| 掩码扩散 | 4500 | 0.5451 | 0.976 |
| 掩码扩散 | 6000 | 0.5409 | 0.988 |
训练完的扩散模型,换不同的解码步数:
| 挑位置的方式 | =16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|
| 随机 | 0.990 | 0.589 | 0.158 | 0.002 | 0.000 |
| 最有把握 | 0.990 | 0.661 | 0.071 | 0.011 | 0.000 |
读法:
- 扩散模型学得慢得多。自回归 1500 步就几乎贴到真实 NLL(差 0.001);扩散模型 1500 步时 NLL 上界还是 1.08、几乎生成不出合法序列,到 3000 步才突然学会,6000 步(4 倍于自回归)时上界 0.5409,仍然比自回归差一点。每步的计算量两者差不多(模型一样大),所以同样的训练算力,扩散模型更差。原因有两个:它要学的是”任意遮挡模式下”的条件分布,比”只看左边”的任务大得多(§3.3 的”任意顺序自回归”);1/t 加权的损失在 t 很小时被放大,梯度方差大。这是 §3.6 “同等规模下质量仍在追赶”在玩具尺度上的一个缩影。
- 学会以后,规律和神谕模型一样:每步揭开 1 个( = 16)时合法率 0.990,接近自回归;步数越少越快,合法率越低,一步全揭开时为 0。步数仍然是质量与速度之间的旋钮。
- 两种挑法谁好,随步数变: = 8 时挑最有把握的更好, = 4 时反而更差。这里的链和 §3.4 不是同一条(禁止比例不同),具体排序不能直接对比,但结论相同:没有一种挑法在所有步数上都占优。
- 诚实地说:这是单个种子的结果。训练有随机性,你重跑一次,具体数字(尤其是 = 8、4 两列,以及扩散模型在哪一步”突然学会”)会有出入;先看趋势。在我的机器(CPU)上自回归 1500 步约 150 秒,扩散 6000 步约 630 秒,你的机器上会不同。
3.6 现状与挑战
已经发生的(Lecture 9 引用的新闻):Google 在 2025 年 5 月的 I/O 上展示了 Gemini Diffusion;字节跳动 7 月发布了 Seed Diffusion;Inception Labs 的 Mercury 系列商业化了扩散语言模型。
优势(Lecture 9):
- 更适合某些任务:比如代码编辑、补全中间的内容(双向注意力天然能看到两边);LLaDA 报告它在”反向”任务(已知下一句写上一句)上不受自回归模型的”反转诅咒”影响。
- 速度:Lecture 9 给出的量级是输出 token 速度约为自回归的 10 倍(前向次数少得多)。
挑战与正在进行的工作:
- 把自回归的技巧搬过来:KV Cache 不能直接用(双向注意力下,揭开一个 token 会改变所有位置的表示);RLHF、GRPO 需要序列的对数概率,而扩散模型只给出一个上界(§3.3);变长生成要额外设计。
- 性能:同等规模下整体质量仍在追赶自回归模型;§3.5 的小实验也显示它更难训练。
§4 回到基础
4.1 设计选择仍无定论
Lecture 9 指出:基础研究仍在进行,微观层面的设计选择在不同论文之间仍然差异很大:
| 设计选择 | 现状 | 我们在哪里学过 |
|---|---|---|
| 优化器 | AdamW 仍是主流;Muon / MuonClip(Kimi K2)等新方法出现 | Week 0 Day 2 §2 |
| 归一化 | LayerNorm vs RMSNorm;放在哪里(Pre-LN 等) | Week 0 Day 2 §4;Week 1 Day 2 §2 |
| 注意力 | MHA / MQA / GQA(以及更激进的压缩 KV 的做法) | Week 1 Day 4 §2 |
| 激活函数 | ReLU → GELU → SwiGLU | Week 1 Day 2 §1.4 |
| MoE 与否 | 前沿大模型多为 MoE,但不是全部 | Week 2 Day 2 |
| 层数 | 深而窄 vs 浅而宽 | Week 2 Day 1 |
以 Muon 为例看”优化器还在演化”。Muon(Jordan 2024)对每个权重矩阵的动量 做正交化:用 代替 作为更新方向,即把所有奇异值都换成 1。直觉(Week 0 Day 2 §1.5 的”尺子”):Adam 在每个坐标上各自缩放(对角的尺子);Muon 在谱范数这把尺子下找最陡的方向,结果就是 :每个奇异方向走一样大的步,不让少数几个大奇异值主导更新。SVD 在 GPU 上很慢,Muon 用只含矩阵乘法的 Newton–Schulz 迭代逼近 。第 7 组(奇异值跨 3.9 个数量级的矩阵):
| 方法 | 步数 | 奇异值落在 [0.5, 1.3] 的比例 | 与 的相对误差 |
|---|---|---|---|
| 三次迭代 | 5 | 28.1% | 0.794 |
| 三次迭代 | 30 | 100.0% | 0.000 |
| Muon 的五次迭代 | 5 | 75.0% | 0.446 |
三次迭代精确但慢;Muon 的五次迭代(系数 3.4445、−4.7750、2.0315)5 步就把大部分奇异值推进 1 附近,极小的奇异值只被放大约 490 倍、仍没到 1:它要的是”各方向步长大致相当”,而不是精确的 。Kimi K2(1 万亿总参数、320 亿激活参数的 MoE)用的 MuonClip 在此基础上加了”QK-clip”,限制注意力 logit 的增长以避免训练不稳定。
4.2 燃料:高质量数据还够吗
Lecture 9 问:“未来还有高质量数据的来源吗?”
- 公开的人类文本是有限的。Epoch AI(Villalobos et al.)估计,按目前的训练规模增长趋势,公开的人类文本存量可能在 2020 年代后半到 2030 年代初被用完(Week 2 Day 1 §4.3 讨论过”数据用完了怎么办”)。
- 合成数据是自然的补充:第 3 周的拒绝采样、R1 的 80 万条推理数据、蒸馏都是在用模型生成训练数据。
- 但只用生成的数据会”坍缩”(Shumailov et al. 2023,后发表于 Nature):一代代地在上一代模型生成的数据上训练,模型会逐渐忘掉原始分布的尾部。第 6 组的最简单版本:数据 ~ N(0, 1),每一代从上一代拟合的高斯里抽 100 个样本、重新拟合:
| 第几代 | σ 的中位数 | σ < 0.5 的比例 | 混入一半真实数据时 σ 的中位数 |
|---|---|---|---|
| 10 | 0.901 | 0.007 | 0.998 |
| 100 | 0.366 | 0.653 | 0.995 |
| 1000 | 0.000 | 1.000 | 0.990 |
机制:最大似然的方差估计有偏(),而且每一代的估计误差会累积成随机游走;罕见的样本(尾部)最先消失。混入真实数据后分布保持稳定。现实的对策:保留人类数据、记录数据的来源(区分人写的和模型生成的)、合成数据要经过筛选和验证(可验证奖励、评委、拒绝采样都是在做筛选)。
4.3 Transformer 是最好的架构吗
Lecture 9 退后一步问了这个问题,没有给答案,我们也不给,但可以列出正在被探索的方向:
- 状态空间模型与线性 RNN(如 Mamba,Gu & Dao 2023):推理时每步是常数计算和常数内存,没有随长度增长的 KV Cache。Week 1 Day 6 §2.3 推过”因果线性注意力就是一个 RNN”,它们是同一个家族;代价也相同:固定大小的状态”记不住”任意长的精确信息(Week 1 Day 6 §2.5)。
- 混合架构:大部分层用线性注意力或 SSM,少数层保留全注意力。
- 扩散语言模型(§3):换的不是网络结构,而是生成范式。
判断标准回到缩放律(Week 2 Day 1):一个新架构要证明的,不是在小规模上赢一次,而是它的缩放曲线在大算力下仍然更好。
§5 效率与交叉
5.1 从”最强”到”性价比”
Lecture 9:“到目前为止,关注点是最好的性能;越来越多地,关注点是最好的质量–成本权衡”:也就是 Week 4 Day 5 §4.5 的 Pareto 前沿。量化、蒸馏、MoE、推测解码、小模型的”过度训练”(Week 2 Day 1 §4),都是在推这条前沿。
5.2 硬件
Lecture 9 的观察:现有的 GPU 为矩阵–向量、矩阵–矩阵运算优化;而 Transformer 有特殊的需求:注意力要频繁地读写 KV Cache,数据搬运主导了成本。第 8 组:
| 注意力 | 解码时的算术强度 | 能用上 H100 峰值算力的 |
|---|---|---|
| MHA | 1 FLOP/字节 | 0.34% |
| GQA(Llama 3 8B) | 4 | 1.35% |
| MQA | 32 | 10.8% |
(H100 的拐点约 295 FLOP/字节。)一个研究方向(Leroux et al. 2025):在硬件上”原生”支持注意力:把 KV Cache 存在专用的存储单元里,用模拟信号就地计算,论文报告相对 H100 延迟最多降低约 100 倍、能耗降低约 7 万倍。这是研究原型,但方向很清楚:把计算搬到数据旁边,而不是把数据搬到计算旁边。
5.3 模态之间的交叉借鉴
Lecture 9 的”趋势”:不同模态在互相借鉴行之有效的想法:
- 架构:文本借用了图像的”扩散”训练(§3);图像借用了 Transformer(ViT、DiT,§2)。
- 输入表示:DeepSeek-OCR(Wei et al. 2025)反过来”用图片压缩文字”:把长文本渲染成图片,用视觉 token 表示。论文报告视觉 token 约为文字 token 的 1/10 时,OCR 精度约 97%(压缩到 1/20 时约 60%)。token 少 10 倍,注意力的计算量(∝ 长度²)就少 100 倍、KV Cache 少 10 倍:这为”超长上下文的记忆”提供了一种新思路。
- 技巧:RoPE 的各种变体被推广到图像的二维位置(比如 Qwen-Image 的多模态可扩展 RoPE)。
§6 应用、挑战与怎么跟上
6.1 今天与明天
Lecture 9 的判断:日常生活已经被 LLM 显著改变:编程(真正的写代码、自然语言转查询)、通用对话助手(常识、网页搜索)、创作、学习……
接下来:已有的智能体会普及到更多人(比如 2025 年 12 月发布的 Google Workspace Studio,让普通用户搭建办公自动化智能体);近期可能是浏览器(比如 2025 年 10 月的 ChatGPT Atlas),更远一点可能是操作系统级的 LLM;长期:真正自主、承担大量职责的智能体?以及一个 Lecture 9 半开玩笑的”不可能任务”:真正好用的客服。
6.2 仍未解决的问题
Lecture 9 列出的”当前最受关注的改进方向”:
| 问题 | 为什么难 | 这门课里的相关内容 |
|---|---|---|
| 权重是固定的,不是持续学习 | 训练完就定格;持续更新会遗忘旧知识(灾难性遗忘) | RAG 是绕过它的办法(Week 4 Day 1 §1.3) |
| 幻觉 | 模型被训练成”给出流畅的下一个 token”,而不是”只说知道的” | 标签平滑与校准(Week 3 Day 1 §3.1);RAG 与忠实度(Week 4 Day 6 §3.1) |
| 个性化 | 每个人要的不一样,但不能为每个人训练一个模型 | LoRA(Week 2 Day 6 §3);记忆(Week 4 Day 4 §5.2) |
| 可解释性 | 几十亿参数里发生了什么,我们只理解一小部分 | FFN 键值记忆(Week 1 Day 2 §1.3)、QK/OV 电路(Week 1 Day 1 §4.5) |
| 安全 | 能力越强、自主性越高,风险越大 | 提示注入(Week 4 Day 3 §6);对齐(第 3 周) |
6.3 建立你的追踪机制
学习计划说:“冲刺结束后能不能持续,就看这个机制建没建起来。” Lecture 9 列出的信息源:
- 论文:arXiv 的 cs.CL(计算与语言);机器学习会议(NeurIPS、ICML、ICLR)和 NLP 会议(ACL、EMNLP)。
- 代码:论文里链接的作者仓库;Hugging Face 的”热门论文”页面(能看到最新的数据集和方法)。
- 其他:学者和业界人士的社交媒体;YouTube 上理论向(Two Minute Papers、Yannic Kilcher)和实践向(Google Developers、Hugging Face、Andrej Karpathy)的频道;公司和实验室的技术博客与报告。
- 课程的 VIP Cheatsheet(有中文版):课后复习用(Day 3 会逐条核对)。
一个能坚持的流程(每周约 3 小时):
- 筛选(周一,30 分钟):扫一遍 Hugging Face 热门论文和 arXiv cs.CL 的标题,挑 5 篇进”待读”。挑选的标准:和你的方向相关、有代码、被多个信息源提到。
- 精读 2 篇(周中,2 小时):用 Week 1 Day 3 §7 读 Attention Is All You Need 的方法:先读摘要和结论,再读方法,最后看实验。每篇写一页笔记(下面的模板)。
- 复现 1 个数字(周末,30 分钟起):从论文里挑一个最核心的数字,用最小的代价复现它(一个公式、一个玩具实验)。这是”读懂”和”读过”的区别,也是这门课每一个
checks.py在做的事。
每篇论文一页笔记的模板:
标题 / 作者 / 日期 / 链接 / 代码:
一句话:它解决了什么问题?(用"以前……,所以……,这篇……"的句式)
动机:以前的方法撞到了什么墙?(这门课的哪一节讲过那堵墙?)
方法:核心想法是什么?关键公式写一遍,每个符号是什么意思。
证据:最重要的一张表 / 一张图说了什么?数字的误差有多大?比较公平吗?(Week 4 Day 5 §3)
代价与局限:它用什么换来了什么?作者承认了什么?没说的呢?
和我的关系:我能用上吗?我能复现哪一个数?
§A 多模态与扩散:API 用法与边界
A.1 视觉语言模型
from transformers import AutoProcessor, AutoModelForImageTextToText
processor = AutoProcessor.from_pretrained(name) # 同时包含图像预处理和分词器
msgs = [{"role": "user", "content": [{"type": "image"}, {"type": "text", "text": "这只泰迪熊有多可爱?"}]}]
prompt = processor.apply_chat_template(msgs, add_generation_prompt=True)
inputs = processor(images=image, text=prompt, return_tensors="pt")
- 用 processor,不要只用 tokenizer:图像要按模型训练时的方式缩放、裁剪、归一化;处理方式不对不报错,只会让模型”看错”。
- 图像在序列里的位置由聊天模板决定:模板里的图像占位符会被展开成几百个图像 token。数一数
inputs["input_ids"]的长度,看一张图到底占多少 token(§2.4)。 - 高分辨率图像会被切块:很多 VLM 按图像大小动态决定切几块,token 数随分辨率变化;上下文和显存要按最坏情况留。
- 不同的 VLM 用的自动类可能不同(有的是专门的类),以模型卡为准。
A.2 ViT
timm和 transformers 都有预训练的 ViT。输入分辨率要和预训练一致,改分辨率时位置嵌入要插值(和 Week 1 Day 5 §3.2 的位置插值是同一个问题)。- 做分类用
[CLS]的输出或所有 patch 的平均(不同模型不同);做检索、做 VLM 的图像编码器时常用倒数第二层的 patch 输出。
A.3 扩散语言模型
- 生成接口通常有三个自回归模型没有的参数:总步数(质量与速度的旋钮,§3.4)、生成长度(要事先定,变长生成需要额外处理)、块长度与揭开策略(一次生成多长的一块、每步按什么标准揭开哪些位置)。具体的参数名以各模型的代码为准。
- 不要用自回归的评测方式直接套:扩散模型没有精确的序列对数概率(只有上界,§3.3),基于困惑度的比较、需要对数概率的 DPO / GRPO 都要改写。
§B 实操
- 跑通
w5day1_checks.py,8 组结论都看懂。第 4 组把 改成 5、词表改成 2,确认”掩码扩散目标 = −log p(x)“仍然逐位成立;第 5 组改变禁止转移的比例,看步数的影响怎么变。 - 推导(1h,纸笔):(a) ViT-B/16 的参数量;(b) ,以及它为什么等于”随机顺序里前面恰好是 “的概率;(c) 由此推出掩码扩散目标 = −log p(x)。
- 小 ViT 与扩散模型(1h,CPU):
python code/w5d1_vit_mdm.py --selftest、--vit、--mdm(CPU 上约十几分钟;默认扩散模型 6000 步、自回归 1500 步,想看”突然学会”的过程可以再试--steps 3000或--steps 12000),对照 §2.3、§3.5。 - 建立追踪机制(1h):按 §6.3 的流程,挑本周的 2 篇论文,用模板写两页笔记。推荐从 Lecture 9 引用的里挑:ViT(Dosovitskiy et al. 2020)的第 3 节;LLaDA(Nie et al. 2025)的第 2 节。
- 写一页”我的前沿地图”:§4–§6 的开放问题里,你最想跟踪哪两个?为什么?它们和你想做的 Capstone(Day 6)有什么关系?
参考实现:code/w5d1_vit_mdm.py。
§C 自测
动机与直觉层
- 为什么说 Transformer 的归纳偏置弱?这对 ViT 意味着什么(数据少时 / 数据多时)?
- 视觉语言模型的两种接法各有什么代价?什么场景下你会选交叉注意力?
- 自回归生成的瓶颈是什么?扩散语言模型怎么绕开它、代价是什么?
- 什么是模型坍缩?合成数据怎么用才安全?
- Lecture 9 列出的五个未解决的问题是什么?各举一个这门课里相关的技术。
推导与计算层
- 224×224 的图、patch 16,有多少个 token?换成 patch 14、336×336 呢?注意力的计算量变成几倍?
- 写出掩码扩散的训练目标。为什么要除以 ?它和 BERT 的 MLM 有哪两个区别?
- 证明:在真实条件分布下,掩码扩散的目标等于 。(提示:对 积分,和随机生成顺序对应起来。)
- 同一步揭开两个 token 时,损失的信息量是什么?用 “New York / San Francisco” 的例子算一算。
- 解码时注意力的算术强度怎么算?为什么说它是访存瓶颈?
工程层
- 你要做一个能看截图回答问题的助手,上下文预算 8k token。一张截图占多少?你会怎么控制?
- 扩散语言模型为什么不能直接用 KV Cache?为什么不能直接做 DPO?
- 你的追踪流程是什么?每周花多少时间,产出什么?
出关标准
- 能画出 ViT 的数据流,算出 token 数和参数量,说清弱归纳偏置与数据量的关系
- 能画出视觉语言模型的两种接法,比较它们的代价
- 能推出掩码扩散的训练目标,证明它在真实条件分布下等于 ,说清它和 BERT、自回归的关系
- 能解释并行解码为什么要用步数换质量
- 能说出 Lecture 9 的几个开放问题(设计选择、数据、架构、硬件、五个未解决的问题)
- 按 §6.3 建立了追踪流程,写完两页论文笔记