如何学习 nanoGPT?
# 如何学习 nanoGPT---## 一、先跑通最小例子1天bashcd D:/0.5 LLM/nanoGPT# 1. 准备莎士比亚数据字符级超简单python data/shakespeare_char/prepare.py# 2. 训练小模型python train.py config/train_shakespeare_char.py训练完后运行采样bashpython sample.py config/train_shakespeare_char.py**你会看到模型开始写诗了。**---## 二、逐文件精读按顺序### 第1步data/shakespeare_char/prepare.py68行**学什么**- 文字如何变成整数序列- Train/Val 分割- 保存到 .bin 文件**关键代码**python# 字符到整数的映射stoi { ch:i for i,ch in enumerate(chars) }itos { i:ch for i,ch in enumerate(chars) }def encode(s):return [stoi[c] for c in s] # Hello → [7, 4, 13, 11, 14]def decode(l):return .join([itos[i] for i in l]) # 反过来---### 第2步model.py核心330行按顺序读这几个类| 类名 | 行数 | 作用 ||------|------|------|| LayerNorm | 18-27 | 层归一化 || CausalSelfAttention | 29-76 | **注意力机制**重点 || MLP | 78-92 | 前馈网络 || Block | 94-106 | 一个 Transformer 层 || GPTConfig | 108-116 | 配置类 || GPT | 118-330 | 完整模型 |**重点关注 CausalSelfAttention.forward()52-76行**python# 1. 投影得到 Q、K、Vq, k, v self.c_attn(x).split(self.n_embd, dim2)# 2. 多头重塑k k.view(B, T, self.n_head, C // self.n_head).transpose(1, 2)q q.view(B, T, self.n_head, C // self.n_head).transpose(1, 2)v v.view(B, T, self.n_head, C // self.n_head).transpose(1, 2)# 3. 计算注意力att (q k.transpose(-2, -1)) * (1.0 / math.sqrt(k.size(-1)))att F.softmax(att, dim-1)y att v# 4. 合并头 输出投影y y.transpose(1, 2).contiguous().view(B, T, C)y self.c_proj(y)**Block.forward()103-106行— 残差连接的优雅写法**pythondef forward(self, x):x x self.attn(self.ln_1(x)) # 注意力 残差x x self.mlp(self.ln_2(x)) # FFN 残差return x---### 第3步train.py336行重点看三个部分**1. 数据加载约 80-120行**pythondef get_batch(split):data train_data if split train else val_dataix torch.randint(len(data) - block_size, (batch_size,))x torch.stack([data[i:iblock_size] for i in ix])y torch.stack([data[i1:iblock_size1] for i in ix])return x, y- 随机取 batch_size 个起始位置- 每个样本是 block_size 个连续 token- 目标是预测下一个 tokeny x 右移一位**2. 前向传播 损失约 130-160行**pythonwith ctx:logits, loss model(batch)loss loss / gradient_accumulation_steps**3. 反向传播 优化约 170-200行**pythonoptimizer.zero_grad()loss.backward()if grad_clip 0.0:torch.nn.utils.clip_grad_norm_(model.parameters(), grad_clip)optimizer.step()---### 第4步sample.py89行**理解采样策略**python# temperature 控制随机性# 低温度 → 保守、重复# 高温度 → 大胆、多样# top_k 采样# 只从概率最高的 k 个 token 中采样probs softmax(logits / temperature)top_k 200indices torch.topk(probs, top_k).indicesprobs zeros(...)probs[indices] topk_probsnext_token multinomial(probs, 1)---## 三、学习顺序建议Week 1: 跑通 Shakespeare 示例↓读懂 prepare.py数据准备↓读懂 model.py 的每个类↓Week 2: 读懂 train.py 的每个循环↓修改参数观察变化改层数、改 head 数↓Week 3: 尝试用自己的数据训练↓加入 FastAPI 接口---## 四、配套视频Andrej Karpathy 在 YouTube 上有完整讲解| 视频 | 内容 ||------|------|| [nanoGPT 课程](https://www.youtube.com/playlist?listPLBIRgXsQCqQWyAQMmURdQ2YwILsnBsWMc) | 9集逐行讲解代码 || [The spelled-out intro to LMs](https://www.youtube.com/watch?vkCc8FmdEbys) | 理论铺垫 |---## 五、核心文件说明| 文件 | 作用 | 行数 ||------|------|------|| model.py | GPT 架构定义Embedding Attention FFN | ~300 || train.py | 训练循环 损失计算 优化器 | ~300 || sample.py | 文本生成采样策略 | ~100 || prepare.py | 数据预处理字符级分词 | ~70 |---## 六、快速验证清单- [ ] 能跑通 python data/shakespeare_char/prepare.py- [ ] 能跑通 python train.py config/train_shakespeare_char.py- [ ] 能跑通 python sample.py config/train_shakespeare_char.py- [ ] 能解释 CausalSelfAttention 的前向过程- [ ] 能解释 Block 的残差连接结构- [ ] 能解释 get_batch 的数据采样逻辑- [ ] 能解释 temperature 和 top_k 的作用