大语言模型训练全流程指南:How to Train Your GPT详解反向传播、交叉熵损失与AdamW优化器
【免费下载链接】how-to-train-your-gptBuild a modern LLM from scratch. Every line commented. Explained like we are five.项目地址: https://gitcode.com/gh_mirrors/ho/how-to-train-your-gpt
How to Train Your GPT是一个"从零构建现代大语言模型"的开源教程,用 12 章 + 28 篇专题讲解,把 LLM 训练全流程讲得像给五岁孩子讲故事。本文带你吃透其中大语言模型训练最核心的三件套:反向传播、交叉熵损失、AdamW 优化器——正是它们让模型从"乱猜"变成"会说话"。
一、训练到底在做什么?一句话讲透大语言模型训练
训练大语言模型,本质是教机器接龙:
- 给模型看一句话:"The cat sat on the ___"
- 让它猜下一个词
- 猜对了 → 表扬;猜错了 → 扣分
- 模型据此微调内部参数,下次猜得更准
- 对几十亿句话重复几十亿次
对应的就是经典的训练循环:取一批数据 → 前向预测 → 算损失 → 反向传播 → 更新权重。模型里有上亿个"旋钮"(参数),训练就是找到每个旋钮该往哪拧。
想先看全局?阅读 chapters/00_overview.md,那里有整条流水线的鸟瞰图。
二、交叉熵损失:如何量化模型"猜得有多错"
大语言模型训练最常用的损失函数是交叉熵损失(Cross-Entropy Loss)。它的核心公式只有一行:
Loss = -log(正确答案的概率)
以 "mat" 为正确答案为例,三种情况一目了然:
| 模型给 "mat" 的概率 | 交叉熵损失 | 直观解读 |
|---|---|---|
| P = 0.95 | -log(0.95) ≈0.05 | 又准又自信,几乎不扣分 ✅ |
| P = 0.45 | -log(0.45) ≈0.80 | 半信半疑,扣一些分 |
| P = 0.01 | -log(0.01) ≈4.61 | 严重错误,重罚 🔥 |
它比"错误率"好在梯度信号是平滑且自适应的:错得越离谱,梯度越强,模型从大错误中学得最快。这就是大语言模型训练目标函数的数学本质——让正确答案的概率最大化。
一个有趣的起点:随机模型在 GPT-2 的 50257 词表上"均匀瞎猜",初始损失约为 ln(50257) ≈10.8,所有损失曲线都从这里出发。
📖 公式细节与-log的由来:chapters/08_training.md;代码实现仅一行:main.py#L188 的F.cross_entropy。
三、反向传播:从损失一路"追问"到每个参数
交叉熵损失告诉你"错在哪、错多少",**反向传播(Backpropagation)**则回答"每个参数该怎么改"。
3.1 链式法则:烤蛋糕的比喻
想象蛋糕太甜了。要降糖,但你不知道:减 1 克糖 → 甜度降多少?甜度降一点 → 蛋糕评分升多少?两者相乘,就知道减 1 克糖对评分的总影响——这正是链式法则:
参数对损失的影响 = 各层影响逐层相乘
反向传播就是把这个乘法从损失出发、逐层反推到所有参数,计算每个参数对错误的"贡献度"。
3.2 一个直觉视角
训练代码里只有两行:
loss = F.cross_entropy(...)→ "我们错了多少?"loss.backward()→ "搞清楚为什么错"
执行完后,每个参数都带上了grad(梯度)——比如"把 cat 这个词的某个向量分量调大 0.001,损失会下降 0.000342"。1.2 亿个旋钮,每个都有了明确的拧动方向。
四、AdamW优化器:大语言模型训练的标准配置
有了梯度,还差最后一步:步长多大?往哪迈?朴素梯度下降"每个参数、每步都用同样步长",又慢又容易震荡。AdamW 用三大改进解决了这个问题:
| 改进 | 直觉 | 默认值 |
|---|---|---|
| 动量 Momentum | 像滚下山坡的球,记住方向、攒足冲量,过滤噪声 | β₁ = 0.9 |
| 自适应学习率 | 每个参数有自己的步长:常动的参数小步走,少动的参数大步走 | β₂ = 0.95 |
| 解耦权重衰减 | 独立地把权重缓缓拉向零,防止过大、抑制过拟合 | weight_decay = 0.1 |
"W"指 decoupled(解耦)权重衰减——它独立于梯度计算,这才是它比普通 Adam 泛化更好的关键。GPT-3、LLaMA 以及所有主流大语言模型都用它训练。
4.1 一个工程细节:两组参数
并非所有参数都该被"拉向零"。本项目把参数分成两组(main.py#L304-L317):
- 衰减组(weight_decay = 0.1):线性层权重、词嵌入
- 不衰减组(weight_decay = 0):偏置、RMSNorm 权重——它们是"调音量旋钮",压成零模型就废了
常用超参数(LLaMA 同款,久经考验):lr=3e-4、betas=(0.9, 0.95)、eps=1e-8。
📖 AdamW 六步工作原理详解:explanations and examples WIP/adamw.md
五、训练流程完整速览:数据、混合精度与学习率调度
把前三节拼起来,一条完整的训练流水线还包括这些"工程护城河":
| 环节 | 作用 | 本项目做法 |
|---|---|---|
| 数据准备 | 文本切块,输入与目标错位 1 位(预测下一个 token) | WikiText-103,序列长 128~1024 |
| 混合精度 | 前向用 bfloat16,显存减半、速度翻倍,主权重仍用 float32 保精度 | torch.amp.autocast |
| 梯度累积 | 显存放不下大 batch 时,多次小 batch 累加梯度再更新,等价于大 batch | grad_accum_steps=2 |
| 梯度裁剪 | 防止个别"坏样本"引发梯度爆炸 | max_norm=1.0 |
| 余弦学习率调度 | 先 warmup 稳住开局,再沿余弦曲线平滑降速收尾,精确"软着陆" | explanations and examples WIP/cosine_warmup.md |
六、看懂损失曲线:大语言模型训练健康的唯一体检报告
训练时每 100 步记录一次损失并绘图,这张图就是模型的"心电图":
上图为项目 main.py 训练结束时自动生成的损失曲线,从约 11 平滑下降到 5.6——一条理想的大语言模型训练曲线:早期快速下降(学会标点、常用词),后期缓慢走低(掌握主谓一致等细微规律)。
曲线异常速查表(完整版含 8 种模式):
| 曲线形态 | 诊断 | 对策 |
|---|---|---|
| 📉 平滑下降 | 健康,正常学习 | 继续训练 |
| ➡️ 横在 10.8 不动 | 几乎必是 bug | 检查optimizer.step()、数据对齐 |
| ⚡ 周期性尖刺 | 梯度爆炸 | 加/收紧梯度裁剪,降学习率 |
| 📈 训练降、验证升 | 过拟合,在"背答案" | 早停、加 dropout、增大 weight_decay |
| ❌ 变 NaN | 数值溢出 | 大幅降低学习率、检查混合精度 |
📖 八种损失曲线形态图解:explanations and examples WIP/how_to_read_loss.md
七、动手实践:从零跑通你的第一个 GPT
本教程所有代码逐行注释,最小配置在 CPU 上几分钟即可跑完:
- 🚀完整可运行脚本:main.py —— 模型定义 + 训练循环 + 文本生成,一个文件从头到尾
- 📚训练章节:chapters/08_training.md —— 数据加载、优化器、调度器、检查点保存
- 📓交互式练习:notebooks/08_training.ipynb
- 🧩架构总表:chapters/11_glossary.md —— AdamW、RoPE、SwiGLU 等技术出处对照
- 🎯下一步训练:训练完还可以尝试 fine-tuning/README.md 里的 LoRA 微调
写在最后
大语言模型训练全流程并不神秘:交叉熵损失定义"错多少",反向传播算出"每个参数该改多少",AdamW决定"迈多大一步"——三者配合,再辅以混合精度、梯度裁剪、余弦调度这些工程技巧,就让上亿参数的小模型一步步学会"猜下一个词",最终开口说话。
顺着本教程,你写下的每一行代码,用的都是 LLaMA、Mistral 等现代大语言模型同款公开技术。动手跑一次,胜过读十篇文章。
【免费下载链接】how-to-train-your-gptBuild a modern LLM from scratch. Every line commented. Explained like we are five.项目地址: https://gitcode.com/gh_mirrors/ho/how-to-train-your-gpt
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考