【深度学习】极简手算:三层神经网络的前向与反向传播

把神经网络看作一个做题机器,整个训练过程就是:做题(前向传播) →\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 YXW1ReLUW2ReLUW3Y
  • 初始权重

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=101010101,W2=110110011,W3=101011001


二、 前向传播:模型先做一遍题

前向传播的公式就是:矩阵相乘 →\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=W1X=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=W2H1=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=W3H2=1(2)+0(2)+0(0)0(2)1(2)+0(0)1(2)+1(2)+1(0)=224


三、 对答案:计算误差信号

直接用预测值减去真实值,得到输出层的误差梯度(这是反向传播的源头):

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=YT=224500=324

如果计算当前损失值(平方误差的一半):

L=14.5L = 14.5L=14.5


四、 反向传播:追查各层责任

反向传播听起来高深,其实在每一层只重复干三件事(反向传播三板斧):

  1. 过阀门 (ReLU)

dZ=dH⊙MaskdZ = dH \odot MaskdZ=dHMask

(前向没激活的神经元,反向不参与分锅,梯度清零)。
2. 算权重梯度

dW=dZ⋅InputTdW = dZ \cdot Input^TdW=dZInputT

(当前误差 ×\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=dYH2T=324(220)=648648000

  • 误差回传

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=dH2Mask2=164110=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=dZ2H1T=160(020)=0002120000

  • 误差回传

dH1=W2TdZ2=(−57−6)dH_1 = W_2^T dZ_2 = \begin{pmatrix} -5 \\ 7 \\ -6 \end{pmatrix}dH1=W2TdZ2=576

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=dH1Mask1=576010=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=dZ1XT=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=W30.01×dW3=1.060.040.920.060.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=W20.01×dW2=1100.980.880011

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=W10.01×dW1=10.07100.86010.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 (完全拟合目标)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

维吉斯蔡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值