神经网络的训练本质上就是这个循环只是学生换成了一堆参数W和b老师换成了损失函数修改习惯换成了沿着梯度方向调整数值。类比Loss 老师给的总扣分。梯度 这道题里第 3 步贡献了 5 分扣分第 7 步贡献了 2 分——把总误差摊回到每一个具体决定上。优化器 学生根据这些细分反馈决定下次每一步怎么改、改多少。下一个 batch输入数据 x前向传播模型预测 ŷ损失函数L loss(ŷ, y)反向传播计算 ∂L/∂W优化器W ← W − η·g图 1 · 一个训练 step 的闭环前向 → 算 loss → 反向 → 更新02 · 第一步 · 前向传播模型先给出一个预测反向传播的前提是先有一次前向传播。模型把输入x一层一层往前算每一层做的事情都很朴素z W · x b a σ(z)其中W是权重矩阵b是偏置σ是激活函数ReLU、GELU、Softmax 等。一层输出的a又作为下一层的输入一路传到最后输出ŷ。关键点在前向传播的过程中框架PyTorch / JAX / TF会偷偷把每一步的中间结果都记账下来形成一张计算图。这张图就是反向传播能够沿着原路返回的路标。没有这本账后面的链式求导就无从谈起。03 · 第二步 · Loss用一个数字量化错得有多离谱预测出来ŷ之后需要一个标量来衡量离正确答案y还差多少。这就是损失函数loss function。常见 Loss 速查任务常用 Loss直觉解释回归MSE(ŷ − y)²差得越远扣分以平方放大二分类BCE / Logistic预测概率离真实标签的对数距离多分类 / LLMCross-Entropy模型给正确答案的概率越低扣分越多偏好对齐DPO / RLHF Loss让模型对好回答的概率高于差回答无论形式怎么变Loss 都是一个标量——只有一个数字。这一点至关重要因为只有标量函数才能对每一个参数求出一个明确的导数方向。注意Loss 本身不会改参数。它只是一个评分员给当前这套参数打了个分。真正动手改参数的是后面的反向传播和优化器。04 · 第三步 · 反向传播用链式法则把误差摊给每个参数现在我们有了一个数字Lloss还有几百万、几十亿个参数W。问题来了L 这一个数字怎么变成对每一个 W 的改进建议核心数学链式法则反向传播的灵魂只有一行高中数学——复合函数求导∂L/∂W₁ ∂L/∂a₃ · ∂a₃/∂z₃ · ∂z₃/∂a₂ · ∂a₂/∂z₂ · ∂z₂/∂a₁ · ∂a₁/∂z₁ · ∂z₁/∂W₁看着吓人但意思非常朴素L 对 W₁ 的敏感度等于一连串上一层对下一层的敏感度相乘。从输出端开始一层一层往输入端传递责任。反向传播的 4 个动作从输出端开始— 先算最容易的一步Loss 对最后一层输出ŷ的导数∂L/∂ŷ。例如 MSE 的话就是2(ŷ − y)。沿计算图反着走— 有了∂L/∂ŷ结合前向时记下来的中间值就能反推出∂L/∂W_last。再往前一层继续。把上游梯度乘进来— 每一层只需要做一次乘法本层的局部梯度 × 从后一层传过来的梯度得到的就是 Loss 对本层参数的梯度。得到一张梯度地图— 走完整张计算图后每个参数W都会拿到自己专属的梯度g ∂L/∂W告诉它你应该往哪个方向、用多大力度修改。类比把神经网络想象成一条流水线。某个产品最终被客户投诉Loss 大。反向传播就是顺着流水线倒查终检环节贡献了多少错焊接环节贡献了多少最上游的备料环节又贡献了多少每个工人参数最后都拿到一张属于自己的责任分摊单那就是它的梯度。梯度告诉你两件事维度含义方向符号梯度为正 → 增大该参数会让 Loss 变大所以应该减小它。反之亦然。大小幅值梯度越大 → 这个参数对当前错误的贡献越大需要更大幅度修改。图 3 · 不同层得到的梯度幅值典型情况越靠近输出层梯度信号越强越靠近输入层梯度往往越小这就是梯度消失的来源也是 ResNet、LayerNorm 等技巧要解决的问题。05 · 第四步 · 优化器拿到梯度后到底怎么改参数反向传播只负责算出梯度但具体怎么用这些梯度去改参数是优化器Optimizer的工作。最朴素的优化器只有一行公式SGDW ← W − η · g其中η是学习率learning rate。直觉上梯度告诉你哪边是上坡优化器就反着走迈一步η那么大。学习率太大容易冲过头太小则训练慢。主流优化器一览优化器核心思想更新公式简化适合场景SGD纯粹沿当前梯度反方向走W ← W − η·g简单任务、需要正则化效果Momentum积累惯性避免在峡谷里反复横跳v ← β·v g; W ← W − η·v损失面崎岖、需要加速收敛Adam给每个参数自己的学习率常更新的小步走少更新的大步走W ← W − η · m̂ / (√v̂ ε)大模型预训练 / 微调的默认选择AdamWAdam 解耦的权重衰减更干净的正则化同 Adam再加− η·λ·WLLM / Transformer 微调几乎必选为什么 Adam 类优化器会自适应Adam 在内部维护两个记忆m ← β₁·m (1−β₁)·g // 一阶动量梯度的滑动平均 v ← β₂·v (1−β₂)·g² // 二阶动量梯度平方的滑动平均 W ← W − η · m̂ / (√v̂ ε)直觉m像方向感告诉你最近一直往哪走v像油门刹车告诉你这个参数的梯度噪声大不大。梯度长期很大的参数v就大于是被自动除小更新更稳长期不动的参数v就小更新被自动放大。易混点很多人把梯度和参数更新量混为一谈。其实梯度 g是反向传播给的建议更新量 ΔW是优化器对建议的重新解读——加上学习率、动量、自适应缩放、权重衰减之后才是真正写回W的数。06 · 把链路串起来一次训练 step 的完整剧本把前面四步合在一起一个最小的训练 step 长这样PyTorch 写法# 1. 取一个 batch 的数据 x, y next(loader) # 2. 前向传播模型预测 计算 loss y_hat model(x) loss criterion(y_hat, y) # 3. 清掉上一步的旧梯度PyTorch 默认会累加 optimizer.zero_grad() # 4. 反向传播自动沿计算图算出每个参数的梯度 loss.backward() # 5. 优化器根据梯度更新参数 optimizer.step()这五行代码就是深度学习训练的最小心跳。模型微调、LLM 预训练、扩散模型训练……本质上都是这同一个循环跑几万到几亿次。OptimizerBackwardLoss模型 (W)数据 (x, y)OptimizerBackwardLoss模型 (W)数据 (x, y)进入下一个 batch输入 x1预测 ŷ2计算标量 L3dL/dŷ4沿计算图回传得到每个 W 的梯度 g5把 (W, g) 交给优化器6写回新参数 W7图 5 · 一次训练 step 的角色与信息流07 · 微调Fine-tuning里的反向传播有什么不一样核心机制完全相同但哪些参数参与反向传播会有变化。这是理解微调各种花招的关键。三种典型微调形态形态哪些参数计算梯度哪些参数被优化器更新显存代价全参微调全部 W全部 W极高梯度优化器状态都翻倍冻结部分层只有未冻结层只有未冻结层中等LoRA / Adapter原始 W不算梯度只算新增的低秩矩阵 A、B只更新 A、B原 W 完全冻结极低梯度仅占原模型 0.1%–1%LoRA 中的 A、B 到底是什么上面表格里反复提到的A、B不是随便起的字母它们是 LoRA 论文里定义好的两个低秩矩阵是真正接收梯度、被优化器更新的小参数。一句话概括核心公式原模型某层权重W ∈ ℝ^(d×k)冻结不动。LoRA 新增旁路ΔW B · A其中A ∈ ℝ^(r×k)B ∈ ℝ^(d×r)秩r ≪ min(d, k)常见 4 / 8 / 16 / 32。前向时实际用的权重W W B·A推理可合并零额外延迟。形状直观对比角色形状参数量举例 dk4096, r8是否参与训练原模型 Wd × k4096 × 4096 ≈16.78 M冻结不算梯度、不更新A降维矩阵r × k8 × 4096 32 K训练高斯随机初始化B升维矩阵d × r4096 × 8 32 K训练全零初始化A B 合计—≈65 K原模型的 0.39%—