Skip to content

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

自回归分解 p(x1:T)=∏t=1Tp(xt∣x<t) 是全书的轴。tokenizer 改变随机变量的单位;因果掩码保证条件集合;交叉熵衡量预测;KV cache 避免重复计算条件;SFT 和强化学习改变训练信号,仍然使用同一类条件分布。把这些环节连起来,比单独背出 Transformer 的组件名字更重要。

阅读与动手路线 ​

阶段章节要交付的可检验结果
基础补齐张量与梯度手算形状、稳定 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 Basics430e2c844e29
A2 Systemse495ed740080
A3 Scaling09d205bde59e
A4 Data5a5f890cd9b7
A5 Alignmenteb2c562e0580

这里的本地实验是教学实现,接口、测试和语料不与官方评分器兼容。读官方 handout 时以以上快照为准;不要把本地测试通过写成“完成官方 A1–A5”。

开始前的自测 ​

学完一章,最好留下一个小产物:一张张量表、一个能复现的错误、一次仅改变一个因素的对照实验,或一段解释设计取舍的文字。只读懂公式还不能说明实现正确;只跑通代码也不能说明知道算法为什么成立。本书将这两条证据并排组织,你可以先使用完整实现作为参照,再遮住某个函数自行重写并对比测试结果。对较复杂的系统章节,先完成数学等价性与单步训练验证,再进入 GPU 环境,不需要等待拥有昂贵硬件才能开始学习。

复习时优先追踪跨章节的问题。例如,扩大词表如何改变训练成本?更短的上下文如何改变数据窗口和 cache?不同长度的回答怎样影响 SFT 和强化学习 loss?这些问题能检验你是否把模型、数据与系统当作同一个实验系统理解。

给同一句话换 tokenizer,token 数变少,平均每 token loss 变大。模型一定变差了吗?

展开答案

不能直接判断。预测单位改变了,平均 token NLL 失去直接可比性。比较同一文本的总负对数似然,并按相同字节数归一化,或使用相同 tokenizer 和评测协议。即使编码更短,也可能让词表与输出层更大。

下一章:张量、概率与梯度的最小前置知识。