从零开始用纯Python实现GPT | AI生成和翻译
问题: 请解释 Andrej Karpathy 提供的 Python 脚本,该脚本从零开始实现 GPT 模型,且不依赖任何外部库。
回答: 这个脚本是一部“教学杰作”,将大型语言模型(LLM)剥离到最核心的组件。它仅使用 Python 标准库实现了生成式预训练变换器(GPT),没有 PyTorch、NumPy 或 TensorFlow。
以下是实现该功能的核心组件分解:
1. “微型自动微分”引擎(class Value)
任何深度学习模型的核心都是反向传播。
- 逻辑: 由于脚本没有使用 PyTorch,它定义了一个
Value类,存储一个标量(单个数值)及其导数(grad)。 - 链式法则: 每个数学运算(
+、*、exp、log)都被重载,以构建“计算图”。当调用loss.backward()时,代码会反向遍历该图,计算每个参数对误差的贡献。
2. GPT 架构
该模型遵循 GPT-2 设计,但简化了部分组件(例如使用 RMSNorm 代替 LayerNorm,使用 ReLU 代替 GeLU)。
- 嵌入层: 使用两个查找表:
wte(Token 嵌入)表示字符含义,wpe(位置嵌入)表示字符在字符串中的位置。 - 多头注意力机制: 模型的“大脑”,允许当前字符“回顾”前面的字符以确定上下文。它为每一步计算 Query (Q)、Key (K) 和 Value (V) 向量。
- 前馈神经网络(MLP): 一个简单的两层神经网络,处理注意力头收集的信息。
3. 训练与优化
脚本在名字数据集(names.txt)上训练模型。
- 目标: 模型执行下一个 Token 预测。例如给定“A-N-D-R”,它会尝试预测“E”。
- 损失函数: 使用交叉熵损失(通过
log和softmax计算),预测结果与实际字符相差越远,惩罚越严重。 - Adam 优化器: 手动实现 Adam 优化算法,更新权重,包括动量和学习率衰减等特性。
4. 推理(“胡言乱语”)
训练完成后,模型生成新文本。它从特殊的 BOS(序列起始) Token 开始,请求模型给出下一个字符的概率分布,然后根据温度设置从该分布中“采样”,生成原始列表中不存在的名字。
总结表:硬件 vs. 软件
| 特性 | 本脚本实现 | 行业标准(如 GPT-4) |
|---|---|---|
| 数学运算 | 纯 Python 循环(慢) | GPU 内核 / CUDA(快) |
| 数据 | 单个字符 | 子词“Token” |
| 规模 | ~7,000 个参数 | 万亿级参数 |
| 内存 | Python 列表 | 张量(高度压缩) |
你是否希望我详细解释注意力机制在本代码中如何计算字符之间的关系?