Skip to content

Commit 8db300e

Browse files
sanbuphyclaude
andcommitted
Deep polish section headings to match notebook 02's clean D2L style
- Shorten 100+ verbose H2/H3 headings: remove "— subtitle", questions, filler words - Standardize all 小结 naming: "XX 支线小结" → "小结" (14 instances) - Strip trailing ? from section headings - Apply D2L noun-phrase style: state the topic, not the punchline Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent af8b5f8 commit 8db300e

19 files changed

Lines changed: 130 additions & 130 deletions

notebooks/part1-foundation/02-bpe-tokenizer.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1126,7 +1126,7 @@
11261126
"id": "10a6ba2f",
11271127
"metadata": {},
11281128
"source": [
1129-
"### 趣味问题:为什么模型有时会觉得 `1.11` 比 `1.9` 大\n",
1129+
"### 趣味问题:为什么模型有时会觉得 `1.11` 比 `1.9` 大\n",
11301130
"\n",
11311131
"先别急着看答案,自己先猜一下:\n",
11321132
"\n",

notebooks/part2-training/06-gpt2-to-modern-models.ipynb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
"id": "cell-2",
6767
"metadata": {},
6868
"source": [
69-
"## 0. 先回顾:Part 4 的 Block 长什么样?在这里动手改\n",
69+
"## 0. 回顾 Transformer Block\n",
7070
"\n",
7171
"先把你已经熟悉的 Part 4 Block 贴出来,我们就在它上面一个一个改。"
7272
]
@@ -1021,7 +1021,7 @@
10211021
"cell_type": "markdown",
10221022
"id": "cell-18",
10231023
"metadata": {},
1024-
"source": "---\n\n## 5. 拼起来!现代 LLaMA-style Block\n\n四个改进全部到位,把它们一次组装:\n\n```\nLLaMA Block = Pre-Norm (RMSNorm) + RoPE Attention + Pre-Norm (RMSNorm) + SwiGLU FFN\n\n x\n\n ├─→ RMSNorm → RoPE Attention ─→ + ← 残差(不经过 Norm!)\n │ │\n ├────────────────────────────────┘\n\n ├─→ RMSNorm → SwiGLU FFN ─→ + ← 残差(不经过 Norm!)\n │ │\n └─────────────────────────────┘\n\n 输出\n```"
1024+
"source": "---\n\n## 5. 现代 LLaMA-style Block\n\n四个改进全部到位,把它们一次组装:\n\n```\nLLaMA Block = Pre-Norm (RMSNorm) + RoPE Attention + Pre-Norm (RMSNorm) + SwiGLU FFN\n\n x\n\n ├─→ RMSNorm → RoPE Attention ─→ + ← 残差(不经过 Norm!)\n │ │\n ├────────────────────────────────┘\n\n ├─→ RMSNorm → SwiGLU FFN ─→ + ← 残差(不经过 Norm!)\n │ │\n └─────────────────────────────┘\n\n 输出\n```"
10251025
},
10261026
{
10271027
"cell_type": "code",
@@ -1109,12 +1109,12 @@
11091109
"cell_type": "markdown",
11101110
"id": "cell-21",
11111111
"metadata": {},
1112-
"source": "## 从 GPT-2 到现代模型小结\n\n确认你已经搞懂了这些(按顺序检查):\n\n1. ✅ LayerNorm = (x - μ) / σ × γ + β,算两个统计量\n2. ✅ RMSNorm = x / RMS(x) × γ,只算一个统计量——去掉了去均值\n3. ✅ RMSNorm 省的计算:不用算 μ,不用算 (x-μ)²(直接用 x²)\n4. ✅ 正弦编码加在输入上,RoPE 旋转 Q 和 K——位置信息进入 Attention 的方式不同\n5. ✅ RoPE 的核心性质:Q_i·K_j 只依赖相对位置 (j−i),Attention 天然感知距离\n6. ✅ RoPE 实现:维度两两配对做 2D 旋转,低维高频、高维低频\n7. ✅ ReLU 的问题:负数直接杀 → 梯度断掉,神经元可能死亡\n8. ✅ SwiGLU = 信息通道 (W_up) × 门控通道 (Swish(W_gate))→ 选择性通过\n9. ✅ Swish 平滑且负数区有非零梯度 → 不会「杀死」神经元\n10. ✅ Post-Norm = 子层+残差→Norm,残差路径经过 Norm\n11. ✅ Pre-Norm = Norm→子层→+残差,残差路径绕过 Norm\n12. ✅ Pre-Norm 好在哪:梯度高速公路无收费站 → 深层也能训\n13. ✅ LLaMA Block = Pre-Norm + RMSNorm + RoPE + SwiGLU(现代 LLM 标准配方)\n14. ✅ GQA = 多个 Q 头共享一组 KV 头,KV Cache 大幅缩小\n15. ✅ MHA(32 KV 头)→ GQA(4 KV 头,省 87.5%)→ MQA(1 KV 头,省 97%)\n16. ✅ GQA 实现关键:K/V 投影更小,expand 到和 Q 一样再做 attention\n17. ✅ QK-Norm = 算 attention 前对 Q、K 各自 RMSNorm → 防止 softmax 退化\n18. ✅ QK-Norm 只用两行代码,LLaMA 3 / Qwen 3 标配\n19. ✅ MLA = KV 低秩压缩到 latent 空间,先压到极小的 c_KV,推理时再解压\n20. ✅ MLA 的 KV Cache 比 MHA 降一个数量级,DeepSeek-V2/V3 和 Kimi K2 的核心设计\n\n**一句话总结**:现代 Decoder-only 模型不是推翻 GPT-2,而是在同一条主干上升级关键零件——Pre-Norm 解决「能不能训」(稳定性)、RoPE 解决「位置怎么编码」(相对距离)、SwiGLU 解决「训得好不好」(效果)、RMSNorm 解决「训得快不快」(效率)、GQA 解决「推理贵不贵」(KV Cache)、QK-Norm 解决「训得稳不稳」(退化)、MLA 解决「Cache 还能不能更小」(终极压缩)。"
1112+
"source": "## 小结\n\n确认你已经搞懂了这些(按顺序检查):\n\n1. ✅ LayerNorm = (x - μ) / σ × γ + β,算两个统计量\n2. ✅ RMSNorm = x / RMS(x) × γ,只算一个统计量——去掉了去均值\n3. ✅ RMSNorm 省的计算:不用算 μ,不用算 (x-μ)²(直接用 x²)\n4. ✅ 正弦编码加在输入上,RoPE 旋转 Q 和 K——位置信息进入 Attention 的方式不同\n5. ✅ RoPE 的核心性质:Q_i·K_j 只依赖相对位置 (j−i),Attention 天然感知距离\n6. ✅ RoPE 实现:维度两两配对做 2D 旋转,低维高频、高维低频\n7. ✅ ReLU 的问题:负数直接杀 → 梯度断掉,神经元可能死亡\n8. ✅ SwiGLU = 信息通道 (W_up) × 门控通道 (Swish(W_gate))→ 选择性通过\n9. ✅ Swish 平滑且负数区有非零梯度 → 不会「杀死」神经元\n10. ✅ Post-Norm = 子层+残差→Norm,残差路径经过 Norm\n11. ✅ Pre-Norm = Norm→子层→+残差,残差路径绕过 Norm\n12. ✅ Pre-Norm 好在哪:梯度高速公路无收费站 → 深层也能训\n13. ✅ LLaMA Block = Pre-Norm + RMSNorm + RoPE + SwiGLU(现代 LLM 标准配方)\n14. ✅ GQA = 多个 Q 头共享一组 KV 头,KV Cache 大幅缩小\n15. ✅ MHA(32 KV 头)→ GQA(4 KV 头,省 87.5%)→ MQA(1 KV 头,省 97%)\n16. ✅ GQA 实现关键:K/V 投影更小,expand 到和 Q 一样再做 attention\n17. ✅ QK-Norm = 算 attention 前对 Q、K 各自 RMSNorm → 防止 softmax 退化\n18. ✅ QK-Norm 只用两行代码,LLaMA 3 / Qwen 3 标配\n19. ✅ MLA = KV 低秩压缩到 latent 空间,先压到极小的 c_KV,推理时再解压\n20. ✅ MLA 的 KV Cache 比 MHA 降一个数量级,DeepSeek-V2/V3 和 Kimi K2 的核心设计\n\n**一句话总结**:现代 Decoder-only 模型不是推翻 GPT-2,而是在同一条主干上升级关键零件——Pre-Norm 解决「能不能训」(稳定性)、RoPE 解决「位置怎么编码」(相对距离)、SwiGLU 解决「训得好不好」(效果)、RMSNorm 解决「训得快不快」(效率)、GQA 解决「推理贵不贵」(KV Cache)、QK-Norm 解决「训得稳不稳」(退化)、MLA 解决「Cache 还能不能更小」(终极压缩)。"
11131113
},
11141114
{
11151115
"cell_type": "markdown",
11161116
"id": "574be5b9",
1117-
"source": "## 7. 改进五:MHA → GQA — Attention 的 KV 太贵了\n\n前面四个改进解决了「稳定性」「效果」「效率」「位置编码」。还有一个工程问题没解决:",
1117+
"source": "## 7. 改进五:MHA → GQA\n\n前面四个改进解决了「稳定性」「效果」「效率」「位置编码」。还有一个工程问题没解决:",
11181118
"metadata": {}
11191119
},
11201120
{
@@ -1142,7 +1142,7 @@
11421142
{
11431143
"cell_type": "markdown",
11441144
"id": "eef56801",
1145-
"source": "## 8. 改进六:QK-Norm — 防止 Attention 退化",
1145+
"source": "## 8. 改进六:QK-Norm",
11461146
"metadata": {}
11471147
},
11481148
{
@@ -1164,7 +1164,7 @@
11641164
{
11651165
"cell_type": "markdown",
11661166
"id": "16c11d9b",
1167-
"source": "## 9. 改进七:MHA → GQA → MLA — KV Cache 的终极压缩",
1167+
"source": "## 9. 改进七:MHA → GQA → MLA",
11681168
"metadata": {}
11691169
},
11701170
{

notebooks/part2-training/07-moe.ipynb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
"id": "ef004d35",
5252
"metadata": {},
5353
"source": [
54-
"## 1. 回顾:普通 Transformer 的 FFN 层\n",
54+
"## 1. 普通 Transformer 的 FFN 层\n",
5555
"\n",
5656
"Dense 模型和 MoE 模型的根本区别在于参数和计算量的关系:\n",
5757
"\n",
@@ -98,7 +98,7 @@
9898
"id": "8b1e9392",
9999
"metadata": {},
100100
"source": [
101-
"## 2. MoE 的核心思想:多个专家 + 路由器\n",
101+
"## 2. MoE 的核心思想\n",
102102
"\n",
103103
"既然一个 FFN 处理所有 token 负担太重,那换一个思路:把一个大 FFN 拆成 N 个小的专家 FFN,让每个 token 只找其中少数几个专家来处理。\n",
104104
"\n",
@@ -1020,7 +1020,7 @@
10201020
"id": "moe-training-best-practices",
10211021
"metadata": {},
10221022
"source": [
1023-
"### 4.1 MoE 训练最佳实践:先监控路由,再调参数\n",
1023+
"### 4.1 MoE 训练最佳实践\n",
10241024
"\n",
10251025
"训练 MoE 时,最容易犯的错误是只盯着 `loss`。loss 下降不代表 MoE 真的训好了:router 可能只用少数专家,模型表面在学习,实际上大部分专家没有收到足够梯度。\n",
10261026
"\n",
@@ -1235,7 +1235,7 @@
12351235
"source": [
12361236
"---\n",
12371237
"\n",
1238-
"## MoE 支线小结\n",
1238+
"## 小结\n",
12391239
"\n",
12401240
"1. ✅ Dense FFN 所有 token 共享一套参数,参数量 = 计算量\n",
12411241
"2. ✅ MoE 把一个大 FFN 拆成 N 个专家 FFN + 一个路由器\n",

0 commit comments

Comments
 (0)