Skip to content

实战概览

欢迎来到全书高潮。接下来 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/                 # 训练产出的 checkpoint

4. 数据选择:两条路都给你

选择优点说明
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