作者: Sebastian Raschka (2025)
中文版: 401页, 7章 + 5附录
对应课程: course_A W1 (LLM全景) / course_D W1 (治理全景)
难度: ★★☆ (L2 基础)
> 这不是书评,而是把书的内容"吞噬"到我们的学习路径中。
> 每章提炼: 核心概念 → Python技术点 → 对应L4课程模块
Ch1 理解LLM ─→ Ch2 文本处理 ─→ Ch3 注意力机制 ─→ Ch4 构建GPT ─→ Ch5 预训练 ─→ Ch6/7 微调
(是什么) (怎么做数据) (核心算法) (造出来) (训练) (调优)
| 书籍章节 | 核心Python技能 | 对应L4模块 | 实战价值 |
|---------|---------------|-----------|---------|
| Ch2 文本处理 | 分词(BPE)、嵌入、滑动窗口 | M4.2 数据合规 | 理解训练数据的"原子单位" |
| Ch3 注意力 | 自注意力、多头注意力、因果掩码 | Reference 模型审计 | 审计模型"在看什么" |
| Ch4 GPT架构 | LayerNorm、GELU、残差连接 | Reference Agent安全 | 理解模型内部结构 |
| Ch5 预训练 | 损失函数、训练循环、权重保存 | M4.1 治理体系 | 训练数据溯源审计 |
| Ch6 分类微调 | 分类头、微调、垃圾检测 | M4.1 模型审计 | 微调模型的合规检查 |
| Ch7 指令微调 | 指令数据、RLHF、评估 | M4.1 算法备案 | 对齐训练的安全审查 |
| Appendix E LoRA | 低秩适应、参数高效微调 | Reference AI运维 | 高效微调的工程标准 |
| 概念 | 一句话 | 对应Python |
|------|--------|-----------|
| 预训练 + 微调范式 | 先在海量无标注数据上学语言规律,再在少量标注数据上适配任务 | 两个训练阶段,不同数据管道 |
| Transformer架构 | 只有解码器的GPT架构,自回归生成 | 因果注意力掩码 |
| Tokenization | 文本→数字ID的转换 | tiktoken / BPE算法 |
| Embedding层 | 每个token映射到高维向量 | nn.Embedding |
| 位置编码 | 告诉模型词的顺序 | 绝对位置编码 / RoPE |
L4映射: M4.1 治理体系需要理解"我们在治理什么"——这本书告诉你LLM到底是什么构成的。
核心Python代码模式:
# BPE 分词器 (tiktoken)
import tiktoken
tokenizer = tiktoken.get_encoding("gpt2")
ids = tokenizer.encode("Hello, world!") # [15496, 11, 995, 0]
text = tokenizer.decode(ids) # "Hello, world!"
滑动窗口采样
def create_dataloader(text, batch_size=4, max_length=256, stride=128):
# stride < max_length → 有重叠的滑动窗口
# 每个样本: input_ids[0:256], target_ids[1:257]
pass # 见原书 列表2.6
| 概念 | Python实现 | L4对应 |
|------|-----------|--------|
| BPE分词 | tiktoken / tokenizers | M4.2 数据最小化原则 |
| 词嵌入 | nn.Embedding(vocab_size, emb_dim) | Reference: 数据表征 |
| 位置编码 | 正弦/可学习位置嵌入 | Reference: 模型审计 |
学完你能做: 自己写一个tokenizer,理解训练数据的切分方式——这对数据合规审计至关重要。
从简单到复杂的4步实现:
1. 简化自注意力 — 每个token关注所有其他token (无参数)
2. 带权重的自注意力 — W_q, W_k, W_v 三个权重矩阵
3. 因果注意力 — 加上掩码,只关注前面的token (GPT生成的关键)
4. 多头注意力 — 并行多个注意力头,捕捉不同关系
class CausalAttention(nn.Module):
def __init__(self, d_in, d_out, context_length, dropout, qkv_bias=False):
super().__init__()
self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias)
self.W_key = nn.Linear(d_in, d_out, bias=qkv_bias)
self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias)
self.dropout = nn.Dropout(dropout)
# 因果掩码: 上三角矩阵
mask = torch.triu(torch.ones(context_length, context_length), diagonal=1)
self.register_buffer('mask', mask) # 不参与训练
def forward(self, x):
b, num_tokens, d_in = x.shape
keys = self.W_key(x)
queries = self.W_query(x)
values = self.W_value(x)
attn_scores = queries @ keys.transpose(1, 2) # 点积
attn_scores.masked_fill_(self.mask.bool()[:num_tokens, :num_tokens], -torch.inf) # 掩码
attn_weights = torch.softmax(attn_scores / keys.shape[-1]0.5, dim=-1) # 缩放
attn_weights = self.dropout(attn_weights)
context_vec = attn_weights @ values # 加权和
return context_vec
L4映射**: 审计时需要理解注意力机制——"模型在生成这句话时关注了训练数据中的哪些部分"
GPT模型的核心组件栈:
GPTModel
├── TokenEmbedding (nn.Embedding)
├── PositionalEmbedding (nn.Embedding)
├── TransformerBlock × n_layers
│ ├── MultiHeadAttention
│ ├── LayerNorm (RMSNorm变体)
│ ├── FeedForward (Linear → GELU → Linear)
│ └── Dropout + 残差连接
└── Output Layer (Linear, 映射回vocab_size)
关键参数 (我们的 Qwen3.5-9B vs GPT-2对比):
| 参数 | GPT-2 Small | GPT-3 175B | Qwen3.5-9B |
|------|-----------|-----------|-----------|
| 参数量 | 124M | 175B | 9B |
| 层数 | 12 | 96 | 约40 |
| 注意力头 | 12 | 96 | 32 |
| 嵌入维度 | 768 | 12288 | 4096 |
| 上下文长度 | 1024 | 2048 | 8192 |
L4映射: Reference 模型审计——知道模型结构后,能理解审计范围(每一层都可能有问题)
训练流程:
for epoch in range(num_epochs):
for batch in dataloader:
logits = model(batch['input_ids'])
loss = torch.nn.functional.cross_entropy(
logits.view(-1, logits.size(-1)),
batch['target_ids'].view(-1)
)
optimizer.zero_grad()
loss.backward()
optimizer.step()
关键概念:
L4映射: M4.2 训练数据合规——预训练数据的来源、版权、去重都是合规审查点
两种微调方式:
| 方式 | 目的 | 数据 | L4对应 |
|------|------|------|--------|
| 分类微调 (Ch6) | 情感分析/垃圾检测 | 标注分类数据 | M4.1 模型审计—输出分类审核 |
| 指令微调 (Ch7) | 让模型遵循指令 | 指令-回答对 + RLHF | M4.1 算法备案—对齐训练安全 |
LoRA (Appendix E) — 参数高效微调:
# LoRA: W' = W + A @ B, 其中A和B是低秩矩阵
训练时只更新A,B, 冻结W
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"])
model = get_peft_model(base_model, lora_config)
L4映射: 微调模型的合规要求不同于基座模型——需要额外的安全评估和审计日志
这本书的附录A是整个学习的"前置依赖":
| 附录内容 | 你需要会的Python | 在我们的notebook能找到 |
|---------|----------------|---------------------|
| A.2 张量 | NumPy基础 | 01_AI_Assistant_Basics |
| A.3 计算图 | 自动微分概念 | 02_Model_Building |
| A.5 神经网络 | nn.Module, nn.Linear | 02_Model_Building |
| A.6 数据加载器 | DataLoader, Dataset | 03_Data_Governance |
| A.7 训练循环 | backward(), step() | 05_Pretraining (待创建) |
> 建议: 如果PyTorch不熟,先看附录A再读Ch3-5。
| 书籍内容 | L4课程位置 | 实操notebook |
|---------|-----------|-------------|
| Ch1 LLM概述 | M4.1 Part 1 治理全景 | 00_Learning_Roadmap |
| Ch2 分词/嵌入 | M4.2 Part 3 训练数据合规 | 待创建: 04_Tokenization |
| Ch3 注意力机制 | Reference 模型审计 | 待创建: 05_Attention_Mechanism |
| Ch4 GPT架构 | Reference 模型审计 | 待创建: 06_GPT_Architecture |
| Ch5 预训练 | M4.2 数据溯源 | 待创建: 07_Pretraining |
| Ch6 分类微调 | M4.1 模型审计 | 待创建: 08_FineTuning |
| Ch7 指令微调 | M4.1 算法备案 | 02_Model_Building_API |
| Appx E LoRA | Reference AI运维 | 待创建: 09_LoRA |
> 下一步: 从Ch2开始,逐个创建配套notebook,把书中的Python代码跑在本地Qwen3.5-9B上。
> 先跑 01_AI_Assistant_Basics.ipynb 热手,然后决定从哪章切入。
# 验证: 检查本地环境是否满足这本书的需要
import sys, torch
print(f"Python: {sys.version}")
print(f"PyTorch: {torch.__version__}")
print(f"MPS available: {torch.backends.mps.is_available()}")
print(f"GPU: {torch.backends.mps.is_built()}")
print()
print("这本书需要: PyTorch + NumPy + tiktoken + tensorboard")
print("我们已经有的: ✓ PyTorch ✓ MPS ✓ httpx ✓ jupyter-ai")
print("需要安装: tiktoken, tensorboard (用 pip install)")