外观
CS336:从零构建语言模型
这门课的终点,是你能解释并运行这样一个系统:文本进入 tokenizer,变成整数;整数经过 Transformer,变成下一个 token 的分布;训练程序用真实后继修正参数;数据、算力和评测决定哪些改进值得保留。模型会生成文本只是第一道验收。你还需要知道一轮训练花在哪里,为什么某次实验可信,以及如何发现未来信息泄漏。
本学习包固定 Stanford CS336 Spring 2025,按官方 A1–A5 的问题组织原创中文讲解。它不是官方讲义翻译,也不冒充官方作业的完整提交。正文把公式连接到张量形状和代码,CPU 实验则提供一个可运行、可检查梯度的缩小系统。GPU 内核、大规模数据处理、完整强化学习训练在相应章节给出算法、实施路线与验收标准;本仓库没有声称已完成这些规模的复现。
先看整体因果链
flowchart LR A[原始文档] --> B[清洗 去重 切分] B --> C[BPE 编码] C --> D[输入和目标错开一位] D --> E[因果 Transformer] E --> F[交叉熵 反向传播 AdamW] F --> E E --> G[采样生成] G --> H[评测与错误分析] H --> B
查看流程图文本
flowchart LR A[原始文档] --> B[清洗 去重 切分] B --> C[BPE 编码] C --> D[输入和目标错开一位] D --> E[因果 Transformer] E --> F[交叉熵 反向传播 AdamW] F --> E E --> G[采样生成] G --> H[评测与错误分析] H --> B
自回归分解
阅读与动手路线
| 阶段 | 章节 | 要交付的可检验结果 |
|---|---|---|
| 基础补齐 | 张量与梯度 | 手算形状、稳定 softmax、有限差分检查 |
| A1 基础 | 分词、模型、训练、推理 | 编码往返、无未来泄漏、loss 下降、保存后生成 |
| A2 系统 | 系统优化 | 解释 IO 成本、在线 softmax 与稠密结果一致 |
| A3 扩展规律 | Scaling laws | 拟合与外推分开,说明预算约束 |
| A4 数据 | 数据工程 | 保留来源、隔离验证集、报告去重前后规模 |
| A5 对齐 | SFT 与推理强化学习 | 正确的 response mask、优势、概率比与偏好目标 |
| 综合 | 实验手册、复盘与自测 | 一个带配置、日志、结论和局限的实验报告 |
建议第一遍沿 A1 走完,先获得完整反馈循环。第二遍读数据与 scaling,学习如何选择实验。第三遍进入系统优化和强化学习,避免在模型尚未正确时追逐吞吐。若某段推导不熟悉,回到前置章对应小节即可,无需另外开一门数学课程。
本地最短闭环
从仓库根目录执行,Python 需要 NumPy。依赖列表位于 labs/llm/requirements.txt:
sh
python3 -m unittest discover -s labs/llm -p 'test_*.py' -v
python3 labs/llm/train.py --steps 300
python3 labs/llm/generate.py --prompt "the fox " --tokens 100
python3 labs/llm/algorithms.py代码使用 CPU、float64、RMSNorm、RoPE、SwiGLU、多头因果注意力和真实反向传播。默认字符词表缩短训练;--tokenizer bpe 可切换字节 BPE。小语料是仓库原创的英文短句,不代表通用语言能力。有限语料出现过拟合、拼写错误和重复输出,正适合研究训练指标与生成质量为何不等价。
版本记录
2026-10-04 核查了 2025 官网归档 与五个官方 spring2025 标签。标签经 GitHub API 核实直接指向下列 commit;链接固定提交,避免 main 随后续学年改变。
| 作业 | 固定官方源码快照 |
|---|---|
| A1 Basics | 430e2c844e29 |
| A2 Systems | e495ed740080 |
| A3 Scaling | 09d205bde59e |
| A4 Data | 5a5f890cd9b7 |
| A5 Alignment | eb2c562e0580 |
这里的本地实验是教学实现,接口、测试和语料不与官方评分器兼容。读官方 handout 时以以上快照为准;不要把本地测试通过写成“完成官方 A1–A5”。
开始前的自测
学完一章,最好留下一个小产物:一张张量表、一个能复现的错误、一次仅改变一个因素的对照实验,或一段解释设计取舍的文字。只读懂公式还不能说明实现正确;只跑通代码也不能说明知道算法为什么成立。本书将这两条证据并排组织,你可以先使用完整实现作为参照,再遮住某个函数自行重写并对比测试结果。对较复杂的系统章节,先完成数学等价性与单步训练验证,再进入 GPU 环境,不需要等待拥有昂贵硬件才能开始学习。
复习时优先追踪跨章节的问题。例如,扩大词表如何改变训练成本?更短的上下文如何改变数据窗口和 cache?不同长度的回答怎样影响 SFT 和强化学习 loss?这些问题能检验你是否把模型、数据与系统当作同一个实验系统理解。
给同一句话换 tokenizer,token 数变少,平均每 token loss 变大。模型一定变差了吗?
展开答案
不能直接判断。预测单位改变了,平均 token NLL 失去直接可比性。比较同一文本的总负对数似然,并按相同字节数归一化,或使用相同 tokenizer 和评测协议。即使编码更短,也可能让词表与输出层更大。
下一章:张量、概率与梯度的最小前置知识。