SERIES AI 与 LLM 学习路线 03 / 10

从线性层到反向传播:梯度究竟从哪里来

用一个两层网络推导链式法则,解释梯度、激活函数和参数更新的关系。

在 线性分类器 中,XW+bXW+b 给出了预测分数。训练时还要回答一个问题:预测错了,究竟该改 WW 的哪个元素,改多少?反向传播就是用链式法则高效计算这个答案;它不是另一种与梯度下降并列的优化器。

先看一个标量

设 z=wx+bz=wx+b,a=max⁡(0,z)a=\max(0,z),L=(a−y)2/2L=(a-y)^2/2。当 z>0z>0 时,链式法则给出:

∂L∂w=∂L∂a∂a∂z∂z∂w=(a−y)⋅1⋅x\frac{\partial L}{\partial w} =\frac{\partial L}{\partial a} \frac{\partial a}{\partial z} \frac{\partial z}{\partial w} =(a-y)\cdot 1\cdot x

若 z<0z<0,ReLU 在该点的导数为 0,这条路径就不给 ww 传递梯度;在 z=0z=0 处需约定一个次梯度,框架通常自行处理。梯度是局部斜率,更新 w←w−η∂L/∂ww\leftarrow w-\eta\partial L/\partial w 才是沿负梯度方向移动,其中 η\eta 是学习率。

两层网络为什么要“反着算”

令隐藏层 H=ReLU⁡(XW1+b1)H=\operatorname{ReLU}(XW_1+b_1),输出 Y^=HW2+b2\hat Y=HW_2+b_2。前向计算先得到 HH 再得到 Y^\hat Y;反向计算从损失对 Y^\hat Y 的导数出发,先求 W2W_2 的梯度,再通过 W2W_2 把误差信号传回 HH,最后求 W1W_1。中间结果会被多个参数复用,不必为每个权重单独重算整条导数链。

可以用微小扰动检查手算梯度。下例只验证单个标量,不适合用有限差分训练整个网络:

def loss(w, x=2.0, y=1.0):
    a = max(0.0, w * x)
    return 0.5 * (a - y) ** 2

w, eps = 0.75, 1e-5
numerical = (loss(w + eps) - loss(w - eps)) / (2 * eps)
analytic = (w * 2.0 - 1.0) * 2.0  # 此处 w*x > 0
print(numerical, analytic)  # 都接近 1.0

数值梯度是调试工具:太大的 eps 近似不准,太小又会受浮点误差影响。实际训练由自动微分记录张量运算图并应用链式法则。PyTorch 训练循环 会把 backward() 与 optimizer.step() 分开看,避免把“求梯度”和“更新参数”混为一谈。

参考:PyTorch 自动微分教程。

  1. 01从一个预测任务看 AI、机器学习与深度学习
  2. 02用 NumPy 的形状读懂一个线性分类器
  3. 03从线性层到反向传播:梯度究竟从哪里来当前文章
  4. 04PyTorch 训练循环里每一步在做什么
  5. 05从 RNN 到 Attention:固定长度上下文为何不够
  6. 06从矩阵形状理解 Self-Attention
  7. 07把 Transformer 拆成可检查的几层
  8. 08Tokenizer 和 Embedding 各自解决什么问题
  9. 09大语言模型怎样一个 Token 一个 Token 生成文本
  10. 10从检索链路理解 RAG,而不是只看向量数据库
NEXT IN SERIES 04 / PyTorch 训练循环里每一步在做什么