跳到主要内容

reading-notes — building-large-language-models-from-scratch

通读日期:2026-08-27。原文 96 个文件 = 7 个导航/前置 + 11 个真实章 + 索引。 真实结构:ch01 工具与环境;ch02 基础概念(transformer 全景 + 训练数学 + 2024-25 版图); ch03 BPE 切词器;ch04 ModelConfig+RMSNorm;ch05 RoPE+NTK+YaRN;ch06 SDPA+SWA+GQA+sink; ch07 AttentionBlock 总装;ch08 MLP+MoE+SwiGLU;ch09 TransformerBlock+完整模型; ch10 数据+训练+推理「大时刻」;ch11 四阶段训练+对齐+CUDA。 导航章 01-07(版权/献辞/引言/TOC/作者)与 96(索引)未读未引。

全书性格(写作时必须时时记得)

  • 一半综述 + 一半代码。综述部分明显是 AI 辅助生成的百科腔(每节都是"背景/优点/局限"三段式), 常有可疑精确数字(如"BERT 第 7 层注意力权重 >0.8"、"Claude 3.7 估计 2000 亿参数"); 代码部分是真的、自洽的,且每行都被逐行讲解。
  • 卖点 = 2025 年开源模型的现代配方全套:RMSNorm、RoPE+NTK+YaRN、GQA、滑动窗口偶数层交替、 attention sink、MoE+SwiGLU、权重绑定、单次融合 QKV 投影。书架上唯一一本把这些拼全的。
  • 诚实的终点:ch10 用 2 层/128 维/约 10 万参数的模型在 4200 词 Wharton 短篇上训练 20 轮, 然后「who is rick」的输出是:复读训练文本 → 被惩罚机制打断 → 再复读 → 崩成乱码。 作者明说这是"教育价值",并借此解释为什么生产模型要那么大。
  • 已知瑕疵(拆解要点破):数学公式是图片,转码后全丢(21:149、21:429 等残留 codecogs 链接), 但正文散文把公式含义都讲了一遍,可重建;ch05 summary 把 RoFormer 误写成 "Reformer"(40:1063); NTK 在 40:773 被写成 "Neuro Tangent Kernel"(应为 Neural);GPT-4 "trillions of parameters"(41:29)是传闻口径。

各章要点与可引段落(行号=清洗文本行)

ch01(08-20)

  • 08:21 受 Karpathy GPT-from-scratch 讲座启发;08:23 本地优先、不依赖云与 GPU 集群
  • 09:7 语言模型=概率系统预测下一元素;09:15 Vaswani 2017;09:19 tokenization/embedding;09:31 causal LM;09:37 微调;09:37 末 无真正理解
  • 10:11 attention 定义;10:13 与 RNN 对照(并行);10:27 QKV 点积+sqrt 缩放;10:35 multihead;10:41 层堆叠;10:51 "scientist...discovered" 长程例;10:69 稀疏注意力 O(n²);10:101 注意力会偏袒高频模式→幻觉
  • 11:3 工具清单;11:15 绿野仙踪=主数据集(公版)
  • 14:3 PyTorch=Meta AI;14:7 动态图
  • 15:5 前几个模型刻意 CPU 可跑;15:11 A100 40GB 6912 CUDA cores;15:31 1.5B 模型 FP32 3GB→FP16 1.5GB;15:33 Tensor Cores 10x;15:65 H100 1250 TFLOPS;15:71 HBM3 141GB
  • 16:33 "I love AI"→[12,45,78];16:51 训练/验证损失曲线看过拟合;16:101 perplexity=exp(cross-entropy)
  • 17:5 四数据集总览;17:9 TinyStories 合成童书、几百万参数就连贯、局限是不出界;17:13 莎翁字符级;17:17 绿野仙踪约 4 万词;17:21 OpenWebText 模仿 GPT-2、几十 GB、.xz
  • 18:LZMA 压到 10-20%(18:7 附近列表第 1 条);macOS ARM 装不上→内置 lzma
  • 19:RLHF 对齐;scaling laws;量化/剪枝/蒸馏;多模态 DALL·E CLIP

ch02(21,482 行)

  • 21:19 transformer=2017 金标准;21:21 RNN→MoE→SSM 演化;21:27 Mamba
  • 21:45 词表 50000、维度 512/768;21:49 cat-dog 近、cat-table 远
  • 21:61 排列不变性;21:67 正弦 PE(pos+k) 是线性函数;21:91 "The cat chased the dog" vs 互换
  • 21:99-117 QKV→分数→softmax→加权和;21:105 sqrt(dk) 防 softmax 进小梯度区;21:117 "chased 强看 cat 和 dog"
  • 21:121-127 多头各管一摊;21:131-141 掩码注意力=只许看过去;21:139 softmax 对未来给零权重
  • 21:145-157 FFN 先扩后缩,ReLU/GELU;21:161-175 残差+层归一化让 12/24 层可训
  • 21:191-195 交叉熵+teacher forcing;21:209-213 复杂度 O(n²);21:217-233 优点(并行/长程/GPT-3 175B/AlphaFold)与局限
  • 21:269-293 下词预测链式分解→NLL=交叉熵;softmax;sampled/hierarchical softmax
  • 21:299-305 MLM 15% 掩码(BERT);21:311-323 梯度下降 lr 1e-4..1e-6;SGD batch 512-4096
  • 21:329-343 Adam 一阶/二阶矩 β1 0.9 β2 0.999;21:349-355 反向传播=链式法则,12-96 层
  • 21:361-397 dropout 0.1;weight decay 0.01、AdamW 解耦;label smoothing
  • 21:403-433 SFT 与 RLHF(奖励模型+PPO+KL 罚)
  • 21:453-471 2024-25 版图:Qwen3 235B/128k(2025-04 开源)、GPT-4.5 闭源 128k、Claude 3.7 200k、Gemini 2.5 Pro 约 1M、 DeepSeek R1 总参 671B/激活 37B、Llama 3.3 128k、Mistral Small 3 约 24B

ch03(22-38)

  • 22:15 切词是第一步;22:17 BPE 在 BERT/GPT/T5 广泛采用;22:19 起源于压缩
  • 23:3 "I love to code!" 例;23:5 token→ID 词表
  • 24:五条重要性(标准化/词表/语言多样性/效率/语义保留,"unhappiness"→un+happi+ness)
  • 25:三类切词器优劣(词/字符/子词;BPE、WordPiece、SentencePiece)
  • 26:7 Gage 1994 压缩算法;26:9 Sennrich 2015 移植到 NLP(稀有词)
  • 27:15 GPT-2 词表 50,257;27:11 新 ID 从 256 起(避开 ASCII 0-255)
  • 28:"the cat in the hat" 三轮合并演示(28:27-59);28:95-107 解码无损还原
  • 29:low/lower/lowest/widest 演示;29:59 "lowest"→[low, est]
  • 32:34 副作用:over-segment、切出不语言学直觉的碎片;33:WordPiece 按似然、SentencePiece 无需预切词(中文)
  • 34:30k-50k 是常用词表区间
  • 35:实现。35:5 Ġ 空格前缀约定;35:53 special tokens;;35:167 headroom=max(32,10%);35:217-223 bpe_ranks 按创建顺序排名
  • 36:31 "Hello world\n New line"→"HelloĠworld\nĠNewĠline";36:169-223 rank 模式找最低 rank 对合并;36:271-277 Counter(zip) 找最高频对;36:281-301 deque 扫描替换
  • 38:5-25 请求 160 只得到 111(语料太小无对可并);38:27 特殊 token 占 0-4;38:43 Ġ 独立存在也常被并进 "HelloĠ";38:47-63 rank0 'o'+'r'→'or'… 'Hel'+'lo'→'Hello';38:97-105 大写 P 不在语料→→解码时被丢→"lease";38:111 ;38:153-157 存/载后编码完全一致

ch04(39)

  • 39:43-75 ModelConfig 全字段:layers 4、experts 16、experts_per_token 2、vocab 8000、hidden 256、intermediate 256、 head_dim 64、heads 4、kv_heads 2、sliding_window 0、ctx 4096、rope_theta 10000、swiglu_limit 7.0
  • 39:77 "一个数字列表=设计决策";39:97-99 深度=抽象层级,浅网脆、深网险
  • 39:107-113 vocab 8000=粒度折中(小词表序列长省内存/大词表序列短 embedding 贵)
  • 39:129-133 hidden_size=相机分辨率(256);39:147 intermediate=草稿纸,本书取=hidden 是轻量选择(常见 2-4 倍)
  • 39:161-169 head_dim 每只眼的粒度;heads 多视角;39:195-197 kv_heads 少些没关系("效率来自知道在哪省")
  • 39:211-213 滑窗=人读书只回看最近几段;39:225-227 ctx 4096≈几页;39:235 KV cache 随长度线性涨
  • 39:251-255 rope_theta:小=显微镜(局部清晰)大=望远镜(远程模糊);39:259-261 scaling=把位置地图拉远;39:265-267 ntk_alpha=琴弦张力;39:269-271 ntk_beta=校正介入快慢;39:279-281 swiglu_limit=边界
  • 39:335-351 RMSNorm=LayerNorm 去掉减均值;pRMSNorm 只算前 6.25%;39:357 训练提速 7-64%;39:363 LLaMA/GPT-J 采用;39:393 BLEU 26.8-27.7 持平+7-9% 提速
  • 39:419-425 代码:var=x.pow(2).mean(-1); x*rsqrt(var+eps)*scale;39:599 rsqrt 是性能优化

ch05(40)

  • 40:17 RoFormer 2021(Su et al);40:23 旋转变换不改模长;40:25 把维度两两当 2D 坐标按位置转
  • 40:31 排列不变性、"the dog bites the man";40:41 RNN 天然有序但不可并行;40:57 正弦编码外推差;40:75 学习式(GPT-2/3)参数多外推差;40:97 Transformer-XL 2019;40:111 T5 桶化相对偏置、推理不能缓存
  • 40:127-145 RoPE:绝对位置进旋转、注意力分数只依赖相对距离;128k(LLaMA-3);保模长;可缓存;远距衰减
  • 40:209-231 2D 推导:旋转矩阵性质→分数只含 (m−n);40:243-249 高维=块对角、低维粗高维细;40:253 cos 随距离振荡衰减;40:263 预计算 cos/sin
  • 40:313-327 收敛快 20-30%、perplexity 3.5 vs 4.0(40:427);40:373-381 LLaMA/Mistral/Mixtral/PaLM/Gemma/CodeGen 采用
  • 40:445-455 _apply_rotary_emb:x 切两半→(x1·cos−x2·sin, x2·cos+x1·sin) 拼回;dtype 安全
  • 40:605-643 频率表:base^(arange(0,d,2)/d);scaling_factor>1 时:low/high 由 ntk_beta/ntk_alpha 定,clamp 防越界, ramp 平滑混合外推(1/freq)与插值(1/(s·freq));concentration=0.1·ln(s)+1 缩 cos/sin 稳数值
  • 40:959-975 NTK 出处 2018 Jacot;"高频旋转在超长位置上振荡过快"是外推痛点
  • 40:773 原书把 NTK 写成 "Neuro Tangent Kernel"(笔误,应为 Neural);40:1063 summary 把 RoFormer 误写为 "Reformer"
  • 40:1017-1059 YaRN=NTK+PI 的精细化,128k+

ch06(41)

  • 41:17 SDPA=2017;41:25 Bahdanau 2014 加性注意力(逐对算小网络,贵);41:27 点积+sqrt 更省
  • 41:33 数据库查询类比;41:35 "river bank" 消歧;41:37 软注意力可微、端到端
  • 41:57-85 因果掩码(三角);41:71 用 −inf 实现;41:73-81 tril 代码;41:85 掩码错→perplexity 涨 20-30%
  • 41:89-113 padding 掩码(BERT 批处理);41:117-133 图/树/时窗/跨模态掩码;41:139-161 稀疏:滑窗 k=512/n=10000 省 ~95%、Longformer、BigBird 90-95% 性能+80% 省内存
  • 41:215-229 adaptive span 学每头窗口;41:197-211 分层注意力(Swin 87.3% ImageNet)
  • 41:231-283 掩码的代价:设计难、过度掩码丢远信息(F1 掉 5-10%)、开销、可解释性变差
  • 41:309-333 sdpa(Q,K,V,S,sm_scale,sliding_window);Q 5 维 [B,T,kv_heads,q_per_kv,D];S=[num_heads] sink
  • 41:489 sink=虚拟 key,吸收多余概率质量;41:597-609 把 S 拼进分数最后一列→softmax→[..., :-1] 切掉 (列去掉后剩余权重和 <1 是故意的)
  • 41:539-543 einsum "bthd,bshd->bhts";除 sqrt(D) 防 softmax 过尖
  • 41:563-591 因果掩码+滑窗掩码取 max(更严者胜);delta=query−key,超过窗口→−inf
  • 41:621-625 O(T²) vs O(T·window);T=4、window=2 时 t=3 只看 t=1,2,3;FlashAttention 把掩码融进核
  • 41:29 "GPT-4 and PaLM boasting trillions of parameters"(传闻口径,要点破)

ch07(42)

  • 42:113 attention sink(Xiao et al 2023):模型过度把注意力砸在开头 token 上
  • 42:271-283 GQA(LLaMA 2)/MQA(GPT-3.5 Turbo 一个 KV 头)/量化 MHA
  • 42:319-341 GQA 每组 query 共享一套 KV,参数从 N_h 降到 N_kv;SWA 只看窗口;sink tokens 加偏置吸收多余注意力
  • 42:361-437 代码关键:num_heads%num_kv_heads 必须整除;head_dim 必须偶数(RoPE 配对); sliding_window 只在偶数层生效(layer_idx%2==0),奇数层全局——Mistral 式交替(42:383、42:549); qkv_proj 一个 Linear 融合投影(H→head_dim·(num_heads+2·num_kv_heads)); sink_logits=可学习参数,初始化全零(42:433);sm_scale=head_dim**-0.5
  • 42:439-485 forward:residual→RMSNorm→qkv→切片→reshape GQA→RoPE(q,k)→sdpa→out_proj→残差相加
  • 42:525 32 头/8 KV 头→KV cache 缩 4 倍;42:635-639 sink 让流式场景旧 token 可驱逐而上下文稳定
  • 42:805 交替设计=局部(偶层)+全局(奇层),可到 1M+ token;42:815 FlashAttention 2-3x

ch08(43-49)

  • 44:3 MoE=专家子模型+门控;44:5 Jacobs 1990s;Switch Transformer、Grok 复兴
  • 45:9 专家各管一摊(句法/语义/领域);45:13 门控=轻量线性层出概率分布;45:31 稀疏激活:每 token 只选 1-2/N 个;top-k
  • 45:37-53 变体:soft/hard/top-k/hierarchical(Switch 用 top-k)
  • 45:101-105 负载均衡损失(防止门控偏心几个专家);45:121-135 挑战:失衡/k 选择/资源/过拟合
  • 46:3-9 SwiGLU=Swish 门替掉 GLU 的 sigmoid 门;Shazeer 2020《GLU Variants Improve Transformer》;PaLM 采用
  • 46:17 Swish 2017,治 dying ReLU;46:19 GLU=Dauphin 2017;46:43 Swish=x·sigmoid(βx)
  • 46:109 参数账:SwiGLU FFN 三个矩阵(2I 上投+I 下投?书里口径是 dual projections 更贵),换 perplexity; 46:195 GLUE 1-2% 提升
  • 47:3 Grok/Mixtral/Switch 的共同配方;47:119 两级门控:全局 MoE 选专家、局部 SwiGLU 调特征;47:127 Mixtral 8x7B 在 MMLU 上胜 LLaMA 70B
  • 47:227-397 MLPBlock 代码:gate=Linear(H→E);mlp1 [E, 2I, H] (输出切两半);sigmoid(1.702x) 是 swish 的快速近似; clamp 到 swiglu_limit 保 AMP 稳;world_size 张量并行 all_reduce 求和;topk 权重 softmax 后加权汇总各专家输出
  • 48:21 I_local=I//world_size 分片;48:103 Kaiming 初始化
  • 49:14 summary:1958 Rosenblatt 感知机→80 年代反向传播复兴;万能逼近定理

ch09(50-67)

  • 50:3 拼图比喻;50:21 早期 6-12 层→现代数百层;50:25 "The cat sat on the mat" 逐层理解
  • 50:41-49 forward 骨架:attention(横向,token 间)→MLP(纵向,token 内)
  • 51:QKV 无偏置投影;52:RoPE 几何(复数乘法);53:SDPA 方差稳定推导;54:GELU tanh 近似(x+0.044715x³)
  • 55:SwiGLU 三个权重矩阵、参数贵 50%,用 perplexity 0.5-1.0 点改善换
  • 56:block 内无终端归一化(交给下一块/顶层);pre-norm 在深网更稳
  • 57:embedding 权重绑定可省参数
  • 58:TransformerBlock 代码=attn(x)→mlp(x) 两行;Transformer 类=embedding→layers→norm→output_proj;from_checkpoint
  • 59:41-53 [B,T,H] 三维各是什么;59:55-63 注意:简化版把残差/归一化藏进了 AttentionBlock/MLPBlock 内部
  • 60:embedding=查表(50000×768),token 1523→第 1523 行;ModuleList 注册参数; output_proj bias=False 的三个理由;RoPE 在注意力内部做、不在输入端加
  • 61:from_checkpoint:config.json+model.pt 分开存;strict 两档校验;eval() 关 dropout
  • 62:五个现代实践:RMSNorm/无 bias/RoPE/config 驱动/设备感知
  • 63:50-100x 快于 LSTM;GPT-3 175B/96 层/300B token;LoRA 只训低秩增量;冻结 BERT 保 85-90% 微调性能
  • 64:头分工(位置头/句法头/语义头/分隔符头);归纳电路;特征叠加
  • 65:O(n²) 内存墙(24GB 消费卡);GPT-3 3.14e23 FLOPs、$4.6M、碳≈123 辆车一年; 数据饥渴:GPT-3 300B/Chinchilla 1.4T/Llama-2 2T token vs 儿童 10 岁 1 亿词——差 4 个数量级
  • 66:未来:早退/混合深度、外挂记忆、多模态、硬件协同(Cerebras 85 万核)、液态网络、KAN
  • 67:summary

ch10(68-83)

  • 69:数据工程全景:来源(网页/书/论文/代码/对话)→清洗→去重(MD5/MinHash/LSH/后缀数组)→配比→评测集防污染;质量>数量
  • 70:训练语料=Edith Wharton 短篇开头(~4200 词):"I HAD always thought Jack Gisburn rather a cheap genius…"(70:7 起); 七阶段流水线分析;文学小说占训练语料 1-5%(70 章 balance 段,71:3 附近)
  • 72:规模参照:层 20-100+、宽 2048-12288、头 16-128、上下文 2k-128k+;前沿训练 10,000-100,000 petaflop-天、数百万美元
  • 73:训练代码。VOCAB_SIZE=2000、BATCH_SIZE=4、BLOCK_SIZE=64、EPOCHS=20、LR=3e-4; TextDataset:滑窗 block_size+1,x=chunk[:-1], y=chunk[1:] (同序列错一位=下一词预测); 微型 config:2 层/hidden 128/intermediate 256/head_dim 32/4 头/2 KV 头/2 专家各 1; 权重绑定:output_proj.weight = embedding.weight;AdamW betas(0.9,0.95);预热 6%+余弦退火; AMP+GradScaler;梯度裁剪 1.0; ppl=exp(loss)
  • 73:训练日志:epoch1 loss 24.22/ppl 3.29e10 → epoch5 1.09/2.98 → epoch20 0.1183/1.13
  • 73 末:模型学到什么(句法/语义/上下文推理/文体/事实知识)
  • 74:TokenGenerator:load→generate 流式 yield;采样=typical+top-k+top-p 叠加(三张掩码取交集,全空则退回 top-k,再退回原始概率); temperature 0.6;repetition_penalty 2.4、frequency_penalty 0.6、no_repeat_ngram、循环检测、防复制索引
  • 75:run_prompt:anti-copy 索引=把训练文本所有 2..12 元组(前缀→后继)编成索引,生成时禁掉"照抄原文的下一个 token"; _detect_variable_period_loop 检测周期 8..64 的复读;temperature 0.3、top_p 0.85、repetition_penalty 3.4、frequency_penalty 2.5(故意开猛); prompt 模板 "### Instruction:\n…\n\n### Response:\n"
  • 75:189-201 输出实录:"who is rick"→week 前缀+整段复读小说开头→"suchnot to of ak"→再复读→"alitmohad to here-clI've againRivierTjealpectght swet" 崩坏
  • 76:防复制洞察:生成出 11 个连续 token 与训练文本一致,就禁第 12 个
  • 77:三阶段解读:①吸引子盆地(分布外提示被拉回最近的已学分布)②护栏只能改道不能造知识③惩罚把采样逼进低概率尾部→崩坏; 生产系统惩罚通常 1.0-1.5
  • 78:规模四原理:10 万参数 vs 生产模型;单篇 4200 词 vs 万亿 token;20 轮几分钟 vs 数月数千卡; 只做预训练 vs SFT+RLHF("所以它不答 who is rick,只是续写")
  • 79-80:演示的价值;五条教训(规模配任务/推理约束有上限/数据决定能力/超参要适度/多阶段是必需)
  • 81:TinyStories 250M 参照实现(github.com/didogrigorov/LLM-story;nanostorychat.com):16 层/1024 维/FFN 4096/GQA 8 KV 头/5 万词表
  • 82:为什么不放进书:$500-$10,000 云成本;H100/A100 $2-4/卡时;比书中例子贵约 10 万倍算力
  • 83:达成了什么:完整流水线+现代架构+生产技巧+复杂推理防护——只是小

ch11(84-95)

  • 85:四阶段:预训练→中训→SFT→对齐;科学与手艺
  • 86:预训练:数据多样性;下词预测=免费无限监督;lr 1e-4..6e-4;Chinchilla:每参数约 20 token;1-2 万亿 token
  • 87:中训=继续预训练/领域适配;CodeLlama、Minerva、长上下文模型为例; 防灾难性遗忘四招(数据混入/replay/弹性权重固化/保守学习率);lr 1e-5..1e-4;token 量级数十亿..千亿
  • 88:SFT:指令-回答对;response-only loss(只对回答算损失)更常用;lr 1e-5..5e-6、1-3 轮; 质量>数量:1 万条好样本胜 100 万条差样本;多轮对话;SFT 后仍有局限→引出对齐
  • 89:RLHF 三阶段(SFT→奖励模型→PPO);奖励模型 loss=−log σ(r_pref−r_rej); KL 罚:Final=Reward−β·KL(新策略‖原策略)防 reward hacking 与遗忘; reward hacking 表现(变长/套话/钻空子);ChatGPT/Claude/Gemini 都用
  • 90:DPO(2023):跳过奖励模型,直接用偏好对优化,loss 里 π_ref 锚定;CAI(Anthropic):宪法→自我批判改写→RLAIF; 宪法条款示例;迭代 RLHF;混合流水线
  • 91:后训练技术:上下文蒸馏(把系统提示训进权重)、自我批判、红队+对抗训练、多目标权衡(有用 vs 安全)
  • 92:评测:预训练看 perplexity/loss;SFT 看 ROUGE/BLEU/pass@k;对齐看偏好一致+安全; 基准:MMLU(57 科)/HumanEval/GSM8K/TruthfulQA/BBQ/ToxiGen;基准污染与饱和;基准≠真实使用
  • 93:数据为王;阶段成本梯度(预训练最贵);四个坑(过拟合/遗忘/reward hacking/数据偏);红线清单
  • 94:未来:多模态/长上下文/持续学习/MoE/自监督对齐/民主化/理论
  • 95:CUDA:CPU 8-64 核 vs H100 16000+ CUDA 核;kernel=global 函数;线程→块→网格; 1024×1024 矩阵乘=1,048,576 线程各算一个元素;共享内存+tiling(每元素只从全局内存读一次); 训练循环的核视角(前向 GEMM→激活→归一化→loss→反传梯度→更新);融合是最大收益;坑:竞态/bank conflict/分支发散/occupancy
  • 95 末:术语表(autoregressive/base model/catastrophic forgetting/CAI/DPO/KL/perplexity/Reward Model/Scaling Laws/SFT…)

切分决定(13 章)与理由

按推理链不按原书章:原书 ch6+ch7 都是注意力(机制→总装),拆成两章因为新词密度都顶格; 原书 ch10 有 15 万字符(数据+训练+推理+演示),按「备料与训练」「推理与大时刻」拆两章; ch11 的 CUDA 是硬件链,与训练流程链独立,单独一章。