反向传播是神经网络用来计算梯度的方法:如果把每个权重或偏置稍微改动一点,损失会变化多少。通俗地说,它会告诉模型,哪些参数把预测推向了错误方向,以及影响有多大。
简短地说,过程很简单:先让网络前向运行,测量误差,再用链式法则沿着同一条计算路径向后传递。这样一来,深层模型也变得可处理,因为每一层只需要提供一个局部的小导数。
反向传播计算的是什么
反向传播本身不会更新参数。它计算的是像 ∂w∂L 和 ∂b∂L 这样的梯度,其中 L 是损失。真正执行参数更新的是梯度下降这类优化器。
如果模型和损失函数是可微的,或者至少在使用梯度方法时足够分段可微,那么反向传播就能通过一次反向传递高效地算出这些梯度。
为什么链式法则是核心思想
可以把神经网络看成一长串计算链。每一层接收输入,进行变换,再把结果交给下一层。等你走到损失时,最终误差已经依赖于前面每一步的选择。
反向传播在每一步都问一个局部问题:如果这个中间值稍微变一点,最终损失会怎么变?当你向后移动时,这些局部影响会连乘起来。这就是用通俗语言解释的链式法则。
单个神经元的反向传播示例
使用一个只有一个输入的神经元:
z=wx+b
a=σ(z)
L=21(a−y)2
这里,x 是输入,w 是权重,b 是偏置,a 是预测值,y 是目标值,σ 是 sigmoid 函数。
取
x=2,w=0.5,b=0,y=1.
第 1 步:前向传播
先计算神经元的加权和:
z=wx+b=0.5⋅2+0=1.
现在应用 sigmoid:
a=σ(1)≈0.731.
接着计算损失:
L=21(0.731−1)2≈0.036.
预测值低于目标值,所以损失为正。
第 2 步:反向传播
现在计算相对于权重的梯度。
从损失开始,逐步向内推:
∂a∂L=a−y.
对于 sigmoid,
∂z∂a=a(1−a).
对于加权和,
∂w∂z=x,∂b∂z=1.
现在把这些部分连起来:
∂w∂L=∂a∂L⋅∂z∂a⋅∂w∂z=(a−y)a(1−a)x.
∂b∂L=∂a∂L⋅∂z∂a⋅∂b∂z=(a−y)a(1−a).
代入数值:
∂b∂L≈(0.731−1)(0.731)(1−0.731)≈−0.0529
∂w∂L≈(−0.0529)(2)≈−0.1058.
负号很重要。它们说明,在这里稍微增大 w 或 b 会减小损失,这和当前情况一致,因为现在的预测值偏低。
如果使用学习率为 η=0.1 的梯度下降,那么
wnew=w−η∂w∂L=0.5−0.1(−0.1058)≈0.5106
bnew=b−η∂b∂L=0−0.1(−0.0529)≈0.0053.
这就是整个思想的缩影:前向传播、计算损失、反向传播、更新参数。
为什么反向传播适用于深层网络
在更深的网络中,你做的仍然是同样的事,一层一层地处理。主要区别在于,每个隐藏层是通过后面的层间接影响损失的,所以它的梯度会包含更多链式法则中的因子。
反向传播之所以仍然实用,是因为每一层只需要自己的局部导数,以及来自后一层的信号。你不需要为每个参数都从头重新推导整个网络。
反向传播中的常见错误
把反向传播和梯度下降混为一谈
反向传播负责计算梯度。梯度下降使用这些梯度来更新参数。两者关系很紧密,但并不是同一个步骤。
忘记损失位于最后
反向传播是从损失开始的,而不是从某个任意的隐藏层开始。如果你弄不清损失依赖于什么,导数链通常就会断掉。
忽略激活函数的行为
有些激活函数在某些区域会产生非常小的梯度。如果这种情况在很多层中反复出现,学习过程就可能变得很慢。
以为一次反向传播就意味着模型已经学会了
一次反向传播只会为一个批次得到一组梯度。训练通常需要在大量样本上进行很多次更新。
反向传播在什么时候使用
反向传播是训练许多神经网络时的标准梯度计算方法,包括多层感知机、卷积网络、循环模型和 transformer。
具体使用的优化器可能不同,有些架构也会加入一些实用技巧,但核心思想通常是一样的:计算损失,把梯度向后传播,再更新参数以减少未来的误差。
一个便于记忆的实用方法
反向传播是一种在分层模型内部进行“归因”和“追责”的结构化方法。如果输出错了,这个方法就会把误差向后追踪,让每个参数都得到一个关于自己贡献了多少的信号。
这就是为什么“神经网络如何学习”这个说法大体上是准确的。学习是通过反复更新参数发生的,而反向传播让这些更新有依据,而不是随机进行。
试着做一道类似的题
保持同一个例子不变,但把目标值从 y=1 改成 y=0。重新计算 ∂w∂L 和 ∂b∂L,然后观察符号是如何翻转的。仅仅这一个变化,就比死记公式更能说明损失函数的作用。