两层神经网络反向传播手推详解 —— 从输入到梯度更新,全程数值计算
本文是《向量与矩阵求导详解》的姊妹篇。用一个具体的两层神经网络,代入真实数字,手把手推导完整的前向传播和反向传播过程。每一步都附有形状检查、直观解读和 PyTorch 对应关系。
目录
- 一、网络结构设定
- 二、前向传播 Forward Pass
- 三、反向传播 Backward Pass
- 四、梯度汇总
- 五、参数更新梯度下降
- 六、验证更新后的 Loss
- 七、完整流程图总结
- 八、反向传播的第一性原理理解
一、网络结构设定
输入(2个特征)→ 隐藏层(3个神经元)→ 输出层(1个预测值)
x(2×1) → W1(3×2) + b1(3×1) → z1(3×1) → ReLU → a1(3×1)
↓
W2(1×3) + b2(标量)
↓
z2(标量) = ŷ(预测值)
↓
L = (ŷ – y_true)²
二、前向传播 Forward Pass
用具体数字从头走到尾。
2.1 设定具体数值
输入向量 x:
x₁ = 1
x₂ = 2
形状:(2 × 1)
真实标签:y_true = 5
隐藏层权重矩阵 W1(3个神经元,每个连2个输入):
┌ ┐
│ 1 0 │ ← 第1个神经元的权重
│ 0 1 │ ← 第2个神经元的权重
│ 1 1 │ ← 第3个神经元的权重
└ ┘
形状:(3 × 2)
隐藏层偏置 b1:
[0, 0, 0]ᵀ
形状:(3 × 1)
输出层权重矩阵 W2(1个输出,连3个隐藏神经元):
[1, 1, 1]
形状:(1 × 3)
输出层偏置 b2:
0
形状:(标量)
2.2 第1步:线性变换 z1 = W1 · x + b1
z
1
=
W
1
⋅
x
+
b
1
z_1 = W_1 \\cdot x + b_1
z1=W1⋅x+b1
z
1
=
[
1
0
0
1
1
1
]
×
[
1
2
]
+
[
0
0
0
]
z_1 = \\begin{bmatrix} 1 & 0 \\\\ 0 & 1 \\\\ 1 & 1 \\end{bmatrix} \\times \\begin{bmatrix} 1 \\\\ 2 \\end{bmatrix} + \\begin{bmatrix} 0 \\\\ 0 \\\\ 0 \\end{bmatrix}
z1=
101011
×[12]+
000
逐元素计算:
z
1
(
1
)
=
1
×
1
+
0
×
2
=
1
z_{1}^{(1)} = 1 \\times 1 + 0 \\times 2 = 1
z1(1)=1×1+0×2=1
z
1
(
2
)
=
0
×
1
+
1
×
2
=
2
z_{1}^{(2)} = 0 \\times 1 + 1 \\times 2 = 2
z1(2)=0×1+1×2=2
z
1
(
3
)
=
1
×
1
+
1
×
2
=
3
z_{1}^{(3)} = 1 \\times 1 + 1 \\times 2 = 3
z1(3)=1×1+1×2=3
z
1
=
[
1
2
3
]
z_1 = \\begin{bmatrix} 1 \\\\ 2 \\\\ 3 \\end{bmatrix}
z1=
123
2.3 第2步:激活函数 a1 = ReLU(z1)
ReLU
(
z
)
=
max
(
0
,
z
)
\\text{ReLU}(z) = \\max(0, z)
ReLU(z)=max(0,z)
a
1
=
ReLU
(
[
1
2
3
]
)
=
[
1
2
3
]
a_1 = \\text{ReLU}\\left(\\begin{bmatrix} 1 \\\\ 2 \\\\ 3 \\end{bmatrix}\\right) = \\begin{bmatrix} 1 \\\\ 2 \\\\ 3 \\end{bmatrix}
a1=ReLU
123
=
123
z1 三个元素全部大于 0,所以 a1 = z1(不变)。
2.4 第3步:输出层 z2 = W2 · a1 + b2
z
2
=
[
1
1
1
]
⋅
[
1
2
3
]
+
0
z_2 = \\begin{bmatrix} 1 & 1 & 1 \\end{bmatrix} \\cdot \\begin{bmatrix} 1 \\\\ 2 \\\\ 3 \\end{bmatrix} + 0
z2=[111]⋅
123
+0
z
2
=
1
×
1
+
1
×
2
+
1
×
3
=
6
z_2 = 1 \\times 1 + 1 \\times 2 + 1 \\times 3 = 6
z2=1×1+1×2+1×3=6
预测值
y
^
=
z
2
=
6
\\hat{y} = z_2 = 6
y^=z2=6。
2.5 第4步:计算 Loss
MSE:
L
=
(
y
^
−
y
true
)
2
\\text{MSE: } L = (\\hat{y} – y_{\\text{true}})^2
MSE: L=(y^−ytrue)2
L
=
(
6
−
5
)
2
=
1
2
=
1
L = (6 – 5)^2 = 1^2 = 1
L=(6−5)2=12=1
三、反向传播 Backward Pass
核心任务:算出 L 对 W1、b1、W2、b2 的梯度。
反向传播顺序:从 Loss 出发,往输入方向一层一层推。
L
→
∂
L
∂
y
^
→
∂
L
∂
W
2
,
∂
L
∂
b
2
→
∂
L
∂
a
1
→
∂
L
∂
z
1
→
∂
L
∂
W
1
,
∂
L
∂
b
1
L \\rightarrow \\frac{\\partial L}{\\partial \\hat{y}} \\rightarrow \\frac{\\partial L}{\\partial W_2}, \\frac{\\partial L}{\\partial b_2} \\rightarrow \\frac{\\partial L}{\\partial a_1} \\rightarrow \\frac{\\partial L}{\\partial z_1} \\rightarrow \\frac{\\partial L}{\\partial W_1}, \\frac{\\partial L}{\\partial b_1}
L→∂y^∂L→∂W2∂L,∂b2∂L→∂a1∂L→∂z1∂L→∂W1∂L,∂b1∂L
Step 1:L 对 ŷ 的梯度
L
=
(
y
^
−
y
true
)
2
L = (\\hat{y} – y_{\\text{true}})^2
L=(y^−ytrue)2
∂
L
∂
y
^
=
2
(
y
^
−
y
true
)
\\frac{\\partial L}{\\partial \\hat{y}} = 2(\\hat{y} – y_{\\text{true}})
∂y^∂L=2(y^−ytrue)
代入数值:
∂
L
∂
y
^
=
2
(
6
−
5
)
=
2
\\frac{\\partial L}{\\partial \\hat{y}} = 2(6 – 5) = 2
∂y^∂L=2(6−5)=2
直观理解:预测值 6 比真实值 5 大,梯度是 +2,说明"增大预测值会让 Loss 变大",因此要减小预测值。
Step 2:L 对 W2 的梯度(标量对矩阵求导)
z
2
=
W
2
⋅
a
1
+
b
2
z_2 = W_2 \\cdot a_1 + b_2
z2=W2⋅a1+b2
展开就是:
z
2
=
w
21
⋅
a
11
+
w
22
⋅
a
12
+
w
23
⋅
a
13
z_2 = w_{21} \\cdot a_{11} + w_{22} \\cdot a_{12} + w_{23} \\cdot a_{13}
z2=w21⋅a11+w22⋅a12+w23⋅a13
每个权重对 z2 的偏导就是对应的 a1 值:
∂
z
2
∂
w
21
=
a
11
=
1
\\frac{\\partial z_2}{\\partial w_{21}} = a_{11} = 1
∂w21∂z2=a11=1
∂
z
2
∂
w
22
=
a
12
=
2
\\frac{\\partial z_2}{\\partial w_{22}} = a_{12} = 2
∂w22∂z2=a12=2
∂
z
2
∂
w
23
=
a
13
=
3
\\frac{\\partial z_2}{\\partial w_{23}} = a_{13} = 3
∂w23∂z2=a13=3
写成矩阵形式:
∂
z
2
∂
W
2
=
a
1
T
=
[
1
2
3
]
\\frac{\\partial z_2}{\\partial W_2} = a_1^T = \\begin{bmatrix} 1 & 2 & 3 \\end{bmatrix}
∂W2∂z2=a1T=[123]
链式法则:
∂
L
∂
W
2
=
∂
L
∂
z
2
⋅
∂
z
2
∂
W
2
\\frac{\\partial L}{\\partial W_2} = \\frac{\\partial L}{\\partial z_2} \\cdot \\frac{\\partial z_2}{\\partial W_2}
∂W2∂L=∂z2∂L⋅∂W2∂z2
∂
L
∂
W
2
=
2
⋅
[
1
2
3
]
=
[
2
4
6
]
\\frac{\\partial L}{\\partial W_2} = 2 \\cdot \\begin{bmatrix} 1 & 2 & 3 \\end{bmatrix} = \\begin{bmatrix} 2 & 4 & 6 \\end{bmatrix}
∂W2∂L=2⋅[123]=[246]
形状检查:W2 是 1×3,梯度也是 1×3。✓
Step 3:L 对 b2 的梯度
∂
L
∂
b
2
=
∂
L
∂
z
2
=
2
\\frac{\\partial L}{\\partial b_2} = \\frac{\\partial L}{\\partial z_2} = 2
∂b2∂L=∂z2∂L=2
b2 的梯度永远等于上游传过来的梯度,因为 b2 的系数恒为 1。
Step 4:L 对 a1 的梯度(梯度跨过 W2 传回隐藏层)
链式法则的矩阵形式:
∂
L
∂
a
1
=
W
2
T
⋅
∂
L
∂
z
2
\\frac{\\partial L}{\\partial a_1} = W_2^T \\cdot \\frac{\\partial L}{\\partial z_2}
∂a1∂L=W2T⋅∂z2∂L
∂
L
∂
a
1
=
[
1
1
1
]
×
2
=
[
2
2
2
]
\\frac{\\partial L}{\\partial a_1} = \\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\end{bmatrix} \\times 2 = \\begin{bmatrix} 2 \\\\ 2 \\\\ 2 \\end{bmatrix}
∂a1∂L=
111
×2=
222
形状检查:a1 是 3×1,梯度也是 3×1。✓
直观理解:W2 的三个权重都是 1,所以 a1 的每个元素对 Loss 的影响相等。
Step 5:通过 ReLU 反传——算出 ∂L/∂z1
前向:
a
1
=
ReLU
(
z
1
)
=
max
(
0
,
z
1
)
a_1 = \\text{ReLU}(z_1) = \\max(0, z_1)
a1=ReLU(z1)=max(0,z1)
反向——ReLU 的导数:
ReLU
′
(
z
)
=
{
1
,
z
>
0
0
,
z
≤
0
\\text{ReLU}'(z) = \\begin{cases} 1, & z > 0 \\\\ 0, & z \\leq 0 \\end{cases}
ReLU′(z)={1,0,z>0z≤0
链式法则(逐元素相乘,用
⊙
\\odot
⊙ 表示):
∂
L
∂
z
1
=
∂
L
∂
a
1
⊙
ReLU
′
(
z
1
)
\\frac{\\partial L}{\\partial z_1} = \\frac{\\partial L}{\\partial a_1} \\odot \\text{ReLU}'(z_1)
∂z1∂L=∂a1∂L⊙ReLU′(z1)
前向时
z
1
=
[
1
,
2
,
3
]
T
z_1 = [1, 2, 3]^T
z1=[1,2,3]T,全部大于 0,所以
ReLU
′
(
z
1
)
=
[
1
,
1
,
1
]
T
\\text{ReLU}'(z_1) = [1, 1, 1]^T
ReLU′(z1)=[1,1,1]T:
∂
L
∂
z
1
=
[
2
2
2
]
⊙
[
1
1
1
]
=
[
2
2
2
]
\\frac{\\partial L}{\\partial z_1} = \\begin{bmatrix} 2 \\\\ 2 \\\\ 2 \\end{bmatrix} \\odot \\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\end{bmatrix} = \\begin{bmatrix} 2 \\\\ 2 \\\\ 2 \\end{bmatrix}
∂z1∂L=
222
⊙
111
=
222
重要:如果某个
z
i
≤
0
z_i \\leq 0
zi≤0,对应位置的梯度就变成 0。这就是 ReLU 的"死区"——梯度在这里断掉,前面的参数收不到更新信号。
Step 6:L 对 W1 的梯度
z
1
=
W
1
⋅
x
+
b
1
z_1 = W_1 \\cdot x + b_1
z1=W1⋅x+b1,和 Step 2 同一模式:
∂
L
∂
W
1
=
∂
L
∂
z
1
⋅
x
T
\\frac{\\partial L}{\\partial W_1} = \\frac{\\partial L}{\\partial z_1} \\cdot x^T
∂W1∂L=∂z1∂L⋅xT
∂
L
∂
W
1
=
[
2
2
2
]
⋅
[
1
2
]
\\frac{\\partial L}{\\partial W_1} = \\begin{bmatrix} 2 \\\\ 2 \\\\ 2 \\end{bmatrix} \\cdot \\begin{bmatrix} 1 & 2 \\end{bmatrix}
∂W1∂L=
222
⋅[12]
列向量(3×1)× 行向量(1×2)= 矩阵(3×2):
∂
L
∂
W
1
=
[
2
×
1
2
×
2
2
×
1
2
×
2
2
×
1
2
×
2
]
=
[
2
4
2
4
2
4
]
\\frac{\\partial L}{\\partial W_1} = \\begin{bmatrix} 2 \\times 1 & 2 \\times 2 \\\\ 2 \\times 1 & 2 \\times 2 \\\\ 2 \\times 1 & 2 \\times 2 \\end{bmatrix} = \\begin{bmatrix} 2 & 4 \\\\ 2 & 4 \\\\ 2 & 4 \\end{bmatrix}
∂W1∂L=
2×12×12×12×22×22×2
=
222444
形状检查:W1 是 3×2,梯度也是 3×2。✓
直观理解:
- 每行 = 一个神经元(共 3 个),每列 = 一个输入特征(共 2 个)
- 第 2 列的值(4)是第 1 列(2)的两倍,因为
x
2
=
2
x_2 = 2
x2=2 是x
1
=
1
x_1 = 1
x1=1 的两倍 - 输入值越大,对权重梯度的贡献就越大——这就是为什么数据要归一化:防止某些特征值过大,反向传播时"绑架"梯度
Step 7:L 对 b1 的梯度
∂
L
∂
b
1
=
∂
L
∂
z
1
=
[
2
2
2
]
\\frac{\\partial L}{\\partial b_1} = \\frac{\\partial L}{\\partial z_1} = \\begin{bmatrix} 2 \\\\ 2 \\\\ 2 \\end{bmatrix}
∂b1∂L=∂z1∂L=
222
b1 的梯度直接等于上游梯度,和 Step 3 道理一致。
四、梯度汇总
|
W 2 W_2 W2 |
1 × 3 1 \\times 3 1×3 |
[ 2 4 6 ] \\begin{bmatrix} 2 & 4 & 6 \\end{bmatrix} [246] |
第3个权重对 Loss 影响最大(对应的
a 13 a_{13} a13 最大) |
|
b 2 b_2 b2 |
标量 |
2 2 2 |
上调 bias 会让 Loss 变大 |
|
W 1 W_1 W1 |
3 × 2 3 \\times 2 3×2 |
[ 2 4 2 4 2 4 ] \\begin{bmatrix} 2 & 4 \\\\ 2 & 4 \\\\ 2 & 4 \\end{bmatrix}
222444 |
第2列(对应
x 2 x_2 x2) > 第1列(对应 x 1 x_1 x1),因为 x 2 > x 1 x_2 > x_1 x2>x1 |
|
b 1 b_1 b1 |
3 × 1 3 \\times 1 3×1 |
[ 2 2 2 ] \\begin{bmatrix} 2 \\\\ 2 \\\\ 2 \\end{bmatrix}
222 |
三个神经元的 bias 梯度相等 |
五、参数更新(梯度下降)
学习率
η
=
0.1
\\eta = 0.1
η=0.1:
W2 更新
W
2
new
=
W
2
−
η
⋅
∂
L
∂
W
2
W_2^{\\text{new}} = W_2 – \\eta \\cdot \\frac{\\partial L}{\\partial W_2}
W2new=W2−η⋅∂W2∂L
W
2
new
=
[
1
1
1
]
−
0.1
⋅
[
2
4
6
]
=
[
0.8
0.6
0.4
]
W_2^{\\text{new}} = \\begin{bmatrix} 1 & 1 & 1 \\end{bmatrix} – 0.1 \\cdot \\begin{bmatrix} 2 & 4 & 6 \\end{bmatrix} = \\begin{bmatrix} 0.8 & 0.6 & 0.4 \\end{bmatrix}
W2new=[111]−0.1⋅[246]=[0.80.60.4]
b2 更新
b
2
new
=
0
−
0.1
×
2
=
−
0.2
b_2^{\\text{new}} = 0 – 0.1 \\times 2 = -0.2
b2new=0−0.1×2=−0.2
W1 更新
W
1
new
=
[
1
0
0
1
1
1
]
−
0.1
⋅
[
2
4
2
4
2
4
]
W_1^{\\text{new}} = \\begin{bmatrix} 1 & 0 \\\\ 0 & 1 \\\\ 1 & 1 \\end{bmatrix} – 0.1 \\cdot \\begin{bmatrix} 2 & 4 \\\\ 2 & 4 \\\\ 2 & 4 \\end{bmatrix}
W1new=
101011
−0.1⋅
222444
W
1
new
=
[
1
0
0
1
1
1
]
−
[
0.2
0.4
0.2
0.4
0.2
0.4
]
=
[
0.8
−
0.4
−
0.2
0.6
0.8
0.6
]
W_1^{\\text{new}} = \\begin{bmatrix} 1 & 0 \\\\ 0 & 1 \\\\ 1 & 1 \\end{bmatrix} – \\begin{bmatrix} 0.2 & 0.4 \\\\ 0.2 & 0.4 \\\\ 0.2 & 0.4 \\end{bmatrix} = \\begin{bmatrix} 0.8 & -0.4 \\\\ -0.2 & 0.6 \\\\ 0.8 & 0.6 \\end{bmatrix}
W1new=
101011
−
0.20.20.20.40.40.4
=
0.8−0.20.8−0.40.60.6
b1 更新
b
1
new
=
[
0
0
0
]
−
0.1
⋅
[
2
2
2
]
=
[
−
0.2
−
0.2
−
0.2
]
b_1^{\\text{new}} = \\begin{bmatrix} 0 \\\\ 0 \\\\ 0 \\end{bmatrix} – 0.1 \\cdot \\begin{bmatrix} 2 \\\\ 2 \\\\ 2 \\end{bmatrix} = \\begin{bmatrix} -0.2 \\\\ -0.2 \\\\ -0.2 \\end{bmatrix}
b1new=
000
−0.1⋅
222
=
−0.2−0.2−0.2
六、验证:更新后的 Loss
6.1 用 lr = 0.1 更新后跑一次前向
z1:
z
1
new
=
W
1
new
⋅
x
+
b
1
new
z_1^{\\text{new}} = W_1^{\\text{new}} \\cdot x + b_1^{\\text{new}}
z1new=W1new⋅x+b1new
z
1
new
=
[
0.8
−
0.4
−
0.2
0.6
0.8
0.6
]
⋅
[
1
2
]
+
[
−
0.2
−
0.2
−
0.2
]
z_1^{\\text{new}} = \\begin{bmatrix} 0.8 & -0.4 \\\\ -0.2 & 0.6 \\\\ 0.8 & 0.6 \\end{bmatrix} \\cdot \\begin{bmatrix} 1 \\\\ 2 \\end{bmatrix} + \\begin{bmatrix} -0.2 \\\\ -0.2 \\\\ -0.2 \\end{bmatrix}
z1new=
0.8−0.20.8−0.40.60.6
⋅[12]+
−0.2−0.2−0.2
=
[
0.8
×
1
+
(
−
0.4
)
×
2
(
−
0.2
)
×
1
+
0.6
×
2
0.8
×
1
+
0.6
×
2
]
+
[
−
0.2
−
0.2
−
0.2
]
= \\begin{bmatrix} 0.8 \\times 1 + (-0.4) \\times 2 \\\\ (-0.2) \\times 1 + 0.6 \\times 2 \\\\ 0.8 \\times 1 + 0.6 \\times 2 \\end{bmatrix} + \\begin{bmatrix} -0.2 \\\\ -0.2 \\\\ -0.2 \\end{bmatrix}
=
0.8×1+(−0.4)×2(−0.2)×1+0.6×20.8×1+0.6×2
+
−0.2−0.2−0.2
=
[
0.8
−
0.8
−
0.2
+
1.2
0.8
+
1.2
]
+
[
−
0.2
−
0.2
−
0.2
]
=
[
0
1.0
2.0
]
+
[
−
0.2
−
0.2
−
0.2
]
=
[
−
0.2
0.8
1.8
]
= \\begin{bmatrix} 0.8 – 0.8 \\\\ -0.2 + 1.2 \\\\ 0.8 + 1.2 \\end{bmatrix} + \\begin{bmatrix} -0.2 \\\\ -0.2 \\\\ -0.2 \\end{bmatrix} = \\begin{bmatrix} 0 \\\\ 1.0 \\\\ 2.0 \\end{bmatrix} + \\begin{bmatrix} -0.2 \\\\ -0.2 \\\\ -0.2 \\end{bmatrix} = \\begin{bmatrix} -0.2 \\\\ 0.8 \\\\ 1.8 \\end{bmatrix}
=
0.8−0.8−0.2+1.20.8+1.2
+
−0.2−0.2−0.2
=
01.02.0
+
−0.2−0.2−0.2
=
−0.20.81.8
a1:
a
1
new
=
ReLU
(
z
1
new
)
=
[
0
0.8
1.8
]
a_1^{\\text{new}} = \\text{ReLU}(z_1^{\\text{new}}) = \\begin{bmatrix} 0 \\\\ 0.8 \\\\ 1.8 \\end{bmatrix}
a1new=ReLU(z1new)=
00.81.8
第一个神经元
z
≤
0
z \\leq 0
z≤0,输出为 0,进入"死亡"状态。
z2(预测值):
z
2
new
=
W
2
new
⋅
a
1
new
+
b
2
new
z_2^{\\text{new}} = W_2^{\\text{new}} \\cdot a_1^{\\text{new}} + b_2^{\\text{new}}
z2new=W2new⋅a1new+b2new
=
[
0.8
0.6
0.4
]
⋅
[
0
0.8
1.8
]
+
(
−
0.2
)
= \\begin{bmatrix} 0.8 & 0.6 & 0.4 \\end{bmatrix} \\cdot \\begin{bmatrix} 0 \\\\ 0.8 \\\\ 1.8 \\end{bmatrix} + (-0.2)
=[0.80.60.4]⋅
00.81.8
+(−0.2)
=
0
+
0.48
+
0.72
−
0.2
=
1.00
= 0 + 0.48 + 0.72 – 0.2 = 1.00
=0+0.48+0.72−0.2=1.00
新 Loss:
L
new
=
(
1.00
−
5
)
2
=
16.0
(
比原来的
1
更大了!
)
L_{\\text{new}} = (1.00 – 5)^2 = 16.0 \\quad (\\text{比原来的 } 1 \\text{ 更大了!})
Lnew=(1.00−5)2=16.0(比原来的 1 更大了!)
Loss 变大了!这不是推导错了,而是学习率 0.1 对这个网络太大,一步"跨过"了最优解。
6.2 换 lr = 0.01 验证
W
2
new
=
[
1
1
1
]
−
0.01
⋅
[
2
4
6
]
=
[
0.98
0.96
0.94
]
W_2^{\\text{new}} = \\begin{bmatrix} 1 & 1 & 1 \\end{bmatrix} – 0.01 \\cdot \\begin{bmatrix} 2 & 4 & 6 \\end{bmatrix} = \\begin{bmatrix} 0.98 & 0.96 & 0.94 \\end{bmatrix}
W2new=[111]−0.01⋅[246]=[0.980.960.94]
W
1
new
=
[
1
0
0
1
1
1
]
−
0.01
⋅
[
2
4
2
4
2
4
]
=
[
0.98
−
0.04
−
0.02
0.96
0.98
0.96
]
W_1^{\\text{new}} = \\begin{bmatrix} 1 & 0 \\\\ 0 & 1 \\\\ 1 & 1 \\end{bmatrix} – 0.01 \\cdot \\begin{bmatrix} 2 & 4 \\\\ 2 & 4 \\\\ 2 & 4 \\end{bmatrix} = \\begin{bmatrix} 0.98 & -0.04 \\\\ -0.02 & 0.96 \\\\ 0.98 & 0.96 \\end{bmatrix}
W1new=
101011
−0.01⋅
222444
=
0.98−0.020.98−0.040.960.96
b
1
new
=
[
−
0.02
−
0.02
−
0.02
]
,
b
2
new
=
−
0.02
b_1^{\\text{new}} = \\begin{bmatrix} -0.02 \\\\ -0.02 \\\\ -0.02 \\end{bmatrix},\\quad b_2^{\\text{new}} = -0.02
b1new=
−0.02−0.02−0.02
,b2new=−0.02
前向:
z
1
=
[
0.98
×
1
−
0.04
×
2
−
0.02
−
0.02
×
1
+
0.96
×
2
−
0.02
0.98
×
1
+
0.96
×
2
−
0.02
]
=
[
0.88
1.88
2.88
]
a
1
=
[
0.88
1.88
2.88
]
z
2
=
0.98
×
0.88
+
0.96
×
1.88
+
0.94
×
2.88
−
0.02
=
0.862
+
1.805
+
2.707
−
0.02
=
5.354
L
new
=
(
5.354
−
5
)
2
≈
0.125
\\begin{aligned} z_1 &= \\begin{bmatrix} 0.98 \\times 1 – 0.04 \\times 2 – 0.02 \\\\ -0.02 \\times 1 + 0.96 \\times 2 – 0.02 \\\\ 0.98 \\times 1 + 0.96 \\times 2 – 0.02 \\end{bmatrix} = \\begin{bmatrix} 0.88 \\\\ 1.88 \\\\ 2.88 \\end{bmatrix} \\\\[10pt] a_1 &= \\begin{bmatrix} 0.88 \\\\ 1.88 \\\\ 2.88 \\end{bmatrix} \\\\[10pt] z_2 &= 0.98 \\times 0.88 + 0.96 \\times 1.88 + 0.94 \\times 2.88 – 0.02 \\\\[4pt] &= 0.862 + 1.805 + 2.707 – 0.02 = 5.354 \\\\[10pt] L_{\\text{new}} &= (5.354 – 5)^2 \\approx 0.125 \\end{aligned}
z1a1z2Lnew=
0.98×1−0.04×2−0.02−0.02×1+0.96×2−0.020.98×1+0.96×2−0.02
=
0.881.882.88
=
0.881.882.88
=0.98×0.88+0.96×1.88+0.94×2.88−0.02=0.862+1.805+2.707−0.02=5.354=(5.354−5)2≈0.125
Loss:
1.0
→
一次更新
0.125
✓
\\text{Loss:} 1.0 \\xrightarrow{\\text{一次更新}} 0.125 \\quad \\checkmark
Loss:1.0一次更新
0.125✓
只要学习率合适,Loss 稳定下降。
七、完整流程图总结
═══════════════════════════════════════════════════════
前向传播(一步不回头)
═══════════════════════════════════════════════════════
x ──→ [W₁, b₁] ──→ z₁ ──→ ReLU ──→ a₁ ──→ [W₂, b₂] ──→ z₂(ŷ) ──→ L = (ŷ-y)²
═══════════════════════════════════════════════════════
反向传播(从后往前推,一边推一边记录梯度)
═══════════════════════════════════════════════════════
① ∂L/∂z₂ = 2(z₂ – y_true) → 标量
② ∂L/∂W₂ = ∂L/∂z₂ × a₁ᵀ → 标量 × 行向量 = 矩阵
③ ∂L/∂b₂ = ∂L/∂z₂ → 标量
④ ∂L/∂a₁ = W₂ᵀ × ∂L/∂z₂ → 矩阵ᵀ × 标量 = 列向量
⑤ ∂L/∂z₁ = ∂L/∂a₁ ⊙ ReLU'(z₁) → 逐元素乘法,列向量
⑥ ∂L/∂W₁ = ∂L/∂z₁ × xᵀ → 列向量 × 行向量 = 矩阵
⑦ ∂L/∂b₁ = ∂L/∂z₁ → 列向量
═══════════════════════════════════════════════════════
参数更新(梯度下降)
═══════════════════════════════════════════════════════
W₁ = W₁ – η × ∂L/∂W₁
b₁ = b₁ – η × ∂L/∂b₁
W₂ = W₂ – η × ∂L/∂W₂
b₂ = b₂ – η × ∂L/∂b₂
八、反向传播的第一性原理理解
回头看整个过程,反向传播无非就是:
对每一层的参数,问"它变一点点,Loss 变多少?"然后用链式法则,从 Loss 往回一层一层把答案传过来。
每一层在反向时只做三件事:
| 线性层
W x + b Wx + b Wx+b |
矩阵乘法 |
∂ L ∂ W = ∂ L ∂ z ⋅ x T \\frac{\\partial L}{\\partial W} = \\frac{\\partial L}{\\partial z} \\cdot x^T ∂W∂L=∂z∂L⋅xT |
| 激活函数 ReLU |
max ( 0 , z ) \\max(0, z) max(0,z) |
∂ L ∂ z = ∂ L ∂ a ⊙ ReLU ′ ( z ) \\frac{\\partial L}{\\partial z} = \\frac{\\partial L}{\\partial a} \\odot \\text{ReLU}'(z) ∂z∂L=∂a∂L⊙ReLU′(z) |
| Loss 函数 MSE |
( y ^ − y ) 2 (\\hat{y} – y)^2 (y^−y)2 |
∂ L ∂ y ^ = 2 ( y ^ − y ) \\frac{\\partial L}{\\partial \\hat{y}} = 2(\\hat{y} – y) ∂y^∂L=2(y^−y)(反向传播的起点) |
整个反向传播里,没有任何一步用到了超出"逐个元素求偏导 + 链式法则"以外的数学。
后记:本文是《向量与矩阵求导详解》的实战篇。建议先阅读那篇文章理解基本求导规则,再用本文的数值例子手算一遍,反向传播的数学原理就彻底通了。文中如有错误,欢迎指正交流。


