时长 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–§2,选方向(0.5h):按 §2.4 的表对照自己的目标和算力。
- 读 §3(1h):实验方法论。边读边跑
python w5day6_checks.py,每一组对应一小节。 - 读 §4(0.5h):技术报告的结构。先写报告的骨架,再做实验:骨架里要填的表,就是你要跑的实验。
- 读 §6(0.5h):全课的五条主线。合上文档,试着自己讲一遍。
- 启动 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 节)。一个完整项目会逼你处理所有”讲义里一笔带过”的事:数据从哪来、超参怎么定、结果为什么和论文不一样、差别是不是噪声。这些事情没有标准答案,但处理它们的能力才是招聘方真正想看的。
什么样的项目是可信的(贯穿今天的标准):
- 能复现:别人拿到你的代码和说明,能跑出同样的数字(在误差范围内)。
- 比较公平:基线和新方法用同样的数据、同样的调参预算、同样的评测。
- 带误差棒:每个数字都有多个种子、写清楚是哪种误差条(§3.2)。
- 诚实:负面结果、和论文不一致的地方、局限,都写出来。
为什么”诚实”排在可信的标准里:这门课的每一份讲义都在这样做(比如 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 Cache | KV 头数 = 查询头数 / 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,一次训练约 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 好 ,每次运行的种子噪声标准差 。每个配置跑 个种子取平均,均值之差服从 ,排反的概率 :
| 每个配置的种子数 | 1 | 3 | 5 | 10 | 20 |
|---|---|---|---|---|---|
| 排反的概率(公式) | 0.362 | 0.270 | 0.215 | 0.132 | 0.057 |
| 模拟 | 0.361 | 0.267 | 0.215 | 0.136 | 0.056 |
读法:差距只有半个噪声标准差时,单个种子有 36% 的概率得出相反的结论。怎么知道你的 有多大? 先把基线跑 3–5 个种子,看它们之间的波动。这一步本身就是 M0 的意义。
同一个种子配对:让 A 和 B 用同一组种子(同样的初始化和数据顺序),比较逐种子的差值。种子带来的波动有一部分是两者共有的,相减后被消掉,和 Week 4 Day 5 §3.2 的配对比较是同一个道理。
3.2 误差条报什么
动机:论文里常见 “0.85 ± 0.02”,但 ±0.02 可能是三种完全不同的东西。
个种子,样本均值 、样本标准差 :
| 写法 | 含义 | 真值落在区间里的概率(第 2 组) |
|---|---|---|
| 单次运行的波动有多大 | = 3:0.775; = 5:0.911; = 10:0.988 | |
| (标准误) | 均值的波动有多大 | = 3:0.577; = 5:0.626; = 10:0.657 |
| 95% 置信区间 | 0.950(: = 3 时 4.30, = 5 时 2.78, = 10 时 2.26) |
为什么”± 标准误”远不到 95%: 偏离真值的程度要和 比,比值服从自由度 的 t 分布;种子少时 本身估得不准,t 分布的尾巴很厚。3 个种子时,95% 置信区间是”± 标准误”的 4.3 倍宽。
怎么报:表注里写明”均值 ± 95% 置信区间(3 个种子,t 分布)“。读者就知道你的区间是什么意思,也能自己换算。
检验两个配置有没有差别:配对的差值 。
- 配对 t 检验:,自由度 。假设差值近似正态。
- 符号翻转检验(不做正态假设):如果两者没有差别,每个差值的正负号都可以随意翻转, 种翻法里有多少种的 不小于观察值,就是 p 值。
一个容易忽略的事实(第 5 组):符号翻转检验最小可能的双侧 p 值是 。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 个其实都没有效果的消融,独立地各检验一次,至少误报一个的概率是 。也就是说,不校正的话,做 20 个消融几乎一定能”发现”一个有效的。
两种校正:
- Bonferroni:每个检验的门槛从 降到 。简单,保守。
- Holm:把 个 p 值从小到大排,第 个和 比,一路拒绝到第一个不满足的为止,后面全部不拒绝。
为什么 Holm 也能控制误报(直觉):如果有若干个真的无效的假设,其中 p 值最小的那个要被误判,必须在轮到它时满足 ,而剩下的个数至少是无效假设的个数 ,所以门槛不超过 ; 个无效假设里至少一个 p 值 的概率不超过 (Bonferroni 的论证)。Holm 的门槛一个比一个宽松,所以发现得不会比 Bonferroni 少。
手算例子(第 4 组):5 个消融的 p 值 [0.001, 0.008, 0.012, 0.04, 0.30]。
| 排序 | p | Holm 门槛 | 结果 |
|---|---|---|---|
| 1 | 0.001 | 0.05/5 = 0.0100 | 拒绝 |
| 2 | 0.008 | 0.05/4 = 0.0125 | 拒绝 |
| 3 | 0.012 | 0.05/3 = 0.0167 | 拒绝 |
| 4 | 0.04 | 0.05/2 = 0.0250 | 不拒绝,停止 |
Bonferroni(门槛统一 0.01)只拒绝前两个;Holm 拒绝前三个。模拟(第 3 组):两者都把”至少误报一个”控制在 0.047;5 个真有效的消融里,Bonferroni 平均发现 3.41 个,Holm 3.49 个。
什么时候需要校正:你在报告里说”这些改动中有效的是……”时(从一堆比较里挑显著的)。事先就只计划检验一个主要假设(“RoPE 是否改善外推”),其余作为探索性结果单独标出,也是常见且诚实的做法。
3.4 调参的胜者诅咒
动机:调超参就是从很多组配置里挑验证分数最好的。被挑中的那组,往往不只是因为它真的好,还因为它碰巧运气好。
算一下(第 6 组):20 组超参的真实水平完全一样,每组的验证分数 = 真实水平 + 噪声()。挑验证分数最高的那组:
- 它的验证分数平均虚高 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 技术报告怎么写
先写骨架,再做实验:骨架里要填的每一张表,就是你要跑的每一组实验。这样可以避免”跑了一堆实验,写报告时发现缺了关键的对照”。
结构:
- 摘要(5 句):做了什么、为什么、主要结果(带数字和误差条)、最重要的局限。
- 动机:要回答的问题。为什么这个问题值得问?(这门课的哪一节讲过它?)
- 方法:实现了什么;关键公式;和标准做法的不同之处。
- 实验设置:数据、模型、超参、种子数、硬件;评测协议(指标怎么算、误差条是什么)。
- 结果:主表(带置信区间)+ 一两张最能说明问题的图。
- 消融与分析:每个组件的贡献;失败案例分析。
- 局限与诚实声明:没复现的、在误差范围内分不出来的、只在小模型上成立的。
- 复现方法:一条命令能跑出主表。
写作的几条规则(前五周的讲义也在这样做):
- 每个数字都有来源:哪个脚本、哪个配置、几个种子。
- “更好”要带误差条:说”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 |
| 2 | 30 场模拟面试(每天 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 周贯穿到今天。
一、把会随规模变化的量拉回 。 初始化让激活的方差保持稳定(Week 0 Day 2)→ 让打分的方差回到 1(Week 1 Day 1 §2.1)→ Pre-LN 让梯度有一条恒等路径(Week 0 Day 2 §4.5)→ 残差分支乘 (Week 1 Day 2 §2.3)→ BF16 的范围让梯度不下溢(Week 2 Day 4 §3)→ LoRA 的 让换秩不用重调学习率(Week 2 Day 6 §3.4)→ GRPO 除以组内标准差(Week 3 Day 5 §3.2)。每一个”魔法常数”背后都是一次方差计算。看到一个新常数,先问:它在把什么拉回 ?
二、先算字节和算力,再谈设计。 决定了训练要多久、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,最优解 (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)。面对任何加速方法,第一个问题永远是:它是精确的吗?如果不是,误差去哪了?
用这五条线检验自己:拿一篇新论文,问五个问题:它在把什么拉回 ?它省了哪些字节或算力?它在逼近哪个目标、用什么手段?它的评测可信吗、会不会被钻空子?它是精确的还是近似的?能回答这五个问题,你就读懂了它。
§7 冲刺之后:持续的机制
Day 1 §6.3 已经给出了每周 3 小时的追踪流程(筛选 → 精读 2 篇 → 复现 1 个数字)和论文笔记模板。这里补两件事:
每月一次复盘(1 小时):
- 这个月读了几篇、复现了几个数字?笔记里有哪些”作者没说的”值得追?
- 支线的进度:哪个里程碑完成了,哪个卡住了,卡在哪?
- 回头看一遍这门课的全景图(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。 - 符号翻转检验枚举全部 种翻法, 超过 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 实操
- 一页计划(0.5h):选定方向,写下:要回答的问题、M0–M4 的里程碑和日期、要报告的主表(空表头)、种子数、什么算成功。
- 跑实验方法论的数字(0.5h):
python w5day6_checks.py,对照 §3 的每一张表。挑一组改参数(比如第 1 组把 Δ 改成 0.2),先预测再运行。 - 试用实验日志(0.5h):
python code/w5d6_experiment_log.py --demo,读懂输出的每一部分;然后在你的 Capstone 训练脚本末尾加上log_run(...)。 - 跑基线(剩余时间):Capstone 的 M0,3 个种子,用
--summary汇总出均值和 95% 置信区间。这个区间的宽度决定了你后面能分辨多小的改进。 - 讲一遍五条主线(0.5h):合上文档,用 10 分钟讲 §6,录音。
参考实现:code/w5d6_experiment_log.py。
§C 自测
- 两个配置的真实差距是种子噪声标准差的一半。每个配置跑 1 个种子,排反的概率是多少?要把它压到 5% 左右,每个配置需要多少个种子?
- 一篇论文写 “0.85 ± 0.02(3 个种子)“。如果 ±0.02 是标准误,对应的 95% 置信区间大约是多少?
- 为什么 5 个种子的配对符号翻转检验永远得不到 p < 0.05?这时配对 t 检验却显著,说明了什么?
- 你做了 12 个消融,其中 2 个的 p 值低于 0.05(0.003 和 0.03)。用 Holm 校正后哪些还显著?
- 你在开发集上调了 30 组学习率,最好的那组比基线高 1.5 个点。为什么这个 1.5 不能直接写进报告?应该怎么做?
- Capstone A 里 GQA 让验证 loss 变差了 0.02。在下结论”GQA 损害质量”之前,你要检查哪两件事?
- 用 §6 的五个问题分析一篇你最近读的论文(或者 Week 1 Day 6 §3 的 FlashAttention)。
答案线索:1 → §3.1(0.36;约 20 个);2 → §3.2(,即约 [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 周计划