LESSON 13 · 卷 神经网络

反向传播

输出层错了,第一层的某个权重该负多大责任?

第 1 站

算梯度要多少钱?

上一课那台训练台,每点一步都用到了梯度 ——可梯度本身是怎么算出来的?这一课就来揭晓,也给卷二收尾。

最笨的方法是数值微分:对每个参数 ,把它微微增大 ,看损失怎么变:

是第 i 个分量为 1、其余为 0 的单位向量。 算一个参数的梯度,需要一次额外的前向传播。

n 个参数需要 n 次额外前向传播

GPT-3 有 1750 亿个参数。算一次完整梯度,需要 1750 亿次额外前向传播。 每次前向传播本身就要处理整个网络——这需要的时间和能源是天文数字。

有没有方法,只用一次前向传播,就把所有 1750 亿个参数的梯度全部算出来?

损失是很多层运算的复合:L = loss(softmax(W₃ · relu(W₂ · relu(W₁x + b₁) + b₂) + b₃))。从哪里切入能让梯度「流回来」?
第 2 站

链式法则:梯度怎么流回去

反向传播的精神,可以用一个词概括:追责。输出层算出来错了一截,这份「错」该怎么 摊派给前面每一层、每一个权重?谁的影响越大,谁就该多背一点责任、被调整得多一点。 而链式法则,正是这套追责的精确账本。

微积分里的链式法则:如果 ,那么:

翻译一下:「L 怎么随 x 变化」= 「L 怎么随 g 变化」× 「g 怎么随 x 变化」。 如果 g 是一层网络,x 是上一层的输出,那么这个公式就告诉我们:只要知道「损失对这层输出的梯度」,就能算出「损失对这层输入的梯度」, 进而继续往前一层传。

xz=Wx+ba=ReLU(z)L=(a−y)²→ 前向传播(计算并保存中间值)← 反向传播(链式法则逐层传回梯度)
图 13-1前向传播从左到右,计算并储存每个节点的值。反向传播从右到左,把损失的梯度通过链式法则一步步传回每个参数。

每个节点在前向传播时记录自己的输入值; 反向传播时,用记录的输入值计算本地导数,再乘以「右边传来的梯度」, 结果继续往左传。这就是计算图(computational graph)的工作方式。

第 3 站

跟着数字走一遍

最简单的网络:输入 x=2,一个权重 w=1.5,网络: z = w·x,a = z²,L = (a−6)²。目标输出 y=6。

① 前向传播z = w·x = 1.5 × 2 = 3.0a = z² = 3² = 9.0L = (a−y)² = (9−6)² = 9.0② 反向传播(链式法则)∂L/∂a = 2(a−y) = 2(9−6) = 6∂a/∂z = 2z = 2×3 = 6∂z/∂w = x = 2∂L/∂w = 6 × 6 × 2 = 72③ 参数更新(α=0.001)w ← 1.5 − 0.001×72 = 1.43再算一次:z=2.86,a=8.16,L≈4.65 —— 比原来的 9 小了 ✓
图 13-2链式法则把梯度从输出向输入传递:∂L/∂w = ∂L/∂a × ∂a/∂z × ∂z/∂w = 6×6×2 = 72。不需要额外的前向传播。

关键点:反向传播复用了前向传播中保存的中间值(z=3, a=9)来计算本地导数。整个过程只需要一次前向传播 + 一次反向传播, 不管有多少参数,代价只是两倍的前向传播

把同样的链式法则用到我们那台猜水果的机器上(神经元 + Sigmoid + 交叉熵),会冒出一个特别漂亮的结果。 下面这台演示就把梯度从损失一路传回 ——改颜色或真实答案,看每个梯度实时重算:

真实答案:颜色 x = 0.70
① 前向:从左到右算出每个值 →x · 颜色0.70z=w·x+b0.80p=σ(z)69%L · 损失0.37② 反向:链式法则把梯度从右往左传回 ←关键一步:∂L/∂z = p − y = -0.31∂L/∂w = (p−y)·x-0.22∂L/∂b = (p−y)-0.31
改颜色 x 或真实答案,看梯度实时重算。神经元 + 交叉熵让中间那串导数神奇地约成 ∂L/∂z = p − y(预测 − 真值)——这正是第 12 课训练台每一步用的梯度。猜得越离谱(p 离 y 越远),梯度越大,参数被推得越狠。
互动 13-A单神经元上的反向传播。中间一长串局部导数(∂L/∂p × ∂p/∂z)神奇地约成了 (预测 − 真值),再乘输入得 。这正是第 12 课训练台每一步用的那个梯度——闭环了。
第 4 站

完整案例:一步不省,教网络认出西瓜

上面那台单神经元太简单,梯度只穿过一层就到了权重。真实网络真正的难点,是梯度要穿过隐藏层、一层层往回传。 下面这个完整案例就把这件事彻底摊开:一个最小的「真」网络——2 个输入 → 1 个隐藏神经元(Sigmoid)→ 2 个输出(Softmax), 任务是判断一个水果是不是西瓜(颜色深、个头大就更像)。从前向、Softmax、损失,到反向传播每一步的链式法则、再到权重更新与训练收敛,所有数字一个不省、全程可交互

建议照标签页顺序走一遍: 看清网络结构 → 前向算出预测(拖动权重滑块感受变化)→ Softmax 把得分变概率、交叉熵量出损失 → 反向传播,A→E 五步把梯度从输出一路传回每个权重 → 按梯度更新一步、看损失是降是升 → 连点训练,看损失曲线一路滑到底、网络真的学会认西瓜。

场景:根据颜色和尺寸,判断是不是西瓜
西瓜通常颜色深、个头大。我们用这两个特征训练一个极简分类网络:2 个输入 → 1 个隐藏神经元 → 2 个输出。
🍉
西瓜(是)
颜色深 x₁=0.9 / 尺寸大 x₂=0.8
🍊
橙子(不是)
颜色浅 x₁=0.2 / 尺寸小 x₂=0.3
🍋
柠檬(不是)
颜色浅 x₁=0.1 / 尺寸小 x₂=0.2
🍉
西瓜(是)
颜色深 x₁=0.8 / 尺寸大 x₂=0.9
本案例自始至终用这一颗西瓜:颜色 x₁ = 0.9,尺寸 x₂ = 0.8,真实答案 = 西瓜(y = 0,即第 0 类)。网络初始权重是随便给的,要靠反向传播一步步学会。
w₁w₂v₁v₂x₁颜色x₂尺寸hsigmoido₁西瓜o₂不是softmax输入层隐藏层输出层= 0.9(深绿)x
符号说明
x₁ 颜色深浅(0=浅, 1=深绿),本例 x₁ = 0.9
x₂ 尺寸大小(0=极小, 1=极大),本例 x₂ = 0.8
w₁, w₂ 输入→隐藏层权重
z 隐藏层线性值:z = w₁·x₁ + w₂·x₂
h 隐藏层输出:h = sigmoid(z) ∈ (0,1)
v₁, v₂ 隐藏→输出层权重
o₁, o₂ 输出层线性值:o₁ = v₁·h,o₂ = v₂·h
ŷ₁, ŷ₂ Softmax 后的概率(ŷ₁=西瓜, ŷ₂=不是)
L 交叉熵损失  y = 0(真实类别:西瓜)
互动 13-B反向传播完整案例。一个 2→1→2 的西瓜分类网络,六个标签页把前向、Softmax、交叉熵、反向传播(链式法则逐步)、权重更新、训练模拟全部画了出来,每个数值都随你拖动的权重 / 学习率实时重算。

特别盯住第 页那条反向的链子(预测 − 真实)→ 乘 、两路相加得 → 乘 Sigmoid 的导数 → 再乘输入 。 每一环都只是「上一环传来的梯度 × 本环的局部导数」,一路相乘传回去——这就是反向传播的全部秘密。 唯一要小心的是:隐藏层 同时连着两个输出,它的梯度得把两条路相加

第 5 站

梯度消失——链式法则的副作用

反向传播的梯度是一串相乘: ∂L/∂w₁ = ∂L/∂aₙ × ∂aₙ/∂aₙ₋₁ × … × ∂a₂/∂a₁ × ∂a₁/∂w₁

小数连乘趋向零

如果每一层的「本地导数」都小于 1(比如 Sigmoid 的最大导数是 0.25), 经过 100 层相乘:0.25¹⁰⁰ ≈ 10⁻⁶⁰——梯度消失为零。 靠近输入的层接收到几乎为零的梯度信号,完全学不到任何东西。

解法一:ReLU——正区间导数恒为 1,梯度不因层数而衰减。
解法二:残差连接(第 24 课)——给梯度开一条「直通车」,跳过若干层直传。
解法三:梯度裁剪——对爆炸的梯度设上限,防止另一个极端(梯度爆炸)。

好消息:你几乎永远不需要手写反向传播。 PyTorch、TensorFlow 等框架内置自动微分(autograd): 用框架的运算构建网络,调用 loss.backward(), 所有参数的 .grad 属性就自动填好了。 反向传播对用户完全透明。

第 6 站

总结:卷二完整了

卷二六课,你建立了「神经网络如何学习」的完整图景:

  • 神经元:z = w·x + b,σ(z) 输出(第 7 课)
  • 激活函数:打破线性诅咒,ReLU 解决梯度消失(第 8 课)
  • 损失函数:MSE 用于回归,交叉熵用于分类(第 10 课)
  • Softmax:把分数变成概率,temperature 参数的来源(第 11 课)
  • Mini-batch / Adam:高效更新参数(第 12 课)
  • 反向传播:一次反向扫描算出所有梯度(第 13 课)
本课核心 · TAKEAWAY

反向传播 = 链式法则 在计算图上的系统化应用。 前向传播保存中间值,反向传播复用它们计算本地导数,梯度从输出反向流到所有参数。 代价仅是两倍的前向传播——这让训练亿级参数成为可能。

这一课你亲手推导了

  • 数值微分的问题:n 个参数需要 n 次额外前向传播,代价无法承受。
  • 链式法则:dL/dx = dL/dg × dg/dx,梯度可以从外向内逐层传递。
  • 反向传播:一次前向(保存中间值)+ 一次反向(传递梯度),搞定所有参数。
  • 梯度消失:小数连乘趋向零;ReLU + 残差连接是主要解法。
  • 自动微分:PyTorch autograd 帮你做了全部,只需 loss.backward()。
小测验

学习小测验

做完这一课,来检测一下核心知识点。选出你的答案后点击「提交」,即可看到正确选项与讲解。

Q1反向传播(backpropagation)要解决的核心问题是?
Q2反向传播之所以能把误差「逐层传回去」,依靠的是哪条数学法则?
NEXT · 卷三 自然语言处理

语言的概率游戏:N-gram

不懂语法、不懂语义,光靠「数数」能接出下一个词吗?——N-gram 模型的故事。

0 人点赞,0 人看过