本文目录
模型把正确类别的概率给低了,把错误类别的概率给高了。最后一层的两个输出节点并不是独自做出判断的:它们依赖前一层传来的信息,前一层又依赖更早的输入。究竟哪一条连接该改、改多少?这就是反向传播(backpropagation)要计算的问题。
你现在只需要先记住三句话:
- 最终错在输出端,责任要从输出往回分。
- 每条连接按自己的权重“背锅”——权重大的路径,往往分到更大的责任。
- 反向传播只算出每个参数该往哪边调;真正改数字的是后面的优化器。
先点开下面的交互:选一个输出节点,看亮起的回传路径。先建立“责任怎么分”,公式放在后面验算。
误差追踪器
点一个输出,追查它的误差信号
固定网络为 2 → 2 → 2。亮起的线表示这一个输出的误差信号会加权传回哪些隐藏节点。
它通过 h₁ 与 h₂ 的两条连接回传;每条路径的贡献会按连接权重加权,再在隐藏节点处汇总。
这一步是反向传播:计算每个参数的梯度。真正改动权重的是随后运行的优化器。
先确认“错”在哪里
前向传播结束后,模型给出预测;训练样本同时带着标签。两者进入损失函数,得到一个损失。对于某个输出节点,损失对该节点输出的影响可以看成一份误差信号:若它把结果推得太高,信号会提示它往回拉;若它推得太低,信号会提示它往上补。
这不是在给隐藏层下达“你应该输出 0.3”的命令。隐藏节点没有直接标准答案。它们只能根据自己对最终损失造成的影响,接收一份间接的责任说明。
误差信号怎样跨过一条连接
假设输出节点由隐藏节点的输出和权重相乘后得到。现在要问的是:改变某个隐藏节点一点点,会让最终损失变多少?
直觉上可以拆成两步:
- 输出端已经知道自己错了多少(误差信号)。
- 这条连接的权重告诉你:上游节点的变化,会按多大比例传到输出。
于是,上游节点收到的责任 ≈ 输出端的误差信号 × 这条连接的权重。误差信号跨过连接时会被权重加权。同一个隐藏节点连接到多个输出时,会收到多份加权信号,再把它们相加——不是平均,也不是随便挑一条。
这就是上面交互图中一条输出会点亮两条回传路径的原因:它对 h₁、h₂ 都有依赖;另一个输出也有自己的两条路径。真实网络只是节点更多、路径更长,原则没有变。
写成公式时长这样(链式法则)
上面那两步相乘,在数学里叫链式法则(chain rule)。读 ∂L/∂h 时,可以把它想成口语:“损失 L 对隐藏值 h 有多敏感”——不必先会微积分也能跟主线。
左边是隐藏节点应收到的责任;右边第一项是输出端带来的误差信号,第二项是这条连接怎样放大或缩小影响。
每个参数最终得到的是梯度
沿着链条一路向前回传,反向传播会为每个权重和偏置算出一个梯度(gradient):如果这个参数轻微增大,损失在当前样本附近会如何改变。
梯度不是“新权重”,也不是模型已经做出的修改。它记录方向和敏感度:正负号告诉我们该朝哪边调整,绝对值提示这个参数对当前误差有多敏感。
区分计算梯度与更新参数
这里最容易混淆的一点是:反向传播计算梯度;它负责回答“每个参数对错误贡献了多少”。
真正执行更新的是优化器(optimizer,例如 SGD 或 Adam):它读取梯度、学习率以及可能的历史信息,再决定把权重和偏置移动多远。简写为:
因此一次训练更新的顺序是:前向传播得到预测 → 损失函数量出错误 → 反向传播算梯度 → 优化器更新参数。把最后两步混成一个动作,会看不清谁在“算责任”,谁在“动手改数值”。
一次更新不会让模型立刻全对
梯度描述的是当前位置附近的变化;优化器每次也只迈一小步。它会汇总一批样本的信号,反复执行很多次,才逐渐形成更有用的权重。下一章会看这种长期训练为何有时能泛化到新数据,有时又会欠拟合、过拟合,甚至发生灾难性遗忘。
为什么必须从输出层开始
损失直接依赖输出层,因此输出层离损失最近,最容易先求出影响。隐藏层参数并不直接出现在最终损失公式里:它先改变隐藏层输出,隐藏层输出再改变输出,最后才改变损失。要计算这条间接影响,就要沿计算路径反向使用链式法则。
假设输入 x 经过权重 w₁ 得到隐藏值 h,再经过 w₂ 得到预测 ŷ。w₁ 对损失的影响可以拆成:
每一项只回答相邻两步之间的局部变化,乘起来才得到最前面参数对最终损失的总影响。“反向”不是把输入倒放,而是从已知的损失变化开始,沿计算依赖逆序求导。
一个隐藏节点为何收到多个信号
如果一个隐藏节点同时连接两个输出,它的数值变化会影响两个输出。它收到的不是某一个输出的单独命令,而是两条路径贡献的总和。每条贡献都要乘对应连接权重,再在隐藏节点处汇总。
假设两个输出的误差信号是 δ₁、δ₂,连接权重是 v₁、v₂,回到隐藏节点的主要部分就是:
如果隐藏节点前面还有 ReLU,还要乘 ReLU 在当前点的导数。因此“多个输出给隐藏层多个影响”的直觉基本正确,但汇总方式不是平均,也不是忽略连接直接相加,而是沿路径加权后求和。
交互图的正确观察顺序
先选择一个输出节点,观察亮起的反向路径;再比较预测与标签得到的误差信号;最后看信号在隐藏节点处汇合。动画中的移动方向只用于标出依赖关系,真正决定梯度数值的是局部导数和连接权重。
输入层没有需要更新的输入参数。反向计算可以得到损失对输入的导数,但普通监督训练通常只让优化器更新模型内部的权重和偏置。到这里,前向传播、损失、反向传播与优化器的职责就彻底分开了。