0
概念导读 · Concepts
在看数字之前,先把概念讲清楚

7 个核心概念,配上生活中的类比,帮你建立直觉。理解了"为什么",再看数字就不会迷失。

前向传播族
加权求和 · 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 输出)
1
网络架构 · Architecture
五层网络的骨架与初始权重

训练开始前,所有权重都是手动设定的初始值(真实训练中是随机数)。

网络结构图
x₁
1.0
x₂
0.5
输入层
h1₁
h1₂
L1
ReLU
h2₁
h2₂
L2
ReLU
h3₁
h3₂
L3
ReLU+残差
h4₁
h4₂
L4
ReLU
ŷ
输出
线性
残差连接路径
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))。本手册用手工选定的值是为了让计算结果刚好是"干净的数字",便于教学演示。只要不把所有权重初始化为同一个值(否则每层神经元完全一样,失去意义),任何合理的初始值都可以。
2
前向传播 · Forward Pass
数据从左向右流过 5 层网络

输入 x = [1.0, 0.5]。每层先做加权求和(z = Wx + b),再过 ReLU 激活,结果传给下一层。

加权求和的公式含义
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 = ?
+
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
ReLU(z4) — 两个值均为正,直接通过
h4₁=0.373
h4₂=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
3
损失函数 · Loss Function
把预测误差压缩成一个数

ŷ = 0.270,目标 y = 1.000。需要一个数字来量化"错了多少",这个数字就是损失 L。

为什么需要损失函数?

预测值 ŷ = 0.270,目标 y = 1.000。误差是 −0.730。但"误差"本身有符号(正/负), 多个样本的误差正负相消会掩盖真实偏差。我们需要一个总是非负误差越大值越大的量。 这就是损失函数的设计目标。

类比:射箭比赛的扣分规则 距靶心越远扣分越多

射箭时偏左 30cm 和偏右 30cm,方向不同但"偏差"一样大。裁判不看方向,只看距离的平方(30² = 900)。平方让远离靶心的惩罚成倍放大,让准确的射击得到更少扣分。

MSE = (ŷ − y)²:平方后误差必为正,且越大越受惩罚。前面乘 ½ 只是为了求导后系数刚好消掉 2,不影响最小化的方向。


损失计算
步骤 1:计算误差(残差)
误差= ŷ − y
= 0.2701.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.2701.000
∂L/∂ŷ= −0.730    ← 这个值将被输入反向传播的第一层

为什么 ½MSE 的导数刚好是 (ŷ−y)?
L = ½(ŷ−y)²,对 ŷ 求导:
外层幂函数:2×(ŷ−y)¹;乘以 ½ → 系数变成 1;内层 (ŷ−y) 对 ŷ 求导是 1。
结果:∂L/∂ŷ = 1 × (ŷ−y) × 1 = (ŷ−y)
选 ½MSE 的唯一原因就是让导数形式更简洁,不影响最小化结果。
当前损失(目标:缩减至 0)
L = 0.266

经过一步反向传播 + 权重更新后,损失将降到 0.155(详见第 7 页)。

4
反向传播 · Backpropagation
误差从右向左逐层追责

利用链式法则,从输出层向输入层逐层求每个参数对损失的偏导数(梯度)。

链式法则的核心逻辑
每一层的梯度 = (后一层传来的梯度)× (本层对后一层的偏导数)
就像工厂质量追溯:终端产品的缺陷(∂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
∂L/∂b4₁=−0.292
∂L/∂b4₂=−0.146
把误差信号传给 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
∂L/∂b3₁=−0.161
∂L/∂b3₂=−0.015
把误差信号传给 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 全为正,直接通过)
∂L/∂z2₁=−0.075
∂L/∂z2₂=−0.057
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/∂b2₁=−0.075
∂L/∂b2₂=−0.057
∂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
通过 ReLU1 导数(z1 全为正,直接通过)
∂L/∂z1₁=−0.173
∂L/∂z1₂=−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
∂L/∂b1₁=−0.173
∂L/∂b1₂=−0.099
反向传播完成
所有 21 个参数(W1×4 + b1×2 + W2×4 + b2×2 + W3×4 + b3×2 + W4×4 + b4×2 + W5×2 + b5×1)的梯度均已计算完毕。 下一步:用这些梯度更新权重。→ 前往第 5 页查看梯度汇总,第 6 页查看权重更新。
5
梯度汇总 · Gradient Summary
所有参数的"责任大小"一览

梯度的绝对值 = 责任大小;符号 = 调整方向(负梯度→权重需增大,正梯度→需减小)。

如何读这张表
· 梯度为负(蓝色):增大这个权重会让损失减小 → 应该增大它
· 梯度绝对值越大:这个权重对最终输出影响越大,更新幅度也越大
· 本例所有梯度均为负(因为 ∂L/∂ŷ = −0.730,负号传遍了整个网络)
输出层 · L5
参数旧值梯度|梯度|解读
W5[0]0.400−0.2720.272较大,与 h4₁=0.373 成比例
W5[1]0.200−0.4420.442最大梯度,h4₂=0.606 较大
b50.000−0.7300.730偏置梯度 = 误差本身
第 4 层 · L4
参数旧值梯度|梯度|解读
W4[0,0]0.400−0.2890.289h3₁=0.991 贡献较大
W4[0,1]−0.200−0.1800.180h3₂=0.618 中等
W4[1,0]0.300−0.1450.145∂L/∂z4₂ 较小
W4[1,1]0.500−0.0900.090最小的 L4 梯度
b4[0]0.100−0.2920.292
b4[1]0.000−0.1460.146
第 3 层(残差层)· L3
参数旧值梯度|梯度|解读
W3[0,0]0.500−0.1220.122
W3[0,1]0.300−0.0600.060
W3[1,0]−0.400−0.0110.011L3 梯度普遍较小
W3[1,1]0.600−0.0060.006最小梯度之一
b3[0]0.000−0.1610.161
b3[1]0.100−0.0150.015
第 2 层 · L2
参数旧值梯度|梯度|解读
W2[0,0]0.400−0.0380.038信号经过多层衰减
W2[0,1]0.600−0.0450.045
W2[1,0]−0.300−0.0290.029
W2[1,1]0.700−0.0340.034
b2[0]0.200−0.0750.075
b2[1]0.100−0.0570.057
第 1 层 · L1(含残差路径加成)
参数旧值梯度(W2路径)梯度(残差路径)总梯度
h1₁ 梯度来源−0.013−0.161−0.173
h1₂ 梯度来源−0.085−0.015−0.099
参数旧值梯度|梯度|
W1[0,0]0.500−0.1730.173
W1[0,1]−0.200−0.0870.087
W1[1,0]0.300−0.0990.099
W1[1,1]0.800−0.0500.050
b1[0]0.100−0.1730.173
b1[1]−0.100−0.0990.099

绿色行 = L1,残差连接给底层带来了更强的梯度信号(若无残差,L1 梯度只有 −0.013 和 −0.085,弱 10 倍)。

6
权重更新 · Weight Update
按责任大小,每个权重各自挪一步

公式:w_新 = w_旧 − lr × 梯度    学习率 lr = 0.1

为什么用"减去梯度"而不是"加上梯度"?
梯度指向损失增大的方向(上坡)。我们想让损失减小,所以往梯度反方向走,即减去梯度。
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.0270.427
W5[1]0.200−0.442+0.0440.244
b50.000−0.730+0.0730.073
W4[0,0]0.400−0.289+0.0290.429
W4[0,1]−0.200−0.180+0.018−0.182
W4[1,0]0.300−0.145+0.0150.315
W4[1,1]0.500−0.090+0.0090.509
b4[0]0.100−0.292+0.0290.129
b4[1]0.000−0.146+0.0150.015
W3[0,0]0.500−0.122+0.0120.512
W3[0,1]0.300−0.060+0.0060.306
W3[1,0]−0.400−0.011+0.001−0.399
W3[1,1]0.600−0.006+0.0010.601
b3[0]0.000−0.161+0.0160.016
b3[1]0.100−0.015+0.0020.102
W2[0,0]0.400−0.038+0.0040.404
W2[0,1]0.600−0.045+0.0050.605
W2[1,0]−0.300−0.029+0.003−0.297
W2[1,1]0.700−0.034+0.0030.703
b2[0]0.200−0.075+0.0080.208
b2[1]0.100−0.057+0.0060.106
W1[0,0]0.500−0.173+0.0170.517
W1[0,1]−0.200−0.087+0.009−0.191
W1[1,0]0.300−0.099+0.0100.310
W1[1,1]0.800−0.050+0.0050.805
b1[0]0.100−0.173+0.0170.117
b1[1]−0.100−0.099+0.010−0.090

橙色行 = L5(变化最大);绿色行 = L1(残差加持后底层也得到了足够的梯度)。

7
验证结果 · Verification
用更新后的权重重跑前向传播

损失从 0.266 → 0.155,下降 41.7%。一次完整的训练步骤完成。

为什么要做验证?
权重更新后,我们用同一个样本重新跑一遍前向传播,验证:① 损失确实下降了;② 预测值向目标值靠近了。 如果损失反而上升,说明学习率太大,需要减小 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%)

一步训练的成果对比
训练前 · 损失 0.266
0.266
训练后 · 损失 0.155
0.155
指标第 1 次前向传播第 2 次前向传播变化
预测值 ŷ0.2700.443+0.173,向目标 1.0 靠近
误差 (ŷ−y)−0.730−0.557绝对值缩小
损失 L0.2660.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 倍。底层权重"听到"了更强的信号,学得更快。