Appearance
实战概览
欢迎来到全书高潮。接下来 4 页,我们不调包、不
from_pretrained,而是用 PyTorch 从零写一个 GPT,喂它一篇文章,训练到它能「模仿文风」续写。走完这一趟,前面所有抽象概念都会变成你亲手搭起来的积木。
1. 我们要造什么
一个 字符级、Decoder-only 的小型 GPT(NanoGPT)。它能:
- 读入一篇纯文本(英文莎士比亚剧本 或 任意中文文章)。
- 学习「给定前文,下一个字符是什么」。
- 训练后,给个开头就能续写出风格相似的文本。
输入开头: "KING:\nOur army—"
NanoGPT 续写: "Our army is ready, and the soldiers do march\n"
"upon the field; ..." ← 训练几分钟后就像模像样它很小(约 1~5M 参数),CPU 也能训练,有 GPU 更快。麻雀虽小,五脏俱全:嵌入、位置、多头因果注意力、FFN、残差、LayerNorm、权重共享、采样生成,一个不缺。
2. 四步路线图
┌── 第1页 搭建NanoGPT ──┐ ┌── 第2页 训练与调参 ──┐
│ ① 准备数据(字符词表) │ │ 手写训练循环 │
│ ② 定义模型(前向) │──►│ ① 前向/损失/反向 │
│ 因果注意力+FFN+堆叠 │ │ ② 学习率调度/评估 │
└──────────────────────┘ │ ③ 保存 checkpoint │
└──────────┬───────────┘
▼
┌── 第4页 微调预训练模型 ──┐ ┌── 第3页 评估与文本生成 ──┐
│ 在 GPT-2/小模型上迁移 │◄──│ temperature/top-p 采样 │
│ 学习真实项目怎么做 │ │ 看 loss↓ 与样本文本进化 │
└──────────────────────┘ └────────────────────────┘3. 项目文件结构
建议按下面组织,跟着逐页填充即可:
nano-gpt/
├── data/
│ └── input.txt # 你的训练语料(整篇纯文本)
├── model.py # 第1页: NanoGPT 模型定义
├── prepare.py # 第1页: 数据预处理与字符词表
├── train.py # 第2页: 训练循环
├── sample.py # 第3页: 加载模型并生成文本
└── out/ # 训练产出的 checkpoint4. 数据选择:两条路都给你
| 选择 | 优点 | 说明 |
|---|---|---|
| tinyShakespeare(英文) | 效果立竿见影、社区标准 | 约 1MB 剧本,字符级,几分钟就能看出「像英语」 |
| 任意中文文章(诗词/小说/你的笔记) | 中文、亲切、可玩性强 | 字符级天然适配中文,把 input.txt 换掉即可 |
本教程以「换
data/input.txt就行」为原则,两种语料共用同一套代码。字符级词表天然绕开了分词器的复杂性,非常适合初次训练。
5. 会遇到的现象(提前剧透)
step 0: 随机乱码 "dofnmeoi@#..." loss≈4.x(高)
step 300: 有单词感 "the king and his..." loss 下降
step 1500: 断句合理 出现换行/标点/大写规律 loss 平台
step 4000: 文风模仿 像模像样的对白/诗句 loss 缓慢下降
→ 如果 loss 不降: 学习率/数据/bug 三板斧排查(第2页给清单)看到 loss 稳步下降、生成文本从乱码逐渐变成「像人话」,是整个实战最有成就感的时刻。
6. 心理预期与调试提示
- 别期待它「有知识」:NanoGPT 学的是统计规律与风格,不是事实。它会写出流畅的句子,也可能一本正经地胡说——这正是「大模型为何会幻觉」的迷你版体感。
- 跑不出效果先查三样:数据是否读对、因果掩码是否漏加、学习率是否过大。
- 想更快见效:先用小
n_layer=2、短训练跑通流程,再逐步放大。
下一步
开工!先搭骨架:数据预处理 + 模型定义 → 搭建NanoGPT。