本节摘要:训练一个神经网络靠三件套协同:损失函数把"好坏"变成一个可优化的数字,反向传播用链式法则高效算出每个参数的梯度,优化器决定沿梯度走多大步。本节讲清三者的机制与配合,并覆盖 Adam/AdamW、学习率调度、混合精度这些大模型训练的标准配置。读完你就拥有了解读第 5、6 章预训练与微调所需的全部训练学概念。
阅读完本节,你应当能够:
优化的前提是可量化。损失函数把模型输出与真实答案的差距压缩成一个标量,训练的全部目标就是让这个数字下降。
不同任务用不同损失:
一个值得建立的直觉:损失函数的设计,就是对"什么是好"的编程。预训练用交叉熵,等于告诉模型"好 = 会接着写";RLHF 换成奖励最大化,等于告诉模型"好 = 人类喜欢"。第 6 章你会看到,ChatGPT 与 GPT-3 的差距,本质上就是换了一次"好的定义"。
前向传播算出输出和损失后,训练需要知道每一个参数对损失的偏导——参数有几十亿个,逐个数值求导(扰动一个参数看损失变化)在计算上完全不可行。
反向传播(backpropagation)解决了这个问题,核心是微积分的链式法则:复合函数的导数可以逐级相乘。前向时每层把中间结果存下来;反向时从损失出发,用链式法则从输出层往输入层逐层回传,一趟反向就能同时算出所有参数的梯度——因为每层的梯度计算都复用了下游已算好的结果。
用一个小例子看本质。设 L = f(g(x)),中间量 u = g(x)。链式法则:dL/dx = dL/du × du/dx。多层网络就是这条式子的级联:dL/dw1 = dL/da1 × da1/da0 × ... × da0/dw1。反向传播只是把这个连乘组织成从后往前的复用顺序,把每层的"局部导数"乘上传回来的"上游梯度"。
这也解释了 2.2 节的伏笔:链式法则是连乘,每项小于 1 则连乘趋零(梯度消失),大于 1 则爆炸。深网络的训练难点从数学上看就是这串连乘的数值稳定性问题。
拿到梯度后,优化器决定怎么走。演化线索清晰:
**SGD(随机梯度下降)**是最朴素的:参数 = 参数 − 学习率 × 梯度。缺点有二:一是像球在山谷里乱滚,方向抖(不同批数据的梯度噪声大);二是所有参数用同一个步长,而有的参数需要大步、有的需要小步。
**动量(Momentum)**针对抖动:把历史梯度做指数平均,相当于给球加上惯性,震荡抵消、趋势保留,下坡更快更稳。
Adam 把两件事一起做:动量(一阶矩估计)平滑方向,自适应学习率(二阶矩估计)让每个参数有自己的步长——梯度一直很大的参数走小步,梯度稀疏的参数走大步。收敛快、对初始学习率不敏感,成为大模型训练的事实标准。
AdamW 修正了 Adam 中权重衰减的实现错误(正则项与自适应学习率耦合),在现代架构上是默认选择。你以后在任何大模型训练配置里看到的 optimizer: AdamW,就是它。
| 优化器 | 关键机制 | 适用 |
|---|---|---|
| SGD | 纯梯度下降 | 小模型、精调后期 |
| SGD+Momentum | 惯性平滑 | 卷积网络时代主力 |
| Adam | 动量 + 自适应步长 | 快速收敛的通用选择 |
| AdamW | Adam + 正确的权重衰减 | 大模型标准配置 |
学习率决定每步走多大,是大模型训练中最敏感的超参数:
大模型训练几乎都配学习率调度,经典形状是三段:
⚠️ 最大坑:学习率与调度设错。预训练发散、微调把模型"训傻"(输出重复、丢失能力),八成源头在此。微调场景还有个经典翻车:学习率照抄预训练的量级——微调要用小一到两个数量级的学习率,否则几步就把预训练学到的东西冲掉了。第 6 章 PEFT 一节会回到这个话题。
另一个现代标配是混合精度训练:前向与反向用 16 位浮点(省一半显存与算力),权重更新与敏感计算用 32 位兜底,配合损失缩放防止小数值下溢。没有混合精度,千亿模型训练的成本要翻倍——第 7 章量化推理用的也是同一套"精度换成本"的思路,只是场景从训练换到了推理。
把三件套组装起来,一次完整训练的骨架如下(概念伪代码):
初始化参数(随机小值) for 每个训练步: batch = 采样一小批数据 logits = 前向传播(模型参数, batch) # 线性代数 loss = 交叉熵(logits, 真实标签) # 概率目标 grads = 反向传播(loss, 模型参数) # 链式法则 优化器.更新(模型参数, grads, 当前学习率) # AdamW 按调度器推进学习率 定期在验证集上评估,保存检查点
大模型预训练就是把这个循环跑上万亿 token、数万步,中间还要处理分布式并行、故障恢复(第 5 章)。微调是同一循环换个更小的数据集与学习率(第 6 章)。循环本身从头到尾没有变过——这是本节最想留下的印象。
标准排查顺序:学习率是否过大(最常见)、是否有脏数据(超长序列、异常字符)、混合精度的损失缩放是否失效、某个批次是否含极端数值。工程上靠梯度裁剪(把梯度的范数限制在阈值内)作为保底防线。
几十亿维的非凸优化不存在可行的全局最优算法。实践中"足够好的局部解 + 大规模数据"已经产生了惊人的能力,研究重心在"更快更稳地到达足够好",而非理论最优。
与算力和任务相关。大 batch 吞吐高但泛化有时变差;小 batch 噪声大但正则效果好。大模型预训练常用百万 token 级别的等效批量,并配合学习率的等比调整——批量翻倍,学习率大致也翻倍,这套经验配比来自规模定律研究(第 4 章)。
把本节知识串成一个真实故障案例。某团队微调一个开源模型做客服话术,三千条数据、学习率照抄预训练配置、跑了十轮。结果:训练损失一路降到很低,模型却废了——只会复读训练集里的模板句,常识问题一概答非所问。
逐项诊断:第一,学习率过大,预训练量级的学习率对小数据微调是重锤,几步就把预训练分布砸歪;第二,轮数过多,三千条数据十轮等于让模型把每句话背三十遍,过拟合到只会背诵;第三,没有验证与哨兵,全程只看训练损失,没人发现通用能力在第三轮后就开始流失。
修复方案对应本节知识点:学习率降两个数量级、改为一到两轮、加验证集与通用问题哨兵(每轮测十个常识问题)、改用 LoRA 冻结主干保底。重训后话术合格,通用能力完好。
这个案例的每个坑都能在正文找到对应原理——这也是为什么本教程坚持先讲训练机制再讲微调:微调的失败几乎从不在微调本身,而在对训练动力学的理解不足。第 6 章展开微调时,这些诊断手法会再次出现,到时你已经有了完整的理论武装。
没有。梯度只在训练时存在,推理时模型只做前向传播,权重完全固定。这个事实有个实用推论:模型文件里只有权重没有梯度,所以推理部署不需要优化器,显存占用远低于训练(第 6.3 节显存账的原理)。另一个推论:模型"不会再学习"——它不会从你的对话中变聪明,所谓"越用越好"的产品,靠的是服务端的数据回流与再训练,不是模型自己进化。
给一个可心算的框架:总训练量约等于"数据量乘轮数",步数等于总训练量除以批大小。例如三千条数据、两轮、每批三十条,约两百步——微调的量级;万亿 token 预训练、每批百万 token,约数万到十万步——预训练的量级。两个数字相差七个数量级,这个悬殊本身就说明:微调与预训练是两种工程,微调经验直接套用到预训练(或反过来)都会出错。
地基完工。第 3 章把这套机制第一次应用到语言上:词怎么变成向量,序列模型如何演化到注意力门口。