前向传播族
加权求和 · Weighted Sum
z = Wx + b
类比:咖啡师的配方
一杯拿铁 = 权重₁ × 浓缩咖啡 + 权重₂ × 牛奶 + 偏置(固定加的糖)。
权重决定每种食材的用量比例,偏置是无论如何都会加入的"底料"。
在神经网络里:z = w₁×x₁ + w₂×x₂ + b
权重 w 是"这个输入有多重要",偏置 b 让神经元在输入为零时也能有激活值,增加灵活性。
为什么要有偏置 b?
没有偏置时,输出平面必须过原点,拟合能力严重受限。加入偏置相当于给直线"上下平移"的自由,让网络能拟合更多形状。
ReLU 激活函数
max(0, z)
类比:公司晋升规则
综合评分 > 0 的员工留下(原样晋升),综合评分 ≤ 0 的直接淘汰(输出 0)。公司只保留"正向贡献"的信号,负分一律清零。
数学上:ReLU(z) = max(0, z)
z = +0.76 → ReLU = 0.76
正值原样通过。反向传播时,梯度也原样回传(导数 = 1)。
z = −0.30 → ReLU = 0
负值截断为零。反向传播时,梯度也截断为零(导数 = 0),这个神经元"沉默了"。
为什么需要激活函数?
没有激活函数,无论叠多少层,整个网络都等价于一个线性变换(直线)。激活函数引入非线性,让网络能学习曲线、圆形、任意复杂边界。ReLU 是目前最常用的选择:计算简单、梯度不消失(正区间)。
前向传播 · Forward Pass
输入 → 层层加工 → 输出
类比:餐厅传菜流水线
原材料(输入)→ 切配间(第1层)→ 烹饪间(第2层)→ 摆盘间(第3层)→ 传菜员(第4层)→ 端给客人(输出)。每道工序都在上一道的基础上加工,不能跳过或倒回。
每层做两件事:① 加权求和(线性变换);② 激活函数(非线性变换)。两者缺一不可。
损失 & 反向传播族
损失函数 · Loss Function
L = ½(ŷ − y)²
类比:导航偏离提示
你计划走 A 路,实际走了 B 路。GPS 会算出"偏离了多少米",这个距离就是损失。偏离越多,损失越大,越需要修正。训练的目标就是把这个"偏离距离"尽量缩小到 0。
使用 ½×MSE(均方误差的一半)的原因:求导后 2 和 ½ 正好抵消,公式更简洁。
损失 = 0 意味着什么?
预测值 = 真实值,完全正确。实际训练中不追求 0(那叫过拟合),而是追求"验证集上的损失最小"。
梯度 · Gradient
∂L/∂w = 坡度
类比:山地图上的坡度计
站在山上某点,坡度仪告诉你:① 朝哪个方向是上坡(梯度为正);② 朝哪个方向是下坡(梯度为负);③ 坡度有多陡(梯度的绝对值)。
对权重 w 的梯度 ∂L/∂w 告诉你:
· 符号为正:增大 w 会让损失增大 → 应该减小 w
· 符号为负:增大 w 会让损失减小 → 应该增大 w
· 绝对值大:这个权重对损失影响很大(责任大)
· 绝对值小:影响很小(责任小)
反向传播 · Backpropagation
链式法则逐层求导
类比:工厂质量追溯
产品出了质量问题,质检员从出厂开始往前追溯:出厂→包装→组装→零件加工→原材料。每道工序都要回答"你的操作对最终缺陷贡献了多少?"
为什么用"链式法则"? 因为神经网络是复合函数:损失 L 依赖输出层,输出层依赖第4层,第4层依赖第3层……每一层的梯度等于"后一层的梯度 × 本层对后一层的偏导数"。用连乘把所有环节串起来,就是链式法则。这是纯粹的微积分,不含任何"智能"。
链式法则的直觉
如果 A 影响 B,B 影响 C,那么 A 对 C 的影响 = (A对B的影响) × (B对C的影响)。
数学写法:
∂C/∂A = (∂C/∂B) × (∂B/∂A)
残差连接 · Residual Connection
h_out = ReLU(Wx+b) + h_in
类比:快递直达 vs 中转站
普通信件:发件人 → 中转站A → 中转站B → 收件人(每个中转都可能延误、丢件)。
顺丰直达:发件人 → 直接送到收件人(绕过中转站)。
残差连接的作用:
· 前向传播:原始信息(h_in)绕过本层,直接加到输出,防止信息丢失
· 反向传播:梯度信号通过"直通公路"绕过中间层直达底层,解决梯度消失
· 本例在第3层引入残差连接:h3 = ReLU(W3·h2 + b3) + h1(h1 跳过 L2 层)
本手册的网络参数
输入 x = [1.0, 0.5] 目标 y = 1.0 学习率 lr = 0.1
网络结构:输入(2) → L1(2) → L2(2) → L3(2, 残差) → L4(2) → 输出(1)
第3层引入残差连接,h3 = ReLU(W3·h2+b3) +
h1(h1 直连到 L3 输出)
网络结构图
残差连接路径
h1 →
跳过 L2,直接加入 L3 的输出
h3 = ReLU(W3 · h2 + b3) +
h1
初始权重(训练开始前)
L1 权重矩阵 W1(2×2)与偏置 b1
W1 = [[ 0.500, -0.200 ]
[ 0.300, 0.800 ]]
b1 = [ 0.100, -0.100 ]
读法:W1[0] = [0.5, -0.2],即
第一个神经元对 x₁ 的权重 = 0.5
第一个神经元对 x₂ 的权重 = -0.2
L2 权重矩阵 W2(2×2)与偏置 b2
W2 = [[ 0.400, 0.600 ]
[-0.300, 0.700 ]]
b2 = [ 0.200, 0.100 ]
L3 权重矩阵 W3(2×2)与偏置 b3
W3 = [[ 0.500, 0.300 ]
[-0.400, 0.600 ]]
b3 = [ 0.000, 0.100 ]
⚑ 第3层有残差连接
输出 = ReLU(W3·h2+b3) + h1
L4 权重矩阵 W4(2×2)与偏置 b4
W4 = [[ 0.400, -0.200 ]
[ 0.300, 0.500 ]]
b4 = [ 0.100, 0.000 ]
输出层权重 W5(1×2)与偏置 b5
W5 = [ 0.400, 0.200 ]
b5 = 0.000
输出层不加激活函数(线性)
ŷ = W5[0]×h4₁ + W5[1]×h4₂ + b5
训练目标
输入 x = [ 1.000, 0.500 ]
目标 y = 1.000
学习率 lr = 0.1
损失函数 L = ½ × (ŷ − y)²
权重的含义
| 符号 | 维度 | 含义 | 示例 |
| W1[0,0] = 0.5 |
标量 |
L1 第1个神经元对输入 x₁ 的权重 |
x₁ 影响该神经元的强度为 0.5 |
| W1[0,1] = -0.2 |
标量 |
L1 第1个神经元对输入 x₂ 的权重 |
负值:x₂ 增大时,该神经元输出减小 |
| b1[0] = 0.1 |
标量 |
L1 第1个神经元的偏置 |
即使 x=[0,0],输出仍有 0.1 的基础值 |
| W5 = [0.4, 0.2] |
1×2 向量 |
输出层对 h4 两个神经元的权重 |
h4₁ 的贡献是 h4₂ 的两倍 |
初始权重为何能"随机设定"?
真实训练中,权重用小随机数初始化(如正态分布 N(0, 0.01))。本手册用手工选定的值是为了让计算结果刚好是"干净的数字",便于教学演示。只要不把所有权重初始化为同一个值(否则每层神经元完全一样,失去意义),任何合理的初始值都可以。
加权求和的公式含义
z = W[行] · h_前层 + b
每个神经元对前层
所有输出做加权投票:权重大的输入贡献多,权重为负的输入"反向拉分"。偏置 b 是不依赖任何输入的"底票",让神经元在所有输入为零时仍能有输出。
第 1 层(L1)· 从输入到 h1
L1加权求和 → ReLU
为什么先做加权求和?
这是神经元的"投票机制":把所有输入按重要性加权,再加上偏置,得到一个综合评分 z。
这一步是线性变换,单独用它只能划直线;后面的 ReLU 才赋予非线性能力。
神经元 h1₁ 的加权求和
z1₁=
W1[0,0] × x₁ + W1[0,1] × x₂ + b1₁
=
0.500 × 1.000 + (-0.200) × 0.500 + 0.100
=
0.500 + (-0.100) + 0.100
z1₁=
0.500
z1₂=
W1[1,0] × x₁ + W1[1,1] × x₂ + b1₂
=
0.300 × 1.000 + 0.800 × 0.500 + (-0.100)
=
0.300 + 0.400 + (-0.100)
z1₂=
0.600
ReLU 激活
为什么在这里做 ReLU?
加权求和是线性操作。如果每层都只做线性操作,5 层叠在一起依然等价于 1 层线性变换,毫无意义。
ReLU 引入非线性,让网络能学到"弯曲"的决策边界。
本例中 z1₁ = 0.5 > 0、z1₂ = 0.6 > 0,两者都是正数,ReLU 不做截断,原样通过。
ReLU(z1) = max(0, z1)
h1₁=
max(0, z1₁) = max(0, 0.500)
h1₁=
0.500 (正数原样通过)
h1₂=
max(0, z1₂) = max(0, 0.600)
h1₂=
0.600 (正数原样通过)
L1 结果:h1 = [0.500, 0.600]
—— 这将作为 L2 的输入,同时通过残差连接跳到 L3。
第 2 层(L2)· 从 h1 到 h2
L2加权求和 → ReLU
L2 的输入来自 h1(不是原始 x)。
L1 已经对原始输入做了第一轮"特征提取",L2 在此基础上继续抽象。
这正是"深度"的含义:每层处理的是上一层加工过的特征,而不是原始数据。
神经元 h2₁ 的加权求和(输入来自 h1)
z2₁=
W2[0,0] × h1₁ + W2[0,1] × h1₂ + b2₁
=
0.400 × 0.500 + 0.600 × 0.600 + 0.200
=
0.200 + 0.360 + 0.200
z2₁=
0.760
z2₂=
W2[1,0] × h1₁ + W2[1,1] × h1₂ + b2₂
=
(-0.300) × 0.500 + 0.700 × 0.600 + 0.100
=
(-0.150) + 0.420 + 0.100
z2₂=
0.370
ReLU(z2) — 两个值均为正,直接通过
h2₁=
0.760 (0.760 > 0,通过)
h2₂=
0.370 (0.370 > 0,通过)
L2 结果:h2 = [0.760, 0.370]
—— 这将作为 L3 的输入(W3 变换部分)。
第 3 层(L3)· 残差连接层
L3含残差连接
L3 的特别之处:h3 = ReLU(W3 · h2 + b3) + h1
除了正常的 W3 变换,还把 h1 直接加进来(残差/跳层连接)。
这条"直通路"让 h1 的信息绕过 L2,无损到达 L3 的输出。
h2 = [0.76, 0.37]
→ W3·h2+b3 →
z3 = ?
→ ReLU →
relu3 = ?
+
h1 = [0.50, 0.60]
→
h3 = 最终输出
h1 通过跳层路径,与 relu3 直接相加,不经过任何权重矩阵的变换。
步骤 A:z3 = W3 · h2 + b3(输入来自 h2,不是 h1)
z3₁=
W3[0,0] × h2₁ + W3[0,1] × h2₂ + b3₁
=
0.500 × 0.760 + 0.300 × 0.370 + 0.000
=
0.380 + 0.111 + 0.000
z3₁=
0.491
z3₂=
W3[1,0] × h2₁ + W3[1,1] × h2₂ + b3₂
=
(-0.400) × 0.760 + 0.600 × 0.370 + 0.100
=
(-0.304) + 0.222 + 0.100
z3₂=
0.018
步骤 B:relu3 = ReLU(z3)
relu3₁=
0.491 (0.491 > 0,通过)
relu3₂=
0.018 (0.018 > 0,通过)
步骤 C:h3 = relu3 + h1(残差相加)
这是关键一步:把 h1 = [0.500, 0.600] 直接加到 relu3 上。加法不经过任何权重矩阵,
信息零损耗地从 L1 到达 L3 输出。
h3₁=
relu3₁ + h1₁ = 0.491 + 0.500
h3₁=
0.991
h3₂=
relu3₂ + h1₂ = 0.018 + 0.600
h3₂=
0.618
L3 结果:h3 = [0.991, 0.618]
注意 h3₂ = 0.618,远大于 relu3₂ = 0.018。这 0.600 完全来自 h1₂ 的残差。如果没有残差连接,h3₂ 只有 0.018,下层几乎收不到有效信号。这正是残差连接解决信息消失的直观体现。
第 4 层(L4)· 从 h3 到 h4
L4加权求和 → ReLU
L4 是普通层,输入为 h3 = [0.991, 0.618]。注意由于残差连接,h3 的数值比 h2 大了很多,
L4 接收到了更丰富的信号。
神经元 h4₁ 的加权求和(输入来自 h3)
z4₁=
W4[0,0] × h3₁ + W4[0,1] × h3₂ + b4₁
=
0.400 × 0.991 + (-0.200) × 0.618 + 0.100
=
0.396 + (-0.124) + 0.100
z4₁=
0.373
z4₂=
W4[1,0] × h3₁ + W4[1,1] × h3₂ + b4₂
=
0.300 × 0.991 + 0.500 × 0.618 + 0.000
=
0.297 + 0.309 + 0.000
z4₂=
0.606
L4 结果:h4 = [0.373, 0.606]
输出层(L5)· 线性输出,不加激活函数
输出层线性,无激活
为什么输出层不用 ReLU?
如果目标值 y 可能是任意实数(如本例 y=1.0),加 ReLU 会截断所有负数预测值,无法输出负数。
线性输出层保留了预测任意实数的能力。
(分类问题通常用 Softmax,这里是回归问题用线性。)
输出 ŷ = W5 · h4 + b5(线性,无激活)
ŷ=
W5[0] × h4₁ + W5[1] × h4₂ + b5
=
0.400 × 0.373 + 0.200 × 0.606 + 0.000
=
0.149 + 0.121 + 0.000
ŷ=
0.270 (目标是 1.0,差了 0.73!)
前向传播结果汇总
| 层 | 加权求和 z | 激活后输出 h | 备注 |
| 输入 |
— |
x = [1.000, 0.500] |
原始输入 |
| L1 |
z1 = [0.500, 0.600] |
h1 = [0.500, 0.600] |
两值均正,ReLU 透明 |
| L2 |
z2 = [0.760, 0.370] |
h2 = [0.760, 0.370] |
两值均正,ReLU 透明 |
| L3 (残差) |
z3 = [0.491, 0.018] relu3 = [0.491, 0.018] |
h3 = [0.991, 0.618] |
+ h1 残差,信号增强 |
| L4 |
z4 = [0.373, 0.606] |
h4 = [0.373, 0.606] |
两值均正,ReLU 透明 |
| 输出 |
z5 = 0.270 |
ŷ = 0.270 |
目标 y = 1.000,误差 −0.730 |
为什么需要损失函数?
预测值 ŷ = 0.270,目标 y = 1.000。误差是 −0.730。但"误差"本身有符号(正/负),
多个样本的误差正负相消会掩盖真实偏差。我们需要一个总是非负、误差越大值越大的量。
这就是损失函数的设计目标。
类比:射箭比赛的扣分规则
距靶心越远扣分越多
射箭时偏左 30cm 和偏右 30cm,方向不同但"偏差"一样大。裁判不看方向,只看距离的平方(30² = 900)。平方让远离靶心的惩罚成倍放大,让准确的射击得到更少扣分。
MSE = (ŷ − y)²:平方后误差必为正,且越大越受惩罚。前面乘 ½ 只是为了求导后系数刚好消掉 2,不影响最小化的方向。
损失计算
步骤 1:计算误差(残差)
误差=
ŷ − y
=
0.270 − 1.000
误差=
−0.730 (负值:预测值偏低,需要增大)
误差的符号有什么用?
− 0.730 中的负号在反向传播里至关重要:它告诉所有权重"你们需要让预测值
增大"。
如果误差是正数(预测偏高),则权重需要让预测值减小。符号决定了调整的
方向。
步骤 2:计算损失 L = ½ × (误差)²
L=
½ × (ŷ − y)²
=
½ × (−0.730)²
=
½ × 0.5329
L=
0.266 (这就是"山"的当前高度)
步骤 3:损失对预测值的导数(反向传播的起点)
反向传播需要的不是损失值本身,而是损失对每个参数的导数(梯度)。
第一步:求 L 对 ŷ 的导数,这是整个反向传播链的"起点信号"。
∂L/∂ŷ=
d/dŷ [½(ŷ−y)²] = (ŷ−y) × 1 (½ 和 2 抵消了)
=
0.270 − 1.000
∂L/∂ŷ=
−0.730 ← 这个值将被输入反向传播的第一层
为什么 ½MSE 的导数刚好是 (ŷ−y)?
L = ½(ŷ−y)²,对 ŷ 求导:
外层幂函数:2×(ŷ−y)¹;乘以 ½ → 系数变成 1;内层 (ŷ−y) 对 ŷ 求导是 1。
结果:
∂L/∂ŷ = 1 × (ŷ−y) × 1 = (ŷ−y)。
选 ½MSE 的唯一原因就是让导数形式更简洁,不影响最小化结果。
经过一步反向传播 + 权重更新后,损失将降到 0.155(详见第 7 页)。
链式法则的核心逻辑
每一层的梯度 =
(后一层传来的梯度)× (本层对后一层的偏导数)
就像工厂质量追溯:终端产品的缺陷(∂L/∂ŷ)先传到最后一道工序(L5),
L5 再按"我对最终缺陷的贡献比例"把信号分配给 L4,L4 再传给 L3……直到第 1 层。
输出层(L5)梯度
L5 → W5, b5
已知:∂L/∂ŷ = −0.730(来自损失函数页)
输出层计算 ŷ = W5[0]×h4₁ + W5[1]×h4₂ + b5。
对 W5[0] 求偏导:ŷ 随 W5[0] 变化,变化率是 h4₁。
链式法则:∂L/∂W5[0] = (∂L/∂ŷ) × (∂ŷ/∂W5[0]) = (∂L/∂ŷ) × h4₁
W5 的梯度
∂L/∂W5[0]=
∂L/∂ŷ × h4₁ = (−0.730) × 0.373
∂L/∂W5[0]=
−0.272 (负值:W5[0] 需增大)
∂L/∂W5[1]=
∂L/∂ŷ × h4₂ = (−0.730) × 0.606
∂L/∂W5[1]=
−0.442 (负值:W5[1] 需增大)
∂L/∂b5=
∂L/∂ŷ × 1 = −0.730
∂L/∂b5=
−0.730
把误差信号继续向前传:∂L/∂h4
ŷ = W5[0]×h4₁ + W5[1]×h4₂,所以 ŷ 对 h4₁ 的偏导是 W5[0]。
链式法则:∂L/∂h4₁ = ∂L/∂ŷ × W5[0]
∂L/∂h4₁=
(−0.730) × W5[0] = (−0.730) × 0.400
∂L/∂h4₁=
−0.292
∂L/∂h4₂=
(−0.730) × W5[1] = (−0.730) × 0.200
∂L/∂h4₂=
−0.146
第 4 层(L4)梯度
L4 → W4, b4
h4 = ReLU(z4),所以要先通过 ReLU 的导数,再继续往前传。
ReLU 的导数规则:若 z4 > 0,导数 = 1(梯度原样通过);若 z4 ≤ 0,导数 = 0(梯度截断)。
本例 z4 = [0.373, 0.606] 均为正,所以 ∂L/∂z4 = ∂L/∂h4(直接通过)。
通过 ReLU 导数:∂L/∂z4
∂L/∂z4₁=
∂L/∂h4₁ × ReLU'(z4₁) = (−0.292) × 1 (z4₁=0.373>0,导数=1)
∂L/∂z4₁=
−0.292
∂L/∂z4₂=
∂L/∂h4₂ × ReLU'(z4₂) = (−0.146) × 1 (z4₂=0.606>0,导数=1)
∂L/∂z4₂=
−0.146
W4 和 b4 的梯度
∂L/∂W4[0,0]=
∂L/∂z4₁ × h3₁ = (−0.292) × 0.991
∂L/∂W4[0,0]=−0.289
∂L/∂W4[0,1]=
∂L/∂z4₁ × h3₂ = (−0.292) × 0.618
∂L/∂W4[0,1]=−0.180
∂L/∂W4[1,0]=
∂L/∂z4₂ × h3₁ = (−0.146) × 0.991
∂L/∂W4[1,0]=−0.145
∂L/∂W4[1,1]=
∂L/∂z4₂ × h3₂ = (−0.146) × 0.618
∂L/∂W4[1,1]=−0.090
把误差信号传给 h3(通过 W4 的转置)
z4₁ = W4[0,0]×h3₁ + W4[1,0]×h3₂(注意:是 W4 的转置乘梯度)
∂L/∂h3₁ = W4[0,0]×∂L/∂z4₁ + W4[1,0]×∂L/∂z4₂
∂L/∂h3₁=
W4[0,0]×∂L/∂z4₁ + W4[1,0]×∂L/∂z4₂
=
0.400×(−0.292) + 0.300×(−0.146)
=
(−0.117) + (−0.044)
∂L/∂h3₁=−0.161
∂L/∂h3₂=
W4[0,1]×∂L/∂z4₁ + W4[1,1]×∂L/∂z4₂
=
(−0.200)×(−0.292) + 0.500×(−0.146)
=
0.058 + (−0.073)
∂L/∂h3₂=−0.015
第 3 层(L3)梯度 · 残差分裂
L3 → W3, b3残差梯度分裂
残差连接如何影响梯度?
前向传播时:h3 = relu3 + h1(加法)
反向传播时:加法的偏导等于 1,所以梯度
原封不动地分给两条路:
路径 A(正常路,经过 W3):∂L/∂relu3 = ∂L/∂h3 = [−0.161, −0.015]
路径 B(跳层路,直达 h1):∂L/∂h1_skip = ∂L/∂h3 = [−0.161, −0.015]
路径 B 的梯度将在 L1 步骤中与来自 W2 的梯度合并。
通过 ReLU3 导数:∂L/∂z3
z3 = [0.491, 0.018],均为正,ReLU 导数均为 1,梯度原样通过。
∂L/∂z3₁=
(−0.161) × 1 = −0.161
∂L/∂z3₂=
(−0.015) × 1 = −0.015
W3 和 b3 的梯度
∂L/∂W3[0,0]=
∂L/∂z3₁ × h2₁ = (−0.161) × 0.760
∂L/∂W3[0,0]=−0.122
∂L/∂W3[0,1]=
∂L/∂z3₁ × h2₂ = (−0.161) × 0.370
∂L/∂W3[0,1]=−0.060
∂L/∂W3[1,0]=
∂L/∂z3₂ × h2₁ = (−0.015) × 0.760
∂L/∂W3[1,0]=−0.011
∂L/∂W3[1,1]=
∂L/∂z3₂ × h2₂ = (−0.015) × 0.370
∂L/∂W3[1,1]=−0.006
把误差信号传给 h2(通过 W3 的转置,路径 A)
∂L/∂h2₁=
W3[0,0]×∂L/∂z3₁ + W3[1,0]×∂L/∂z3₂
=
0.500×(−0.161) + (−0.400)×(−0.015)
=
(−0.081) + 0.006
∂L/∂h2₁=−0.075
∂L/∂h2₂=
W3[0,1]×∂L/∂z3₁ + W3[1,1]×∂L/∂z3₂
=
0.300×(−0.161) + 0.600×(−0.015)
=
(−0.048) + (−0.009)
∂L/∂h2₂=−0.057
第 2 层(L2)梯度
L2 → W2, b2
通过 ReLU2 导数:∂L/∂z2(z2 全为正,直接通过)
W2 和 b2 的梯度
∂L/∂W2[0,0]=
∂L/∂z2₁ × h1₁ = (−0.075) × 0.500
∂L/∂W2[0,0]=−0.038
∂L/∂W2[0,1]=
∂L/∂z2₁ × h1₂ = (−0.075) × 0.600
∂L/∂W2[0,1]=−0.045
∂L/∂W2[1,0]=
∂L/∂z2₂ × h1₁ = (−0.057) × 0.500
∂L/∂W2[1,0]=−0.029
∂L/∂W2[1,1]=
∂L/∂z2₂ × h1₂ = (−0.057) × 0.600
∂L/∂W2[1,1]=−0.034
∂L/∂h1 通过 W2 的部分(路径来自 L2→L1)
∂L/∂h1₁|W2=
W2[0,0]×∂L/∂z2₁ + W2[1,0]×∂L/∂z2₂
=
0.400×(−0.075) + (−0.300)×(−0.057)
=
(−0.030) + 0.017
∂L/∂h1₁|W2=−0.013
∂L/∂h1₂|W2=
W2[0,1]×∂L/∂z2₁ + W2[1,1]×∂L/∂z2₂
=
0.600×(−0.075) + 0.700×(−0.057)
=
(−0.045) + (−0.040)
∂L/∂h1₂|W2=−0.085
第 1 层(L1)梯度 · 两路信号合并
L1 → W1, b1残差路径汇入
h1 的梯度来自两条路径
路径 A(通过 W2 从 L2 传来):∂L/∂h1|W2 = [−0.013, −0.085]
路径 B(通过残差连接从 L3 直跳来):∂L/∂h1_skip = [−0.161, −0.015]
两路信号相加,得到 h1 的总梯度。这正是残差连接的梯度优势:底层同时接收到更大的信号。
合并两路梯度:∂L/∂h1 = ∂L/∂h1|W2 + ∂L/∂h1_skip
∂L/∂h1₁=
(−0.013) + (−0.161)
∂L/∂h1₁=−0.173
∂L/∂h1₂=
(−0.085) + (−0.015)
∂L/∂h1₂=−0.099
W1 和 b1 的梯度(输入来自 x = [1.0, 0.5])
∂L/∂W1[0,0]=
∂L/∂z1₁ × x₁ = (−0.173) × 1.000
∂L/∂W1[0,0]=−0.173
∂L/∂W1[0,1]=
∂L/∂z1₁ × x₂ = (−0.173) × 0.500
∂L/∂W1[0,1]=−0.087
∂L/∂W1[1,0]=
∂L/∂z1₂ × x₁ = (−0.099) × 1.000
∂L/∂W1[1,0]=−0.099
∂L/∂W1[1,1]=
∂L/∂z1₂ × x₂ = (−0.099) × 0.500
∂L/∂W1[1,1]=−0.050
反向传播完成
所有 21 个参数(W1×4 + b1×2 + W2×4 + b2×2 + W3×4 + b3×2 + W4×4 + b4×2 + W5×2 + b5×1)的梯度均已计算完毕。
下一步:用这些梯度更新权重。→ 前往第 5 页查看梯度汇总,第 6 页查看权重更新。
如何读这张表
·
梯度为负(蓝色):增大这个权重会让损失
减小 → 应该增大它
·
梯度绝对值越大:这个权重对最终输出影响越大,更新幅度也越大
· 本例所有梯度均为负(因为 ∂L/∂ŷ = −0.730,负号传遍了整个网络)
输出层 · L5
| 参数 | 旧值 | 梯度 | |梯度| | 解读 |
| W5[0] | 0.400 | −0.272 | 0.272 | 较大,与 h4₁=0.373 成比例 |
| W5[1] | 0.200 | −0.442 | 0.442 | 最大梯度,h4₂=0.606 较大 |
| b5 | 0.000 | −0.730 | 0.730 | 偏置梯度 = 误差本身 |
第 4 层 · L4
| 参数 | 旧值 | 梯度 | |梯度| | 解读 |
| W4[0,0] | 0.400 | −0.289 | 0.289 | h3₁=0.991 贡献较大 |
| W4[0,1] | −0.200 | −0.180 | 0.180 | h3₂=0.618 中等 |
| W4[1,0] | 0.300 | −0.145 | 0.145 | ∂L/∂z4₂ 较小 |
| W4[1,1] | 0.500 | −0.090 | 0.090 | 最小的 L4 梯度 |
| b4[0] | 0.100 | −0.292 | 0.292 | |
| b4[1] | 0.000 | −0.146 | 0.146 | |
第 3 层(残差层)· L3
| 参数 | 旧值 | 梯度 | |梯度| | 解读 |
| W3[0,0] | 0.500 | −0.122 | 0.122 | |
| W3[0,1] | 0.300 | −0.060 | 0.060 | |
| W3[1,0] | −0.400 | −0.011 | 0.011 | L3 梯度普遍较小 |
| W3[1,1] | 0.600 | −0.006 | 0.006 | 最小梯度之一 |
| b3[0] | 0.000 | −0.161 | 0.161 | |
| b3[1] | 0.100 | −0.015 | 0.015 | |
第 2 层 · L2
| 参数 | 旧值 | 梯度 | |梯度| | 解读 |
| W2[0,0] | 0.400 | −0.038 | 0.038 | 信号经过多层衰减 |
| W2[0,1] | 0.600 | −0.045 | 0.045 | |
| W2[1,0] | −0.300 | −0.029 | 0.029 | |
| W2[1,1] | 0.700 | −0.034 | 0.034 | |
| b2[0] | 0.200 | −0.075 | 0.075 | |
| b2[1] | 0.100 | −0.057 | 0.057 | |
第 1 层 · L1(含残差路径加成)
| 参数 | 旧值 | 梯度(W2路径) | 梯度(残差路径) | 总梯度 |
| h1₁ 梯度来源 | — | −0.013 | −0.161 | −0.173 |
| h1₂ 梯度来源 | — | −0.085 | −0.015 | −0.099 |
| 参数 | 旧值 | 梯度 | |梯度| |
| W1[0,0] | 0.500 | −0.173 | 0.173 |
| W1[0,1] | −0.200 | −0.087 | 0.087 |
| W1[1,0] | 0.300 | −0.099 | 0.099 |
| W1[1,1] | 0.800 | −0.050 | 0.050 |
| b1[0] | 0.100 | −0.173 | 0.173 |
| b1[1] | −0.100 | −0.099 | 0.099 |
绿色行 = L1,残差连接给底层带来了更强的梯度信号(若无残差,L1 梯度只有 −0.013 和 −0.085,弱 10 倍)。
为什么用"减去梯度"而不是"加上梯度"?
梯度指向损失增大的方向(上坡)。我们想让损失减小,所以往
梯度反方向走,即减去梯度。
w_新 = w_旧 − lr × (∂L/∂w)
如果梯度为负(∂L/∂w = −0.272),减去负数 = 加上正数 → 权重增大,符合直觉(预测偏低就增大输出相关权重)。
学习率 lr = 0.1 的作用
梯度只告诉你"该往哪走",学习率决定"走多大步"。
· lr 太大(如 10):步子迈过最优点,损失可能反而增大
· lr 太小(如 0.0001):收敛极慢,需要百万次迭代
· lr = 0.1:本例合理范围,一步后损失从 0.266 降到 0.155
各层权重更新详情
输出层 · W5, b5
W5[0]:梯度最大的权重之一(绝对值 0.272)
W5[0]_新=
W5[0]_旧 − lr × ∂L/∂W5[0]
=
0.400 − 0.1 × (−0.272)
=
0.400 + 0.027
W5[0]_新=0.427
W5[1]_新=
0.200 − 0.1 × (−0.442) = 0.200 + 0.044
W5[1]_新=0.244
b5_新=
0.000 − 0.1 × (−0.730) = 0.000 + 0.073
b5_新=0.073
全部权重新旧对比表
| 参数 | 旧值 | 梯度 | 变化量 (−lr×梯度) | 新值 |
| W5[0] | 0.400 | −0.272 | +0.027 | 0.427 |
| W5[1] | 0.200 | −0.442 | +0.044 | 0.244 |
| b5 | 0.000 | −0.730 | +0.073 | 0.073 |
| W4[0,0] | 0.400 | −0.289 | +0.029 | 0.429 |
| W4[0,1] | −0.200 | −0.180 | +0.018 | −0.182 |
| W4[1,0] | 0.300 | −0.145 | +0.015 | 0.315 |
| W4[1,1] | 0.500 | −0.090 | +0.009 | 0.509 |
| b4[0] | 0.100 | −0.292 | +0.029 | 0.129 |
| b4[1] | 0.000 | −0.146 | +0.015 | 0.015 |
| W3[0,0] | 0.500 | −0.122 | +0.012 | 0.512 |
| W3[0,1] | 0.300 | −0.060 | +0.006 | 0.306 |
| W3[1,0] | −0.400 | −0.011 | +0.001 | −0.399 |
| W3[1,1] | 0.600 | −0.006 | +0.001 | 0.601 |
| b3[0] | 0.000 | −0.161 | +0.016 | 0.016 |
| b3[1] | 0.100 | −0.015 | +0.002 | 0.102 |
| W2[0,0] | 0.400 | −0.038 | +0.004 | 0.404 |
| W2[0,1] | 0.600 | −0.045 | +0.005 | 0.605 |
| W2[1,0] | −0.300 | −0.029 | +0.003 | −0.297 |
| W2[1,1] | 0.700 | −0.034 | +0.003 | 0.703 |
| b2[0] | 0.200 | −0.075 | +0.008 | 0.208 |
| b2[1] | 0.100 | −0.057 | +0.006 | 0.106 |
| W1[0,0] | 0.500 | −0.173 | +0.017 | 0.517 |
| W1[0,1] | −0.200 | −0.087 | +0.009 | −0.191 |
| W1[1,0] | 0.300 | −0.099 | +0.010 | 0.310 |
| W1[1,1] | 0.800 | −0.050 | +0.005 | 0.805 |
| b1[0] | 0.100 | −0.173 | +0.017 | 0.117 |
| b1[1] | −0.100 | −0.099 | +0.010 | −0.090 |
橙色行 = L5(变化最大);绿色行 = L1(残差加持后底层也得到了足够的梯度)。
为什么要做验证?
权重更新后,我们用同一个样本重新跑一遍前向传播,验证:① 损失确实下降了;② 预测值向目标值靠近了。
如果损失反而上升,说明学习率太大,需要减小 lr。
第二次前向传播(使用更新后的权重)
── 更新后的权重简表 ──
W1_新 = [[0.517, -0.191], [0.310, 0.805]] b1_新 = [0.117, -0.090]
W2_新 = [[0.404, 0.605], [-0.297, 0.703]] b2_新 = [0.208, 0.106]
W3_新 = [[0.512, 0.306], [-0.399, 0.601]] b3_新 = [0.016, 0.102]
W4_新 = [[0.429, -0.182], [0.315, 0.509]] b4_新 = [0.129, 0.015]
W5_新 = [0.427, 0.244] b5_新 = 0.073
L1(新权重)
z1₁=
0.517×1.0 + (−0.191)×0.5 + 0.117 = 0.517 − 0.096 + 0.117
z1₁, h1₁=0.539 (比旧值 0.500 大)
z1₂=
0.310×1.0 + 0.805×0.5 + (−0.090) = 0.310 + 0.403 − 0.090
z1₂, h1₂=0.622 (比旧值 0.600 大)
L2(新权重)
z2₁=
0.404×0.539 + 0.605×0.622 + 0.208 = 0.218 + 0.376 + 0.208
z2₁, h2₁=0.801
z2₂=
(−0.297)×0.539 + 0.703×0.622 + 0.106 = −0.160 + 0.437 + 0.106
z2₂, h2₂=0.383
L3(新权重 + 残差)
z3₁=
0.512×0.801 + 0.306×0.383 + 0.016 = 0.410 + 0.117 + 0.016
relu3₁=0.544
z3₂=
(−0.399)×0.801 + 0.601×0.383 + 0.102 = −0.320 + 0.230 + 0.102
relu3₂=0.012
h3₁=
relu3₁ + h1₁ = 0.544 + 0.539
h3₁=1.083
h3₂=
relu3₂ + h1₂ = 0.012 + 0.622
h3₂=0.634
L4(新权重)
z4₁=
0.429×1.083 + (−0.182)×0.634 + 0.129 = 0.465 − 0.115 + 0.129
h4₁=0.478
z4₂=
0.315×1.083 + 0.509×0.634 + 0.015 = 0.341 + 0.323 + 0.015
h4₂=0.678
输出层(新权重)
ŷ_新=
0.427×0.478 + 0.244×0.678 + 0.073 = 0.204 + 0.165 + 0.073
ŷ_新=
0.443 (旧值 0.270,向目标 1.0 靠近了!)
新的损失 L_新
L_新=
½ × (0.443 − 1.000)² = ½ × (−0.557)² = ½ × 0.310
L_新=
0.155 (旧损失 0.266,下降了 41.7%)
一步训练的成果对比
| 指标 | 第 1 次前向传播 | 第 2 次前向传播 | 变化 |
| 预测值 ŷ | 0.270 | 0.443 | +0.173,向目标 1.0 靠近 |
| 误差 (ŷ−y) | −0.730 | −0.557 | 绝对值缩小 |
| 损失 L | 0.266 | 0.155 | 下降 41.7% |
一次训练步骤到此完成
流程回顾:前向传播(0 → 2页) → 计算损失(第 3 页) → 反向传播求梯度(第 4 页) → 梯度汇总(第 5 页) → 更新权重(第 6 页) → 验证(第 7 页)
真实训练会重复这个循环
亿万次,每次用一批新样本,权重逐步收敛到能准确预测的值。GPT 的万亿参数,就是这套机械流程一遍遍跑出来的。
残差连接的实际贡献(本例数据)
· 无残差时,L1 梯度约为 [−0.013, −0.085](只有 W2 路径的贡献)
· 有残差时,L1 梯度变为 [−0.173, −0.099](叠加了跳层路径的 −0.161, −0.015)
· L1 的 W1[0,0] 更新量从 0.001 增加到 0.017,大了
13 倍。底层权重"听到"了更强的信号,学得更快。