欢迎光临
我们一直在努力

两层神经网络反向传播手推详解

两层神经网络反向传播手推详解 —— 从输入到梯度更新,全程数值计算

本文是《向量与矩阵求导详解》的姊妹篇。用一个具体的两层神经网络,代入真实数字,手把手推导完整的前向传播和反向传播过程。每一步都附有形状检查、直观解读和 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=W1x+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=(65)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}

Ly^LW2L,b2La1Lz1LW1L,b1L


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(65)=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=W2a1+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=w21a11+w22a12+w23a13

每个权重对 z2 的偏导就是对应的 a1 值:

z

2

w

21

=

a

11

=

1

\\frac{\\partial z_2}{\\partial w_{21}} = a_{11} = 1

w21z2=a11=1

z

2

w

22

=

a

12

=

2

\\frac{\\partial z_2}{\\partial w_{22}} = a_{12} = 2

w22z2=a12=2

z

2

w

23

=

a

13

=

3

\\frac{\\partial z_2}{\\partial w_{23}} = a_{13} = 3

w23z2=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}

W2z2=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}

W2L=z2LW2z2

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}

W2L=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

b2L=z2L=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}

a1L=W2Tz2L

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}

a1L=

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>0z0

链式法则(逐元素相乘,用

\\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)

z1L=a1LReLU(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}

z1L=

222

111

=

222

重要:如果某个

z

i

0

z_i \\leq 0

zi0,对应位置的梯度就变成 0。这就是 ReLU 的"死区"——梯度在这里断掉,前面的参数收不到更新信号。


Step 6:L 对 W1 的梯度

z

1

=

W

1

x

+

b

1

z_1 = W_1 \\cdot x + b_1

z1=W1x+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

W1L=z1LxT

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}

W1L=

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}

W1L=

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}

b1L=z1L=

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ηW2L

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=00.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.80.20.80.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.20.20.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=W1newx+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.80.20.80.40.60.6

[12]+

0.20.20.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.20.20.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.80.80.2+1.20.8+1.2

+

0.20.20.2

=

01.02.0

+

0.20.20.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

z0,输出为 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=W2newa1new+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.720.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.005)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.980.020.980.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.020.020.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×10.04×20.020.02×1+0.96×20.020.98×1+0.96×20.02

=

0.881.882.88

=

0.881.882.88

=0.98×0.88+0.96×1.88+0.94×2.880.02=0.862+1.805+2.7070.02=5.354=(5.3545)20.125

Loss:

1.0

一次更新

0.125

\\text{Loss:} 1.0 \\xrightarrow{\\text{一次更新}} 0.125 \\quad \\checkmark

Loss1.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

WL=zLxT

激活函数 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)

zL=aLReLU(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)(反向传播的起点)

整个反向传播里,没有任何一步用到了超出"逐个元素求偏导 + 链式法则"以外的数学。

后记:本文是《向量与矩阵求导详解》的实战篇。建议先阅读那篇文章理解基本求导规则,再用本文的数值例子手算一遍,反向传播的数学原理就彻底通了。文中如有错误,欢迎指正交流。

赞(0)
未经允许不得转载:171主机测评 » 两层神经网络反向传播手推详解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址