把神经网络看作一个做题机器,整个训练过程就是:做题(前向传播) →\rightarrow→ 对答案(算误差) →\rightarrow→ 追查责任(反向传播) →\rightarrow→ 订正(更新权重)。

一、 初始状态:变量设定
- 输入特征 X=(121)X = \begin{pmatrix} 1 \\ 2 \\ 1 \end{pmatrix}X=121,真实目标 T=(500)T = \begin{pmatrix} 5 \\ 0 \\ 0 \end{pmatrix}T=500,学习率 α=0.01\alpha = 0.01α=0.01
- 网络结构:X→W1→ReLU→W2→ReLU→W3→YX \rightarrow W_1 \rightarrow ReLU \rightarrow W_2 \rightarrow ReLU \rightarrow W_3 \rightarrow YX→W1→ReLU→W2→ReLU→W3→Y
- 初始权重:
W1=(10−1010−101),W2=(110−11−1001),W3=(1000−10111)W_1 = \begin{pmatrix} 1 & 0 & -1 \\ 0 & 1 & 0 \\ -1 & 0 & 1 \end{pmatrix}, \quad W_2 = \begin{pmatrix} 1 & 1 & 0 \\ -1 & 1 & -1 \\ 0 & 0 & 1 \end{pmatrix}, \quad W_3 = \begin{pmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 1 & 1 & 1 \end{pmatrix}W1=10−1010−101,W2=1−101100−11,W3=1010−11001
二、 前向传播:模型先做一遍题
前向传播的公式就是:矩阵相乘 →\rightarrow→ 激活函数。
注:ReLU 的作用就是把负数和零变成 0,正数原样保留。我们同时记录下 Mask(掩码),1 代表激活,0 代表未激活。
1. 第一层(隐藏层 1)
- 线性计算:
Z1=W1⋅X=(1(1)+0(2)−1(1)0(1)+1(2)+0(1)−1(1)+0(2)+1(1))=(020)Z_1 = W_1 \cdot X = \begin{pmatrix} 1(1)+0(2)-1(1) \\ 0(1)+1(2)+0(1) \\ -1(1)+0(2)+1(1) \end{pmatrix} = \begin{pmatrix} \mathbf{0} \\ \mathbf{2} \\ \mathbf{0} \end{pmatrix}Z1=W1⋅X=1(1)+0(2)−1(1)0(1)+1(2)+0(1)−1(1)+0(2)+1(1)=020
- 激活输出:
H1=ReLU(Z1)=(020)H_1 = ReLU(Z_1) = \begin{pmatrix} 0 \\ 2 \\ 0 \end{pmatrix}H1=ReLU(Z1)=020
- 记录掩码:
Mask1=(010)Mask_1 = \begin{pmatrix} 0 \\ 1 \\ 0 \end{pmatrix}Mask1=010
2. 第二层(隐藏层 2)
- 线性计算:
Z2=W2⋅H1=(1(0)+1(2)+0(0)−1(0)+1(2)−1(0)0(0)+0(2)+1(0))=(220)Z_2 = W_2 \cdot H_1 = \begin{pmatrix} 1(0)+1(2)+0(0) \\ -1(0)+1(2)-1(0) \\ 0(0)+0(2)+1(0) \end{pmatrix} = \begin{pmatrix} \mathbf{2} \\ \mathbf{2} \\ \mathbf{0} \end{pmatrix}Z2=W2⋅H1=1(0)+1(2)+0(0)−1(0)+1(2)−1(0)0(0)+0(2)+1(0)=220
- 激活输出:
H2=ReLU(Z2)=(220)H_2 = ReLU(Z_2) = \begin{pmatrix} 2 \\ 2 \\ 0 \end{pmatrix}H2=ReLU(Z2)=220
- 记录掩码:
Mask2=(110)Mask_2 = \begin{pmatrix} 1 \\ 1 \\ 0 \end{pmatrix}Mask2=110
3. 第三层(输出层,无 ReLU)
- 模型预测:
Y=W3⋅H2=(1(2)+0(2)+0(0)0(2)−1(2)+0(0)1(2)+1(2)+1(0))=(2−24)Y = W_3 \cdot H_2 = \begin{pmatrix} 1(2)+0(2)+0(0) \\ 0(2)-1(2)+0(0) \\ 1(2)+1(2)+1(0) \end{pmatrix} = \begin{pmatrix} \mathbf{2} \\ \mathbf{-2} \\ \mathbf{4} \end{pmatrix}Y=W3⋅H2=1(2)+0(2)+0(0)0(2)−1(2)+0(0)1(2)+1(2)+1(0)=2−24
三、 对答案:计算误差信号
直接用预测值减去真实值,得到输出层的误差梯度(这是反向传播的源头):
dY=Y−T=(2−24)−(500)=(−3−24)dY = Y - T = \begin{pmatrix} 2 \\ -2 \\ 4 \end{pmatrix} - \begin{pmatrix} 5 \\ 0 \\ 0 \end{pmatrix} = \begin{pmatrix} -3 \\ -2 \\ 4 \end{pmatrix}dY=Y−T=2−24−500=−3−24
如果计算当前损失值(平方误差的一半):
L=14.5L = 14.5L=14.5
四、 反向传播:追查各层责任
反向传播听起来高深,其实在每一层只重复干三件事(反向传播三板斧):
- 过阀门 (ReLU):
dZ=dH⊙MaskdZ = dH \odot MaskdZ=dH⊙Mask
(前向没激活的神经元,反向不参与分锅,梯度清零)。
2. 算权重梯度:
dW=dZ⋅InputTdW = dZ \cdot Input^TdW=dZ⋅InputT
(当前误差 ×\times× 这一层的输入,就是权重的责任)。
3. 把误差传给上一层:
dHprev=WTdZdH_{prev} = W^T dZdHprev=WTdZ
(用当前权重的转置矩阵,把误差信号“按原路”分摊回去)。
1. 追责第三层 (W3W_3W3)
输出层没有 ReLU,直接算:
- W3W_3W3 梯度:
dW3=dY⋅H2T=(−3−24)(220)=(−6−60−4−40880)dW_3 = dY \cdot H_2^T = \begin{pmatrix} -3 \\ -2 \\ 4 \end{pmatrix} \begin{pmatrix} 2 & 2 & 0 \end{pmatrix} = \begin{pmatrix} -6 & -6 & 0 \\ -4 & -4 & 0 \\ 8 & 8 & 0 \end{pmatrix}dW3=dY⋅H2T=−3−24(220)=−6−48−6−48000
- 误差回传:
dH2=W3TdY=(164)dH_2 = W_3^T dY = \begin{pmatrix} 1 \\ 6 \\ 4 \end{pmatrix}dH2=W3TdY=164
2. 追责第二层 (W2W_2W2)
遇到 ReLU,先过阀门(Mask):
- 过阀门:
dZ2=dH2⊙Mask2=(164)⊙(110)=(160)dZ_2 = dH_2 \odot Mask_2 = \begin{pmatrix} 1 \\ 6 \\ 4 \end{pmatrix} \odot \begin{pmatrix} 1 \\ 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 1 \\ 6 \\ 0 \end{pmatrix}dZ2=dH2⊙Mask2=164⊙110=160
(第3项被清零)
- W2W_2W2 梯度:
dW2=dZ2⋅H1T=(160)(020)=(0200120000)dW_2 = dZ_2 \cdot H_1^T = \begin{pmatrix} 1 \\ 6 \\ 0 \end{pmatrix} \begin{pmatrix} 0 & 2 & 0 \end{pmatrix} = \begin{pmatrix} 0 & 2 & 0 \\ 0 & 12 & 0 \\ 0 & 0 & 0 \end{pmatrix}dW2=dZ2⋅H1T=160(020)=0002120000
- 误差回传:
dH1=W2TdZ2=(−57−6)dH_1 = W_2^T dZ_2 = \begin{pmatrix} -5 \\ 7 \\ -6 \end{pmatrix}dH1=W2TdZ2=−57−6
3. 追责第一层 (W1W_1W1)
- 过阀门:
dZ1=dH1⊙Mask1=(−57−6)⊙(010)=(070)dZ_1 = dH_1 \odot Mask_1 = \begin{pmatrix} -5 \\ 7 \\ -6 \end{pmatrix} \odot \begin{pmatrix} 0 \\ 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 0 \\ 7 \\ 0 \end{pmatrix}dZ1=dH1⊙Mask1=−57−6⊙010=070
- W1W_1W1 梯度:
dW1=dZ1⋅XT=(070)(121)=(0007147000)dW_1 = dZ_1 \cdot X^T = \begin{pmatrix} 0 \\ 7 \\ 0 \end{pmatrix} \begin{pmatrix} 1 & 2 & 1 \end{pmatrix} = \begin{pmatrix} 0 & 0 & 0 \\ 7 & 14 & 7 \\ 0 & 0 & 0 \end{pmatrix}dW1=dZ1⋅XT=070(121)=0700140070
(第一层前面是输入数据 XXX,不需要再把误差往前传了,追责结束)
五、 全局订正:温和更新权重
现在所有权重的梯度(建议修改量)都拿到了。我们使用公式:Wnew=Wold−αdWW_{new} = W_{old} - \alpha dWWnew=Wold−αdW 进行一次性全局更新。因为此时学习率设置为0.01,我们的参数更新变得非常温和,避免了把参数一步改到崩溃。
W3,new=W3−0.01×dW3=(1.060.0600.04−0.9600.920.921)W_{3,new} = W_3 - 0.01 \times dW_3 = \begin{pmatrix} 1.06 & 0.06 & 0 \\ 0.04 & -0.96 & 0 \\ 0.92 & 0.92 & 1 \end{pmatrix}W3,new=W3−0.01×dW3=1.060.040.920.06−0.960.92001
W2,new=W2−0.01×dW2=(10.980−10.88−1001)W_{2,new} = W_2 - 0.01 \times dW_2 = \begin{pmatrix} 1 & 0.98 & 0 \\ -1 & 0.88 & -1 \\ 0 & 0 & 1 \end{pmatrix}W2,new=W2−0.01×dW2=1−100.980.8800−11
W1,new=W1−0.01×dW1=(10−1−0.070.86−0.07−101)W_{1,new} = W_1 - 0.01 \times dW_1 = \begin{pmatrix} 1 & 0 & -1 \\ -0.07 & 0.86 & -0.07 \\ -1 & 0 & 1 \end{pmatrix}W1,new=W1−0.01×dW1=1−0.07−100.860−1−0.071
至此,一步完整的 loss.backward() 和 optimizer.step() 就在纸上运行完毕了。
六、 未来训练推演
目标答案为 T=(500)T = \begin{pmatrix} 5 \\ 0 \\ 0 \end{pmatrix}T=500,如果用代码继续循环跑这个网络,未来预测结果的变化趋势如下:
-
第 1 轮 (Epoch 1 结束)
-
预测结果:
[ 2.00, -2.00, 4.00 ] -
当前误差 (Loss):14.50
-
第 2 轮 (Epoch 2)
-
预测结果:
[ 1.72, -1.27, 2.70 ] -
当前误差 (Loss):9.82 (平稳下降,神经元存活)
-
第 3 轮 (Epoch 3)
-
预测结果:
[ 1.88, -0.63, 1.83 ] -
当前误差 (Loss):6.73
-
第 10 轮 (Epoch 10)
-
预测结果:
[ 3.85, -0.05, 0.32 ] -
当前误差 (Loss):0.71
-
第 50 轮 (Epoch 50)
-
预测结果:
[ 4.96, -0.01, 0.02 ] -
当前误差 (Loss):0.001 (已经极其逼近真实答案)
-
第 100 轮 (Epoch 100)
-
预测结果:
[ 5.00, 0.00, 0.00 ] -
当前误差 (Loss):0.0000 (完全拟合目标)

2362

被折叠的 条评论
为什么被折叠?



