第 5 周 · Day 6:Capstone 与延伸阶段——做一个可信的项目,然后继续走

Transformers and Large Language Models · Week 5 · Day 6。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

时长 4 小时起步(Capstone 本身会延续一到两周):§1–§2 选方向(0.5h)· §3 实验方法论(1h)· §4 技术报告(0.5h)· §6 全课主线(0.5h)· §B 启动 Capstone(1.5h)

对应学习计划 第 5 周 Day 6 的 Capstone 三个方向(A 偏研究、B 偏工程、C 偏复现),以及第 5 节”延伸阶段:四条支线”。今天把它们落到可执行的程度:每个方向的里程碑、交付物、对照实验和常见坑;再补上前五周一直在用、但没有系统讲过的东西——怎么让一个实验结论可信。

配套代码 w5day6_checks.py(只用标准库):种子方差让单次比较排反的概率、三种误差条的真实覆盖率、多重比较的误报率与 Bonferroni / Holm、配对符号翻转检验的最小 p 值、调参的胜者诅咒、三个方向的算力账。每个结论都同时给出公式值和模拟值

§B 参考实现(code/ 目录):w5d6_experiment_log.py:一个极简的实验记录器。每次运行记下配置、种子、指标、代码版本;汇总时按配置给出均值和 t 置信区间;比较两个配置时做配对检验;多个比较用 Holm 校正;输出能直接贴进技术报告的 Markdown 表。

今天的目标:选定 Capstone 方向,写出一页的项目计划(目标、里程碑、对照实验、要报告的数字);跑通基线并用 3 个种子记录下来;能说清楚”为什么一个种子不算数""± 标准误和 95% 置信区间差多少""做了 20 个消融为什么要校正”。


§0 今天怎么安排

  1. 读 §1–§2,选方向(0.5h):按 §2.4 的表对照自己的目标和算力。
  2. 读 §3(1h):实验方法论。边读边跑 python w5day6_checks.py,每一组对应一小节。
  3. 读 §4(0.5h):技术报告的结构。先写报告的骨架,再做实验:骨架里要填的表,就是你要跑的实验。
  4. 读 §6(0.5h):全课的五条主线。合上文档,试着自己讲一遍。
  5. 启动 Capstone(1.5h):写一页计划(§B 第 1 题),用 w5d6_experiment_log.py 记录基线的 3 个种子。

今天要用到的旧结论:Week 4 Day 5 §3(抽样误差、配对比较、胜者的诅咒);Week 1 Day 3 §5(对照实验与混杂因素);Day 1 §6.3(追踪机制)。


§1 为什么要做一个 Capstone

动机:前五周你写了几十个脚本,每个都回答一个小问题。但面试官和招聘方看不到这些。他们能看到的是一个完整的、能复现的、有结论的项目。学习计划说”把前五周的产出串成一个能放进简历的东西”,就是这个意思。

更深一层的理由:看懂和做出来之间隔着整个太平洋(学习计划第 6 节)。一个完整项目会逼你处理所有”讲义里一笔带过”的事:数据从哪来、超参怎么定、结果为什么和论文不一样、差别是不是噪声。这些事情没有标准答案,但处理它们的能力才是招聘方真正想看的。

什么样的项目是可信的(贯穿今天的标准):

  1. 能复现:别人拿到你的代码和说明,能跑出同样的数字(在误差范围内)。
  2. 比较公平:基线和新方法用同样的数据、同样的调参预算、同样的评测。
  3. 带误差棒:每个数字都有多个种子、写清楚是哪种误差条(§3.2)。
  4. 诚实:负面结果、和论文不一致的地方、局限,都写出来。

为什么”诚实”排在可信的标准里:这门课的每一份讲义都在这样做(比如 Week 4 Day 2 §6 混合检索在讲义上没有收益,就照实写)。一个有负面结果、并解释了原因的报告,比一个”全部提升”的报告可信得多:读者知道你没有挑数据。


§2 三个方向

2.1 A(偏研究):从零实现现代 Transformer

目标:在第 1 周的 mini-GPT 上加入 RoPE、GQA(含 KV Cache)、FlashAttention,写一份”从零实现现代 Transformer”的技术报告,开源到 GitHub。

起点:Week1/code/w1d3_minigpt.py(基线)、w1d4_kvcache_gqa.py、w1d5_rope.py、w1d6_flash_linear.py。

里程碑内容时间要报告的数字
M0 基线固定数据、配方,跑 3 个种子0.5 天验证 loss(均值 ± 95% 置信区间)
M1 RoPE替换可学习的绝对位置编码;外推到 2 倍、4 倍训练长度1 天训练长度内、外的验证 loss(Week 1 Day 5 §4.2 的实验设计)
M2 GQA + KV CacheKV 头数 = 查询头数 / 2 / 4 / 全部共享1 天验证 loss、每 token 的 KV 字节数、解码速度;两个正确性测试(Week 1 Day 4 §3.5)
M3 FlashAttention换成分块的注意力(自己写的或 F.scaled_dot_product_attention)0.5 天不同序列长度下的速度和峰值显存;和标准注意力的最大数值误差
M4 报告§4 的结构1 天汇总表 + 消融 + 局限

算力:默认配置 10.77M 参数、81.9M token,一次训练约 5.3×10155.3\times10^{15} FLOPs;4 个配置 × 3 个种子 = 12 次训练,按实际 5 TFLOP/s 约 3.5 小时(w5day6_checks.py 第 7 组)。

常见坑:

  • 参数量混杂:GQA 少了 K、V 投影的参数,验证 loss 变差可能只是因为参数少了。要么把省下的参数补到别处,要么在报告里说明(Week 1 Day 3 §5.2)。
  • 计时不准:GPU 是异步执行的,计时前后要 torch.cuda.synchronize(),前几次运行(预热)不计入。
  • 只跑一个种子:小模型上 RoPE 和可学习位置编码的差距可能在噪声以内(§3.1)。
  • 外推实验用错位置:增量解码时位置编号不是从 0 开始(Week 1 Day 4 §3.2)。

加分项:在报告里写出”每一行代码来自哪一篇论文”的对照表(Week 1 Day 6 §5.1);加一个 PI / NTK / YaRN 的外推对比。

2.2 B(偏工程):端到端的垂直领域助手

目标:把第 2 周的微调和第 4 周的 RAG / 智能体整合成一个某个领域的助手(比如”这门课的学习助手”、某个开源项目的文档助手),带完整的评测报告。

起点:Week2/code/w2d6_lora_sft.py、Week4/code/ 全部(RAG、重排、工具、智能体、评测、评委)。

里程碑内容时间要报告的数字
M0 定义与黄金集选领域;写 100–300 道题,每道带参考答案和”应该检索到的文档”1 天题目的类型分布
M1 基线不带检索的模型直接答0.5 天正确率(带置信区间)
M2 RAG切块、混合检索、重排(Week 4 Day 1–2)1 天召回率@k、正确率、忠实度
M3 微调行为用 LoRA 教会模型”引用资料、资料不够就说不知道”(Week 2 Day 6)1 天引用准确率、拒答正确率
M4 评测报告消融表 + 失败分析 + 成本与延迟1 天见下

评测报告的核心表(每一行相对于上一行加了一样东西,配对比较、带置信区间):

系统正确率忠实度拒答正确率每问成本P95 延迟
基座模型
+ RAG(稠密)
+ 混合检索 + 重排
+ LoRA 行为微调

算力:0.5B 模型的 bf16 底座不到 1 GiB,1.5B 约 2.9 GiB,一张 8–16 GB 的显卡就能做 LoRA(第 7 组);也可以全程用 API,把预算花在评测上。

常见坑:

  • 黄金集太小:100 道题只能分辨十几个百分点的差别(Day 5 §3 E7)。差距小于这个量级时,结论写”分不出来”。
  • 评委没有校准:LLM 评委和人工的一致性要先测(Week 4 Day 6 §1.5),否则表里的”忠实度”不知道在测什么。
  • 在黄金集上调参:调切块大小、提示、阈值时用一部分题(开发集),最终数字在另一部分(测试集)上报告(§3.4)。
  • 只报平均数:一定要有失败分析:答错的题分别错在检索、排序、生成的哪一环(Week 4 Day 6 §3.3)。

加分项:一个能在线试用的演示;一个”线上反馈 → 加进黄金集”的闭环(Day 5 §4.7)。

2.3 C(偏复现):复现 DPO 或 GRPO

目标:挑一篇本课涉及的论文,在小模型上做一次可信的复现,把结果和论文对比,写清楚差异来源。DPO 和 GRPO 是好选择:有现成的玩具实现(Week3/code/w3d4_dpo.py、w3d5_grpo.py),数学你已经推过。

“可信的复现”是什么意思:不是”跑出了和论文一样的数字”(模型、数据、算力都不同,通常做不到),而是事先写下要验证的论断,然后用带误差棒的实验检验它们。

先写下要验证的论断(M0,跑实验之前):

论文可以检验的论断讲义里的出处
DPO在同样的偏好数据上,DPO 训练后对 SFT 模型的胜率提高Week 3 Day 4 §2
隐式奖励的间隔随训练增大;被选中回答的对数概率可能也下降Week 3 Day 4 §3.3
β 越小,偏离参考模型越远Week 3 Day 4 §3.2
GRPO在有标准答案的数学题上,准确率随训练步数提高Week 3 Day 5 §3.4
全对 / 全错的组占比随训练变化(没有信号的样本比例)Week 3 Day 5 §3.2
回答长度的变化;熵的下降Week 3 Day 5 §4.1、§4.3
里程碑内容时间
M0 论断清单上表 + 每个论断用什么指标、多少种子、什么算”复现成功”0.5 天
M1 最小管线先在玩具上跑通(第 3 周的代码),再换成小模型(如 Qwen2.5-0.5B-Instruct)1 天
M2 主实验3 个以上种子1–2 天
M3 消融DPO 的 β;GRPO 的组大小、是否除以标准差(Dr. GRPO)1 天
M4 报告逐条论断:复现了 / 没复现 / 部分复现,以及最可能的原因1 天

算力:Qwen2.5-0.5B 全量 DPO 约 8.3 GiB、GRPO 约 9.2 GiB 的状态显存,再加激活(第 7 组);也可以用 LoRA 进一步压缩。GRPO 的时间大头在采样,不在训练。

差异来源的清单(写报告时逐条检查):模型大小(小模型可能没有论文里的现象)、数据(领域、规模、偏好的噪声)、超参(论文的超参是在它的设置上调的)、评测(同一个指标的不同实现,Week 4 Day 5 §A.2)、随机性(§3.1)。

2.4 怎么选

你的目标推荐方向理由
原理面试、算法岗A每一个面试题(RoPE、GQA、FlashAttention)你都亲手实现并测过
应用岗、LLM 工程B和真实工作最接近:数据、检索、评测、成本
研究岗、读博C复现是研究的基本功;“和论文不一致并解释原因”是最好的研究训练
时间很少(一周)A 的 M0–M2 或 C 的 DPO起点代码最完整

无论选哪个,规模都要小到一周内能出第一版结果。先完成,再扩展。


§3 实验方法论:让结论可信

前五周里,“在误差范围内分不出来”出现了很多次(Week 4 Day 6 §5.2 的”测量先于优化”)。这一节把背后的方法系统地讲一遍。它是 Capstone 和以后一切实验的地基。

3.1 一次运行不算数

动机:同一个配置,换一个随机种子(初始化、数据顺序、dropout、采样),结果就会变。如果两个配置的真实差距和种子噪声差不多大,跑一次比较就跟抛硬币差不多。

算一下(w5day6_checks.py 第 1 组):设配置 B 真实比 A 好 Δ=0.5\Delta=0.5,每次运行的种子噪声标准差 σ=1\sigma=1。每个配置跑 nn 个种子取平均,均值之差服从 N(Δ, 2σ2/n)\mathcal N(\Delta,\,2\sigma^2/n),排反的概率 =Φ ⁣(−Δ/(σ2/n))=\Phi\!\big(-\Delta/(\sigma\sqrt{2/n})\big):

每个配置的种子数1351020
排反的概率(公式)0.3620.2700.2150.1320.057
模拟0.3610.2670.2150.1360.056

读法:差距只有半个噪声标准差时,单个种子有 36% 的概率得出相反的结论。怎么知道你的 σ\sigma 有多大? 先把基线跑 3–5 个种子,看它们之间的波动。这一步本身就是 M0 的意义。

同一个种子配对:让 A 和 B 用同一组种子(同样的初始化和数据顺序),比较逐种子的差值。种子带来的波动有一部分是两者共有的,相减后被消掉,和 Week 4 Day 5 §3.2 的配对比较是同一个道理。

3.2 误差条报什么

动机:论文里常见 “0.85 ± 0.02”,但 ±0.02 可能是三种完全不同的东西。

nn 个种子,样本均值 xˉ\bar x、样本标准差 ss:

写法含义真值落在区间里的概率(第 2 组)
xˉ±s\bar x\pm s单次运行的波动有多大nn = 3:0.775;nn = 5:0.911;nn = 10:0.988
xˉ±s/n\bar x\pm s/\sqrt n(标准误)均值的波动有多大nn = 3:0.577;nn = 5:0.626;nn = 10:0.657
xˉ±t∗⋅s/n\bar x\pm t^*\cdot s/\sqrt n95% 置信区间0.950(t∗t^*:nn = 3 时 4.30,nn = 5 时 2.78,nn = 10 时 2.26)

为什么”± 标准误”远不到 95%:xˉ\bar x 偏离真值的程度要和 s/ns/\sqrt n 比,比值服从自由度 n−1n-1 的 t 分布;种子少时 ss 本身估得不准,t 分布的尾巴很厚。3 个种子时,95% 置信区间是”± 标准误”的 4.3 倍宽。

怎么报:表注里写明”均值 ± 95% 置信区间(3 个种子,t 分布)“。读者就知道你的区间是什么意思,也能自己换算。

检验两个配置有没有差别:配对的差值 di=Bi−Aid_i=B_i-A_i。

  • 配对 t 检验:t=dˉ/(sd/n)t=\bar d/(s_d/\sqrt n),自由度 n−1n-1。假设差值近似正态。
  • 符号翻转检验(不做正态假设):如果两者没有差别,每个差值的正负号都可以随意翻转,2n2^n 种翻法里有多少种的 ∣∑di∣|\sum d_i| 不小于观察值,就是 p 值。

一个容易忽略的事实(第 5 组):符号翻转检验最小可能的双侧 p 值是 2/2n2/2^n。5 个种子时最小也是 0.0625,永远到不了 0.05。例子:5 个差值 [0.8, 1.1, 0.4, 0.9, 1.3] 全为正,符号翻转检验 p = 0.0625,配对 t 检验 p = 0.004。两者结论不同,说明这个结论依赖于正态假设。如实报告;想要不依赖假设的结论,至少跑 6 个种子。

3.3 多重比较

动机:Capstone 里你会做很多消融:RoPE、GQA、不同的 β、不同的块大小……每个检验在 5% 水平下有 5% 的概率误报。做的比较越多,“至少一个是假阳性”的概率越大。

算一下(第 3 组):20 个其实都没有效果的消融,独立地各检验一次,至少误报一个的概率是 1−0.9520=0.6421-0.95^{20}=0.642。也就是说,不校正的话,做 20 个消融几乎一定能”发现”一个有效的。

两种校正:

  • Bonferroni:每个检验的门槛从 α\alpha 降到 α/m\alpha/m。简单,保守。
  • Holm:把 mm 个 p 值从小到大排,第 kk 个和 α/(m−k+1)\alpha/(m-k+1) 比,一路拒绝到第一个不满足的为止,后面全部不拒绝。

为什么 Holm 也能控制误报(直觉):如果有若干个真的无效的假设,其中 p 值最小的那个要被误判,必须在轮到它时满足 p≤α/(剩下的个数)p\le\alpha/(\text{剩下的个数}),而剩下的个数至少是无效假设的个数 m0m_0,所以门槛不超过 α/m0\alpha/m_0;m0m_0 个无效假设里至少一个 p 值 ≤α/m0\le\alpha/m_0 的概率不超过 α\alpha(Bonferroni 的论证)。Holm 的门槛一个比一个宽松,所以发现得不会比 Bonferroni 少。

手算例子(第 4 组):5 个消融的 p 值 [0.001, 0.008, 0.012, 0.04, 0.30]。

排序pHolm 门槛结果
10.0010.05/5 = 0.0100拒绝
20.0080.05/4 = 0.0125拒绝
30.0120.05/3 = 0.0167拒绝
40.040.05/2 = 0.0250不拒绝,停止

Bonferroni(门槛统一 0.01)只拒绝前两个;Holm 拒绝前三个。模拟(第 3 组):两者都把”至少误报一个”控制在 0.047;5 个真有效的消融里,Bonferroni 平均发现 3.41 个,Holm 3.49 个。

什么时候需要校正:你在报告里说”这些改动中有效的是……”时(从一堆比较里挑显著的)。事先就只计划检验一个主要假设(“RoPE 是否改善外推”),其余作为探索性结果单独标出,也是常见且诚实的做法。

3.4 调参的胜者诅咒

动机:调超参就是从很多组配置里挑验证分数最好的。被挑中的那组,往往不只是因为它真的好,还因为它碰巧运气好。

算一下(第 6 组):20 组超参的真实水平完全一样,每组的验证分数 = 真实水平 + 噪声(σ=1\sigma=1)。挑验证分数最高的那组:

  • 它的验证分数平均虚高 1.86σ(20 个标准正态的最大值的期望约 1.87)。
  • 拿去一个从没用过的测试集上测,平均 −0.01σ:虚高全部消失。
  • 真实水平也有差异(标准差 0.5σ)时,验证分数虚高 1.67σ,挑中真正最好那组的概率只有 0.19。

规则:数据分三份:训练、开发(调参、挑模型)、测试(只在最后测一次)。报告里的最终数字来自测试集。这和 Week 4 Day 5 §3.3 “在测试集上挑最好的会系统性地偏高”是同一件事。

对基线也要公平:如果新方法调了 20 组超参,基线只用默认值,比较就不公平:新方法的优势有一部分来自”多调了参”(加上胜者诅咒的虚高)。给基线同样的调参预算,或者在报告里写明。

3.5 消融怎么设计

  • 一次只改一个变量:从基线出发,每次加一样东西(A:+RoPE、+GQA、+两者),或者从完整系统出发每次去掉一样(B 的消融表)。同时改两样,就分不清是谁的功劳。
  • 控制混杂因素:参数量、训练 token 数、训练时间。改动带来的参数量变化要么补齐,要么在表里列出来(Week 1 Day 3 §5.2)。
  • 先写预测:跑之前写下”我预测 RoPE 在 2 倍长度上 loss 低于可学习编码”。结果和预测不一致时,是最有收获的时候(Week 1 Day 5 §4.2 也是这样要求的)。

3.6 实验记录

动机:两周后你一定会忘记”那个 0.83 是用哪个学习率、哪个版本的代码跑出来的”。

每次运行至少记录:

字段为什么
配置(全部超参)复现
随机种子复现、配对
代码版本(git commit)代码改了,旧数字就不能和新数字比
数据版本同上
指标(最终的和过程中的)结论
时间、硬件速度相关的数字只在同一硬件上可比

code/w5d6_experiment_log.py 就是做这件事的最小工具(§A.1)。更完整的工具(Weights & Biases、TensorBoard、MLflow)做的是同一件事,外加画图和网页界面。

可复现的随机性(PyTorch):

import random, numpy as np, torch
random.seed(s); np.random.seed(s); torch.manual_seed(s)   # torch.manual_seed 也会设置所有 GPU 的种子

即使这样,GPU 上的某些运算(比如一些卷积和 scatter 操作)仍然是非确定的。torch.use_deterministic_algorithms(True) 会让这些运算报错或换成确定的实现(更慢)。通常不需要逐位相同,需要的是”同一个种子的波动远小于不同种子之间的波动”。


§4 技术报告怎么写

先写骨架,再做实验:骨架里要填的每一张表,就是你要跑的每一组实验。这样可以避免”跑了一堆实验,写报告时发现缺了关键的对照”。

结构:

  1. 摘要(5 句):做了什么、为什么、主要结果(带数字和误差条)、最重要的局限。
  2. 动机:要回答的问题。为什么这个问题值得问?(这门课的哪一节讲过它?)
  3. 方法:实现了什么;关键公式;和标准做法的不同之处。
  4. 实验设置:数据、模型、超参、种子数、硬件;评测协议(指标怎么算、误差条是什么)。
  5. 结果:主表(带置信区间)+ 一两张最能说明问题的图。
  6. 消融与分析:每个组件的贡献;失败案例分析。
  7. 局限与诚实声明:没复现的、在误差范围内分不出来的、只在小模型上成立的。
  8. 复现方法:一条命令能跑出主表。

写作的几条规则(前五周的讲义也在这样做):

  • 每个数字都有来源:哪个脚本、哪个配置、几个种子。
  • “更好”要带误差条:说”B 比 A 好 0.8 个点(95% 置信区间 [0.2, 1.4],5 个种子配对)“,而不是”B 明显更好”。
  • 负面结果要写:比如”GQA-2 在验证 loss 上和 MHA 分不出来(差值 0.003 ± 0.008),但 KV Cache 减半”——这本身就是一个有用的结论。
  • 图要能独立看懂:坐标轴有单位,图注说清楚误差带是什么。

GitHub 仓库的 README:一句话说明、主结果表、一条命令复现、目录结构、引用的论文。招聘方通常只看 README,它就是你的简历附件。


§5 延伸阶段:四条支线

主线跑完,你对四个目标都有了”能上手”的水平。学习计划第 5 节的四条支线,每条约 3–4 周,挑一条走深。下面把每条拆到周,并写明出关标准。

5.1 支线 1:原理与面试打磨

周做什么出处 / 工具
1官方 cheatsheet 逐条默写;Day 4 的 28 个推导每个限时 10 分钟,全部 ✓Day 3 §3、Day 4
230 场模拟面试(每天 4–5 场,每场 20–30 分钟),口头作答、录音回放Day 5 §A;w5d5_mock_interview.py
3补目标岗位的专属栈:推荐系统的 LLM 化、多模态、推理优化等,各读 5–8 篇核心论文Day 1 §6.3 的笔记模板
4系统设计专项:5 个场景(知识库问答、代码助手、客服智能体、内容审核、评测平台)各讲一遍Day 5 §4

出关标准:w5d5_mock_interview.py --stats 每一层平均 ≥ 80%;任意抽 5 个推导 50 分钟内全部写对;5 个设计场景每个能讲 20 分钟。

5.2 支线 2:训练与微调工程

周做什么出处
1全量微调一个 1B 级别的模型,算清楚显存账并实测对照Week 2 Day 4 §4–5、Day 3 §2.4
2自己造一份高质量领域数据集:收集、清洗、去重、质量过滤、去污染Week 2 Day 4 §1、Week 2 Day 6 §1
3多卡训练(DeepSpeed 或 FSDP),测 MFU 和扩展效率Week 2 Day 4 §5、Week 2 Day 1 §A.2
4推理部署(vLLM:PagedAttention、连续批处理、投机解码),做一次”数据 → 训练 → 评测 → 部署”的闭环Week 3 Day 1 §3.2–3.3、Week 1 Day 4 §4

为什么第 2 周是分水岭(学习计划原话”绝大多数人卡在这”):模型和训练框架都是现成的,数据不是。数据质量决定了 SFT 的上限(Week 2 Day 6 §1.1 的 LIMA),而造数据需要你同时懂领域、懂模型会从数据里学到什么、懂怎么评测。

出关标准:一个自己造的数据集(带数据卡:来源、清洗步骤、规模、已知偏差);一个在它上面微调的模型,在自建测试集上相对基座有带置信区间的提升;一个部署好的服务,报告吞吐和延迟。

5.3 支线 3:Agent 系统

周做什么出处
1工具设计与 schema 工程;用 pass^k 评测一致性Week 4 Day 3 §2–3、Week 4 Day 4 §3.3
2多智能体编排;长期记忆(向量 + 结构化混合)Week 4 Day 4 §5–6
3沙箱与安全:提示注入的防御、权限最小化Week 4 Day 3 §6
4可观测性(trace、成本、延迟监控);把第 4 周的项目做成别人能用的产品Week 4 Day 4 §7、Day 5 §4.7

出关标准:一个智能体,在自建任务集上报告 pass@1 和 pass^k(带置信区间);一份安全测试报告(至少 20 个注入用例及结果);一个能看到每一步 trace、token 和耗时的界面。

5.4 支线 4:研究

周做什么
1定方向(推理 / 效率 / 对齐 / 评测,选一个);列出近两年 20 篇核心论文,按 Day 1 §6.3 的模板写笔记
2–3复现其中 2 篇的核心结果(就是 Capstone C 的方法)
4 起找一个未解决的小问题(读论文时记下的”作者没说的”、复现时发现的不一致),做实验,写成 workshop 论文或技术博客

怎么找”小问题”:复现时和论文不一致的地方;论文的局限一节;两篇论文结论矛盾的地方;一个方法只在大模型上验证过、在小模型上是否成立。最好的研究问题往往来自你亲手跑过的实验。

出关标准:20 篇论文笔记;2 个带误差条的复现报告;一篇写完的博客或论文草稿(有明确的问题、实验和诚实的结论)。


§6 全课回顾:贯穿九讲的五条主线

每一周的最后一天都总结过那一周的四条主线(Week 1 Day 6 §5.2、Week 2 Day 6 §5.2、Week 3 Day 6 §5.2、Week 4 Day 6 §5.2)。把它们放在一起看,会发现有几条线一直从第 0 周贯穿到今天。

一、把会随规模变化的量拉回 O(1)O(1)。 初始化让激活的方差保持稳定(Week 0 Day 2)→ 1/dk1/\sqrt{d_k} 让打分的方差回到 1(Week 1 Day 1 §2.1)→ Pre-LN 让梯度有一条恒等路径(Week 0 Day 2 §4.5)→ 残差分支乘 1/2L1/\sqrt{2L}(Week 1 Day 2 §2.3)→ BF16 的范围让梯度不下溢(Week 2 Day 4 §3)→ LoRA 的 α/r\alpha/r 让换秩不用重调学习率(Week 2 Day 6 §3.4)→ GRPO 除以组内标准差(Week 3 Day 5 §3.2)。每一个”魔法常数”背后都是一次方差计算。看到一个新常数,先问:它在把什么拉回 O(1)O(1)?

二、先算字节和算力,再谈设计。 C≈6NDC\approx6ND 决定了训练要多久、Chinchilla 怎么配比(Week 2 Day 1 §3);16 字节/参数决定了要不要 ZeRO(Week 2 Day 4 §4–5);解码时读一遍权重的字节数决定了速度上限,所以量化、GQA、推测解码都能加速(Week 1 Day 4 §1.5、Week 2 Day 5 §5);FlashAttention 用多算换少搬(Week 1 Day 6 §3);PPO 的四个模型决定了 GRPO 和 DPO 为什么流行(Day 3 §2.5);智能体的 token 随步数平方增长(Week 4 Day 3 §2.3)。Day 3 的”一个模型的全部数字”和 Day 5 的估算题,就是这条线的期末考试。

三、一个目标,越来越便宜的逼近。 预训练最大化似然 → SFT 模仿示范(Week 2 Day 6 §1)→ RLHF 最大化奖励并约束 KL,最优解 π∗∝πrefer/β\pi^*\propto\pi_{\text{ref}}e^{r/\beta}(Week 3 Day 4 §1.2)→ PPO 用采样逼近它、DPO 用闭式解绕开奖励模型、best-of-n 在测试时逼近它(Week 3 Day 6 §5.2)→ 奖励能被程序验证时,GRPO 直接优化正确率(Week 3 Day 5)→ 小模型用蒸馏继承大模型的推理(Day 2 §3.4)。每一步都在用更少的人力和算力,逼近”人想要的分布”。

四、代理会被钻空子,所以测量先于优化。 困惑度和下游能力不一致(Week 2 Day 6 §5.2 的”度量在测什么”)→ 奖励模型被过度优化(Week 3 Day 2 §3.2)→ 验证器和评委也会被钻空子(Week 3 Day 6 §2.4、Week 4 Day 6 §2.2)→ 基准被污染(Week 4 Day 5 §4.4)→ 50 道题分辨不出几个点的差别(Week 4 Day 5 §3.1)→ 今天 §3 的种子方差、多重比较和胜者诅咒。优化压力越大,代理的缺陷越致命;没有误差棒的改进只是一个故事。

五、精确的优化与近似的取舍。 KV Cache、FlashAttention、推测解码是精确的,只改计算顺序;GQA、量化、稀疏注意力、ANN 检索、二值向量、扩散模型的并行解码是近似,改了模型或结果,要用训练、精排或更多步数来弥补(Week 1 Day 6 §5.2、Week 2 Day 6 §5.2、Week 4 Day 1 §4、Day 1 §3.4)。面对任何加速方法,第一个问题永远是:它是精确的吗?如果不是,误差去哪了?

用这五条线检验自己:拿一篇新论文,问五个问题:它在把什么拉回 O(1)O(1)?它省了哪些字节或算力?它在逼近哪个目标、用什么手段?它的评测可信吗、会不会被钻空子?它是精确的还是近似的?能回答这五个问题,你就读懂了它。


§7 冲刺之后:持续的机制

Day 1 §6.3 已经给出了每周 3 小时的追踪流程(筛选 → 精读 2 篇 → 复现 1 个数字)和论文笔记模板。这里补两件事:

每月一次复盘(1 小时):

  1. 这个月读了几篇、复现了几个数字?笔记里有哪些”作者没说的”值得追?
  2. 支线的进度:哪个里程碑完成了,哪个卡住了,卡在哪?
  3. 回头看一遍这门课的全景图(Day 3 §4 画的那张 A3 纸),把这个月学到的新东西标在对应的位置上。新知识挂在旧框架上,才不会散。

学习计划第 6 节的执行纪律仍然适用:每天先默写昨天;动手任务不许跳;维护疑问清单;对进度诚实;允许延期,不允许跳过。


§8 最终清单

主线(第 0–5 周):

  • 每周的出关测试:Week 1 Day 6 §5.3、Week 2 Day 6 §5.3、Week 3 Day 6 §5.3、Week 4 Day 6 §5.3
  • 期中(Week 3 Day 1)和期末(Day 2)闭卷完成,错题全部溯源
  • A3 全景图画完,按官方大纲逐条核对(Day 3 §1、§3–4)
  • 28 个推导、15 道代码默写(Day 4)
  • 估算题、设计题、模拟面试(Day 5)
  • 五个动手项目:字符级语言模型(Week 0 Day 5)、mini-GPT(Week 1 Day 3)、LoRA 微调(Week 2 Day 6)、DPO / GRPO(Week 3 Day 4–5)、RAG 与智能体(Week 4)
  • 学习计划第 7 节的进度勾选表全部打勾(或者诚实地标出延期的项)

Capstone:

  • 一页计划(§B 第 1 题)
  • 基线 3 个种子,记录在实验日志里
  • 技术报告初稿(§4 的结构)和 GitHub 仓库

延伸阶段:

  • 选定一条支线,写下 4 周计划
  • 追踪机制运转起来(Day 1 §6.3):第一周读了 2 篇、复现了 1 个数字

§A 实验工具:API 用法与边界

A.1 w5d6_experiment_log.py

命令 / 函数做什么
python code/w5d6_experiment_log.py --demo用一个模拟的消融实验演示完整流程:记录 → 汇总 → 配对比较 → Holm 校正 → Markdown 表
--summary 文件 --metric val_loss --by name汇总一个日志文件:按配置名分组,给出种子数、均值、95% 置信区间
--selftest自检
log_run(path, name, config, seed, metrics)在你的训练脚本末尾调用,追加一行记录(自动记下时间、Python 版本、git commit)
summarize(runs, metric, by)分组汇总
compare(runs, a, b, metric)配对比较两个配置(按种子配对):均值差、t 置信区间、配对 t 检验和符号翻转检验的 p 值
holm(pvals)Holm 校正

演示的输出说明了一件常被弄错的事(--demo,每个配置 5 个种子,“真实”loss 是演示用的假设值):四个配置各自的 95% 置信区间几乎完全重叠(基线 [1.4715, 1.5527],+RoPE [1.4493, 1.5344]),但配对比较 +RoPE vs 基线的差值是 −0.0202,置信区间 [−0.0323, −0.0082],t 检验 p = 0.0096,Holm 校正后 0.0289,显著。原因是种子效应(同一个种子的初始化和数据顺序)同时影响两个配置,配对相减后被消掉:差值的标准误配对时 0.0043,不配对时 0.0212。“两个置信区间重叠,所以没有差别”是错误的推理;比较两个配置,要看差值的置信区间。同一张表里符号翻转检验 p = 0.0625,正是 §3.2 说的”5 个种子到不了 0.05”。

日志格式:一行一个 JSON(JSON Lines)。好处是追加写入不用读整个文件、某一行写坏了不影响其他行、可以用任何工具读。

边界:

  • 配对按种子对齐:compare 只用两个配置都有的种子;没有共同种子时报错。所以 A 和 B 要用同一组种子跑。
  • t 检验的 p 值用不完全 Beta 函数精确计算(和 w5day6_checks.py 同一套),不依赖 scipy;种子数 < 2 时无法计算标准差,返回 None。
  • 符号翻转检验枚举全部 2n2^n 种翻法,nn 超过 16 时改用 10 万次随机翻转近似。
  • 它不画图,也不管理模型文件。需要这些时换成 W&B、TensorBoard 或 MLflow,记录的字段(§3.6 的表)不变。

A.2 常用的统计工具(知道即可)

  • scipy.stats.ttest_rel(b, a):配对 t 检验;scipy.stats.ttest_ind:不配对(加 equal_var=False 是 Welch 检验)。
  • scipy.stats.wilcoxon:配对的符号秩检验,不做正态假设,和符号翻转检验思路相近。
  • statsmodels.stats.multitest.multipletests(pvals, method="holm"):多重比较校正,method 也可以是 "bonferroni"、"fdr_bh"(控制错误发现率,比控制”至少一个误报”宽松)。
  • 边界:这些检验都假设各个种子的运行是独立的。同一次运行的多个检查点不是独立样本,不能当作多个种子。

§B 实操

  1. 一页计划(0.5h):选定方向,写下:要回答的问题、M0–M4 的里程碑和日期、要报告的主表(空表头)、种子数、什么算成功。
  2. 跑实验方法论的数字(0.5h):python w5day6_checks.py,对照 §3 的每一张表。挑一组改参数(比如第 1 组把 Δ 改成 0.2),先预测再运行。
  3. 试用实验日志(0.5h):python code/w5d6_experiment_log.py --demo,读懂输出的每一部分;然后在你的 Capstone 训练脚本末尾加上 log_run(...)。
  4. 跑基线(剩余时间):Capstone 的 M0,3 个种子,用 --summary 汇总出均值和 95% 置信区间。这个区间的宽度决定了你后面能分辨多小的改进。
  5. 讲一遍五条主线(0.5h):合上文档,用 10 分钟讲 §6,录音。

参考实现:code/w5d6_experiment_log.py。


§C 自测

  1. 两个配置的真实差距是种子噪声标准差的一半。每个配置跑 1 个种子,排反的概率是多少?要把它压到 5% 左右,每个配置需要多少个种子?
  2. 一篇论文写 “0.85 ± 0.02(3 个种子)“。如果 ±0.02 是标准误,对应的 95% 置信区间大约是多少?
  3. 为什么 5 个种子的配对符号翻转检验永远得不到 p < 0.05?这时配对 t 检验却显著,说明了什么?
  4. 你做了 12 个消融,其中 2 个的 p 值低于 0.05(0.003 和 0.03)。用 Holm 校正后哪些还显著?
  5. 你在开发集上调了 30 组学习率,最好的那组比基线高 1.5 个点。为什么这个 1.5 不能直接写进报告?应该怎么做?
  6. Capstone A 里 GQA 让验证 loss 变差了 0.02。在下结论”GQA 损害质量”之前,你要检查哪两件事?
  7. 用 §6 的五个问题分析一篇你最近读的论文(或者 Week 1 Day 6 §3 的 FlashAttention)。

答案线索:1 → §3.1(0.36;约 20 个);2 → §3.2(4.30×0.02≈0.094.30\times0.02\approx0.09,即约 [0.76, 0.94]);3 → §3.2(最小 p = 2/32;结论依赖正态假设);4 → §3.3(0.003 的门槛 0.05/12 ≈ 0.0042,拒绝;0.03 的门槛 0.05/11 ≈ 0.0045,不拒绝);5 → §3.4;6 → §2.1 的常见坑、§3.1;7 → §6。


出关标准

  • 选定 Capstone 方向,一页计划写完
  • 基线跑了 3 个以上种子,用实验日志汇总出均值和 95% 置信区间
  • 能解释 ± 标准差、± 标准误、95% 置信区间的区别,并说出 3 个种子时 t 临界值约 4.3
  • 能手算 Holm 校正,并说出它为什么不比 Bonferroni 发现得少
  • 能用 10 分钟讲完 §6 的五条主线,每条至少举三个跨周的例子
  • 选定延伸阶段的支线,写下 4 周计划

疑问清单

← 返回课程目录