K 的一隅

AI 神经网络基础

输出错了以后,责任怎样分回每一层:反向传播

模型预测错了,并不是把一句“你错了”原封不动地塞回去。反向传播要逐层计算:每条连接到底该为这次错误负责多少。

6 分钟阅读 更新于 2026-07-28
本文目录

模型把正确类别的概率给低了,把错误类别的概率给高了。最后一层的两个输出节点并不是独自做出判断的:它们依赖前一层传来的信息,前一层又依赖更早的输入。究竟哪一条连接该改、改多少?这就是反向传播(backpropagation)要计算的问题。

你现在只需要先记住三句话:

  1. 最终错在输出端,责任要从输出往回分。
  2. 每条连接按自己的权重“背锅”——权重大的路径,往往分到更大的责任。
  3. 反向传播只算出每个参数该往哪边调;真正改数字的是后面的优化器。

先点开下面的交互:选一个输出节点,看亮起的回传路径。先建立“责任怎么分”,公式放在后面验算。

误差追踪器

点一个输出,追查它的误差信号

固定网络为 2 → 2 → 2。亮起的线表示这一个输出的误差信号会加权传回哪些隐藏节点。

输入层
x₁
x₂
隐藏层
h₁
h₂
输出层
正在追查:输出 1预测 0.18,标签 1,误差信号 -0.82

它通过 h₁ 与 h₂ 的两条连接回传;每条路径的贡献会按连接权重加权,再在隐藏节点处汇总。

这一步是反向传播:计算每个参数的梯度。真正改动权重的是随后运行的优化器。

先确认“错”在哪里

前向传播结束后,模型给出预测;训练样本同时带着标签。两者进入损失函数,得到一个损失。对于某个输出节点,损失对该节点输出的影响可以看成一份误差信号:若它把结果推得太高,信号会提示它往回拉;若它推得太低,信号会提示它往上补。

这不是在给隐藏层下达“你应该输出 0.3”的命令。隐藏节点没有直接标准答案。它们只能根据自己对最终损失造成的影响,接收一份间接的责任说明。

误差信号怎样跨过一条连接

假设输出节点由隐藏节点的输出和权重相乘后得到。现在要问的是:改变某个隐藏节点一点点,会让最终损失变多少?

直觉上可以拆成两步:

  1. 输出端已经知道自己错了多少(误差信号)。
  2. 这条连接的权重告诉你:上游节点的变化,会按多大比例传到输出。

于是,上游节点收到的责任 ≈ 输出端的误差信号 × 这条连接的权重。误差信号跨过连接时会被权重加权。同一个隐藏节点连接到多个输出时,会收到多份加权信号,再把它们相加——不是平均,也不是随便挑一条。

这就是上面交互图中一条输出会点亮两条回传路径的原因:它对 h₁、h₂ 都有依赖;另一个输出也有自己的两条路径。真实网络只是节点更多、路径更长,原则没有变。

写成公式时长这样(链式法则)

上面那两步相乘,在数学里叫链式法则(chain rule)。读 ∂L/∂h 时,可以把它想成口语:“损失 L 对隐藏值 h 有多敏感”——不必先会微积分也能跟主线。

∂L/∂h = (∂L/∂o) × (∂o/∂h)

左边是隐藏节点应收到的责任;右边第一项是输出端带来的误差信号,第二项是这条连接怎样放大或缩小影响。

每个参数最终得到的是梯度

沿着链条一路向前回传,反向传播会为每个权重和偏置算出一个梯度(gradient):如果这个参数轻微增大,损失在当前样本附近会如何改变。

梯度不是“新权重”,也不是模型已经做出的修改。它记录方向和敏感度:正负号告诉我们该朝哪边调整,绝对值提示这个参数对当前误差有多敏感。

区分计算梯度与更新参数

这里最容易混淆的一点是:反向传播计算梯度;它负责回答“每个参数对错误贡献了多少”。

真正执行更新的是优化器(optimizer,例如 SGD 或 Adam):它读取梯度、学习率以及可能的历史信息,再决定把权重和偏置移动多远。简写为:

w ← w − η(∂L/∂w)

因此一次训练更新的顺序是:前向传播得到预测 → 损失函数量出错误 → 反向传播算梯度 → 优化器更新参数。把最后两步混成一个动作,会看不清谁在“算责任”,谁在“动手改数值”。

一次更新不会让模型立刻全对

梯度描述的是当前位置附近的变化;优化器每次也只迈一小步。它会汇总一批样本的信号,反复执行很多次,才逐渐形成更有用的权重。下一章会看这种长期训练为何有时能泛化到新数据,有时又会欠拟合、过拟合,甚至发生灾难性遗忘。

为什么必须从输出层开始

损失直接依赖输出层,因此输出层离损失最近,最容易先求出影响。隐藏层参数并不直接出现在最终损失公式里:它先改变隐藏层输出,隐藏层输出再改变输出,最后才改变损失。要计算这条间接影响,就要沿计算路径反向使用链式法则。

假设输入 x 经过权重 w₁ 得到隐藏值 h,再经过 w₂ 得到预测 ŷw₁ 对损失的影响可以拆成:

∂L/∂w₁ = ∂L/∂ŷ × ∂ŷ/∂h × ∂h/∂w₁

每一项只回答相邻两步之间的局部变化,乘起来才得到最前面参数对最终损失的总影响。“反向”不是把输入倒放,而是从已知的损失变化开始,沿计算依赖逆序求导。

一个隐藏节点为何收到多个信号

如果一个隐藏节点同时连接两个输出,它的数值变化会影响两个输出。它收到的不是某一个输出的单独命令,而是两条路径贡献的总和。每条贡献都要乘对应连接权重,再在隐藏节点处汇总。

假设两个输出的误差信号是 δ₁δ₂,连接权重是 v₁v₂,回到隐藏节点的主要部分就是:

δhidden = v₁δ₁ + v₂δ₂

如果隐藏节点前面还有 ReLU,还要乘 ReLU 在当前点的导数。因此“多个输出给隐藏层多个影响”的直觉基本正确,但汇总方式不是平均,也不是忽略连接直接相加,而是沿路径加权后求和。

交互图的正确观察顺序

先选择一个输出节点,观察亮起的反向路径;再比较预测与标签得到的误差信号;最后看信号在隐藏节点处汇合。动画中的移动方向只用于标出依赖关系,真正决定梯度数值的是局部导数和连接权重。

输入层没有需要更新的输入参数。反向计算可以得到损失对输入的导数,但普通监督训练通常只让优化器更新模型内部的权重和偏置。到这里,前向传播、损失、反向传播与优化器的职责就彻底分开了。