从零构建大语言模型 —— 读完这篇你就懂了¶
Ch01.768 从零构建大语言模型 —— 读完这篇你就懂了¶
📊 Level ⭐⭐ | 8.2KB |
entities/build-llm-from-scratch-7-chapters-zion.md
从零构建大语言模型 —— 读完这篇你就懂了¶
→ 原文存档
摘要¶
这是一份以"从懵到会造"为目标的七章式 LLM 教程,走 Make LLM(《Build a Large Language Model (From Scratch)》)的经典路线:把整套 GPT 拆成三个可落地阶段——Stage 1 数据准备与注意力(第 2-3 章)、Stage 2 构建 GPT 架构与预训练(第 4-5 章)、Stage 3 分类与指令微调(第 6-7 章)。全文围绕"预测下一个词"这一核心,从分词、嵌入、注意力讲到 Transformer Block 组装、预训练再到两种微调,代码都能在普通笔记本上跑通,实现"从零造 LLM"。
核心要点¶
- 核心任务极度简单:LLM 的全部训练目标就是"预测下一个词",朴素至极的逻辑却涌现出翻译、写代码、对话等超纲能力,"像教孩子 1+1=2 他却学会了微积分"。
- 构建分两步走:先用海量无标注文本预训练出"基础模型"(GPT-3 预训练烧掉约 460 万美元云计算费),再用少量标注数据微调成领域专家;小模型在特定领域能干翻通用大模型,且更省钱、保隐私、可部署在手机上。
- GPT 是"只带解码器"的 Transformer:BERT 用编码器擅长分类,GPT 用解码器靠自回归逐词生成;GPT-3 有 96 层、1750 亿参数,训练数据 3000 亿 token。
- 三段关键实现:分词走 BPE(永不遇到 unknown token,GPT-2 词汇表 50,257);注意力是带 Q/K/V 三个可训练矩阵的缩放点积注意力;位置用可训练的位置嵌入。
- 因果注意力"不许开天眼":训练时在权重矩阵右上角打上三角掩码(softmax 前设 -inf),再加 Dropout 防过拟合,12 头并行各看 64 维。
- "从零造"的终点是双微调:分类微调冻结大部分参数加装分类头,垃圾邮件集测试准确率 95.67%;指令微调用 Alpaca 格式 1100 条数据,2 个 epoch 即可改写被动语态。
- 落地门槛极低:最大价值在于所有代码都跑得动——一台普通电脑 + Python + PyTorch 即可。
深度分析¶
教学法内核:把"神秘黑盒"拆成可验证的因果链条¶
教程最聪明处,是给每个抽象概念都找一个可感知的锚点。第 1 章以"预测下一个词"把庞大体系压成最小可理解单元,再用 GPT-3 的 460 万美元、3000 亿 token、9.5 万年阅读量建立"规模震撼"。第 2-3 章逐步回答"文字如何变数字""模型凭什么知道谁该看谁",每个阶段都有明确的"为什么"——RNN 传话变样所以要注意力,高维点积会爆炸所以要除以 √d_k。这种"先给问题、再给机制、最后给代码"的推进,正是 Make LLM 风格让人"读完就会造"的关键。
注意力与架构的工程细节:几个决定成败的小地方¶
第 3-4 章藏着几个决定成败的细节。其一,缩放点积注意力为何除以 √d_k——嵌入维度越高点积越大,softmax 过早饱和致梯度消失,除以缩放让注意力落在合理区间。其二,因果掩码时机讲究:必须在 softmax 之前把右上角设为 -inf,否则归一化仍会算出非零权重。其三,用 Pre-LayerNorm 而非 Post-LayerNorm,配合 Shortcut 残差连接修出"梯度高速公路"(无 shortcut 时第一层梯度比第五层小 25 倍),12 层才能稳叠。其四,分类微调只用最后一个 token 的输出——因因果掩码保证它能"看见"前面所有信息,这是把生成式架构复用为判别式分类器的精妙处。
从"能跑通"到"生产级":差距究竟在哪¶
教程诚实展示了自己的边界——第 5 章用小数据集训出的模型,验证 loss 停在第 2 个 epoch 后即停滞,而训练 loss 一路降到 0.39,明显过拟合,作者的办法只有一句"用更大的数据集"。这恰恰点出"从零构建"与"生产级 LLM"的真实差距:本教程验证的是机制的正确性(架构、损失、优化器、解码策略都通),生产级靠的是规模与数据工程——GPT-3 的 3000 亿 token、1750 亿参数、96 层,单张 V100 训 355 年。看清这点,读者才不会误以为"会跑通 1.6 亿参数的玩具"等于"会造 LLM"。
微调设计:用最小改动实现能力切换¶
第 6-7 章展示了一种工程哲学——"能力不是重写,而是换头"。分类微调只把输出层从 50,257 维换成 2 维,冻结大部分参数、只训输出层 + 最后一个 Transformer block + 最后 LayerNorm,5 个 epoch 在 M3 MacBook Air 上跑出 95.67% 测试准确率。指令微调更轻:Alpaca 格式组织 prompt,自定义 collate 把 padding token 对应位置设为 -100(PyTorch 交叉熵默认忽略 -100,不计算 padding 损失),A100 上 2 个 epoch 仅 52 秒。第 7 章还用 Llama 3 8B 当"裁判"打分(测试集 50.32 分)。这套"冻结-换头-轻训-大模型评估"流程,正是今天 LoRA、PEFT 等参数高效微调的前身,也是小团队落地 LLM 的主干路径。
实践启示¶
- 先跑通再追求大:用笔记本、几百万参数把"分词→注意力→Transformer→预训练→微调"整条链路跑通、看清每步 loss 与输出变化,比盲目堆算力重要——机制正确是规模化的前提。
- 过拟合是"小数据 + 大模型"的第一警讯:训练 loss 0.39 而验证 loss 停在 6.45 是最典型信号,实战中应盯训练/验证 loss 的剪刀差。
- 微调的"换头 + 冻结"范式可直接复用:加装轻量输出头、冻结大部分参数、用 -100 屏蔽 padding。
- 用大模型当评估器是廉价评测手段:缺乏人工标注时可用更强模型做自动化基准对比。
- 解码策略要组合使用:贪心安全但无聊、temperature 控随机性、top-k 控候选池——"先筛池、再调分布、最后采样"才能生成既多样又可控的文本。
- 保存模型要连优化器状态一起:若只存 model.state_dict(),AdamW 记住的动量历史会丢失——"断点续训"最常见的坑。
相关实体¶
- 7 阶段从零造 LLM 的 PyTorch 教程 — 同一课题的另一条实现路线
- 个人从零预训练 1B LLM 心路历程 — 教学版之外的真实预训练工程实践
- 从零训练 Steel-LLM 模型设计 — 模型架构选型层面的对照
- 从零训练 Steel-LLM 微调探索与评估 — 微调手段与评估的进阶探讨
- Karpathy LLM 全栈课程 — Andrej Karpathy 的 LLM 横向全景
- LLM 核心技术 MOC