文章目录
-
- 实验设置与数据定义
- 第一部分:前向传播详细计算
-
- [1. 卷积层计算](#1. 卷积层计算)
- [2. ReLU激活函数](#2. ReLU激活函数)
- [3. 最大池化层 (2×2窗口,步长=2)](#3. 最大池化层 (2×2窗口,步长=2))
- [4. 展平层](#4. 展平层)
- [5. 全连接层 (假设连接到2个输出神经元)](#5. 全连接层 (假设连接到2个输出神经元))
- [6. Softmax输出层](#6. Softmax输出层)
- 第二部分:反向传播计算逻辑
-
- [1. 损失函数 (交叉熵损失)](#1. 损失函数 (交叉熵损失))
- [2. Softmax层反向传播](#2. Softmax层反向传播)
- [3. 全连接层反向传播](#3. 全连接层反向传播)
- [4. 展平层反向传播](#4. 展平层反向传播)
- [5. 最大池化层反向传播](#5. 最大池化层反向传播)
- [6. ReLU层反向传播](#6. ReLU层反向传播)
- [7. 卷积层反向传播](#7. 卷积层反向传播)
- 第三部分:神经元视角计算逻辑
- 第四部分:关键公式总结表
- 第五部分:参数更新示例
- 第六部分:计算复杂度分析
- 第七部分:可视化理解
- 关键点总结
实验设置与数据定义
输入数据 (7×7 单通道)
假设输入为单通道7×7矩阵,无填充,步长=1:
X = [
[1, 2, 3, 4, 5, 6, 7],
[8, 9, 10, 11, 12, 13, 14],
[15, 16, 17, 18, 19, 20, 21],
[22, 23, 24, 25, 26, 27, 28],
[29, 30, 31, 32, 33, 34, 35],
[36, 37, 38, 39, 40, 41, 42],
[43, 44, 45, 46, 47, 48, 49]
]
输入形状:(1, 7, 7) = (通道数, 高度, 宽度)
卷积核定义 (3个3×3核)
K1 = [[1, 0, -1], # 垂直边缘检测
[1, 0, -1],
[1, 0, -1]]
K2 = [[1, 1, 1], # 水平边缘检测
[0, 0, 0],
[-1, -1, -1]]
K3 = [[0, -1, 0], # 锐化效果
[-1, 5, -1],
[0, -1, 0]]
偏置:b1 = 0.1, b2 = 0.2, b3 = 0.3
第一部分:前向传播详细计算
1. 卷积层计算
卷积输出尺寸公式:输出尺寸 = ⌊(输入尺寸 - 核尺寸)/步长⌋ + 1 = ⌊(7-3)/1⌋ + 1 = 5
输出形状:(3, 5, 5) = (卷积核数, 高度, 宽度)
卷积核K1计算示例 (第1个输出神经元)
输入窗口位置(0,0):X[0:3, 0:3]与K1点积
窗口 = [[1, 2, 3],
[8, 9, 10],
[15, 16, 17]]
计算:1×1 + 2×0 + 3×(-1) + 8×1 + 9×0 + 10×(-1) + 15×1 + 16×0 + 17×(-1) + b1
= 1 - 3 + 8 - 10 + 15 - 17 + 0.1
= -5.9
K1完整输出特征图 (5×5)
C1 = [
[-5.9, -5.9, -5.9, -5.9, -5.9],
[-5.9, -5.9, -5.9, -5.9, -5.9],
[-5.9, -5.9, -5.9, -5.9, -5.9],
[-5.9, -5.9, -5.9, -5.9, -5.9],
[-5.9, -5.9, -5.9, -5.9, -5.9]
]
注意:实际不同位置值不同,这里为简化显示为相同
三个卷积核完整输出
C1 = [...] # 5×5 来自K1
C2 = [...] # 5×5 来自K2
C3 = [...] # 5×5 来自K3
2. ReLU激活函数
ReLU(x) = max(0, x)
假设C1的(0,0)位置值为-5.9,则:
A1 = ReLU(C1) = max(0, -5.9) = 0
对所有位置应用ReLU:
A1 = ReLU(C1) # 5×5
A2 = ReLU(C2) # 5×5
A3 = ReLU(C3) # 5×5
3. 最大池化层 (2×2窗口,步长=2)
池化输出尺寸:⌊(5-2)/2⌋ + 1 = 2
输出形状:(3, 2, 2) = (特征图数, 高度, 宽度)
池化计算示例 (A1的左上2×2区域)
假设A1左上4个值:
[[0, 3.2],
[1.5, 2.1]]
最大池化:max(0, 3.2, 1.5, 2.1) = 3.2
池化后三个特征图
P1 = [[3.2, 4.1], # 来自A1
[2.8, 3.9]]
P2 = [[1.5, 2.3], # 来自A2
[0.9, 1.8]]
P3 = [[5.6, 4.7], # 来自A3
[6.2, 5.1]]
4. 展平层
将(3, 2, 2)展平为12维向量:
Flatten = [3.2, 4.1, 2.8, 3.9, 1.5, 2.3, 0.9, 1.8, 5.6, 4.7, 6.2, 5.1]
5. 全连接层 (假设连接到2个输出神经元)
权重矩阵W (12×2) 和偏置b (2):
W = [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6], [0.7, 0.8],
[0.9, 1.0], [1.1, 1.2], [1.3, 1.4], [1.5, 1.6],
[1.7, 1.8], [1.9, 2.0], [2.1, 2.2], [2.3, 2.4]]
b = [0.5, 0.6]
计算第1个输出神经元:
z1 = 3.2×0.1 + 4.1×0.3 + 2.8×0.5 + 3.9×0.7 +
1.5×0.9 + 2.3×1.1 + 0.9×1.3 + 1.8×1.5 +
5.6×1.7 + 4.7×1.9 + 6.2×2.1 + 5.1×2.3 + 0.5
= 0.32 + 1.23 + 1.4 + 2.73 + 1.35 + 2.53 + 1.17 + 2.7 + 9.52 + 8.93 + 13.02 + 11.73 + 0.5
= 57.33
计算第2个输出神经元:
z2 = 3.2×0.2 + 4.1×0.4 + 2.8×0.6 + 3.9×0.8 +
1.5×1.0 + 2.3×1.2 + 0.9×1.4 + 1.8×1.6 +
5.6×1.8 + 4.7×2.0 + 6.2×2.2 + 5.1×2.4 + 0.6
= 0.64 + 1.64 + 1.68 + 3.12 + 1.5 + 2.76 + 1.26 + 2.88 + 10.08 + 9.4 + 13.64 + 12.24 + 0.6
= 61.44
全连接层输出:Z = [57.33, 61.44]
6. Softmax输出层
计算概率:
exp_z1 = exp(57.33) ≈ 8.2e24
exp_z2 = exp(61.44) ≈ 4.6e26
sum_exp = 8.2e24 + 4.6e26 ≈ 4.682e26
P1 = 8.2e24 / 4.682e26 ≈ 0.0175 (1.75%)
P2 = 4.6e26 / 4.682e26 ≈ 0.9825 (98.25%)
最终输出:[0.0175, 0.9825],预测为第2类
第二部分:反向传播计算逻辑
1. 损失函数 (交叉熵损失)
假设真实标签y=1 (第2类),预测概率P=[0.0175, 0.9825]
损失函数: L = − Σ y i ⋅ l o g ( P i ) L = -Σ y_i·log(P_i) L=−Σyi⋅log(Pi)
L = -[0×log(0.0175) + 1×log(0.9825)]
= -log(0.9825)
≈ 0.0177
2. Softmax层反向传播
Softmax梯度公式: ∂ L / ∂ z i = P i − y i ∂L/∂z_i = P_i - y_i ∂L/∂zi=Pi−yi
对于i=1 (第1类):
∂ L / ∂ z 1 = P 1 − y 1 = 0.0175 − 0 = 0.0175 ∂L/∂z1 = P1 - y1 = 0.0175 - 0 = 0.0175 ∂L/∂z1=P1−y1=0.0175−0=0.0175
对于i=2 (第2类):
∂ L / ∂ z 2 = P 2 − y 2 = 0.9825 − 1 = − 0.0175 ∂L/∂z2 = P2 - y2 = 0.9825 - 1 = -0.0175 ∂L/∂z2=P2−y2=0.9825−1=−0.0175
Softmax层梯度: ∇ z = [ 0.0175 , − 0.0175 ] ∇_z = [0.0175, -0.0175] ∇z=[0.0175,−0.0175]
3. 全连接层反向传播
权重梯度计算
公式: ∂ L / ∂ W i j = ( ∂ L / ∂ z j ) × a i ∂L/∂W_ij = (∂L/∂z_j) × a_i ∂L/∂Wij=(∂L/∂zj)×ai (其中a_i是输入到全连接层的第i个神经元)
对于W[0,1] (连接展平层第1个神经元到输出第2个神经元):
∂ L / ∂ W [ 0 , 1 ] = ( ∂ L / ∂ z 2 ) × f l a t t e n [ 0 ] = ( − 0.0175 ) × 3.2 = − 0.056 ∂L/∂W[0,1] = (∂L/∂z2) × flatten[0] = (-0.0175) × 3.2 = -0.056 ∂L/∂W[0,1]=(∂L/∂z2)×flatten[0]=(−0.0175)×3.2=−0.056
偏置梯度计算
公式: ∂ L / ∂ b j = ∂ L / ∂ z j ∂L/∂b_j = ∂L/∂z_j ∂L/∂bj=∂L/∂zj
∂ L / ∂ b 1 = ∂ L / ∂ z 1 = 0.0175 ∂L/∂b1 = ∂L/∂z1 = 0.0175 ∂L/∂b1=∂L/∂z1=0.0175
∂ L / ∂ b 2 = ∂ L / ∂ z 2 = − 0.0175 ∂L/∂b2 = ∂L/∂z2 = -0.0175 ∂L/∂b2=∂L/∂z2=−0.0175
输入梯度(传递到前一层)
公式: ∂ L / ∂ a i = Σ j ( ∂ L / ∂ z j ) × W i j ∂L/∂a_i = Σ_j (∂L/∂z_j) × W_ij ∂L/∂ai=Σj(∂L/∂zj)×Wij
对于展平层第1个神经元:
∂ L / ∂ f l a t t e n [ 0 ] = ( ∂ L / ∂ z 1 ) × W [ 0 , 0 ] + ( ∂ L / ∂ z 2 ) × W [ 0 , 1 ] ∂L/∂flatten[0] = (∂L/∂z1)×W[0,0] + (∂L/∂z2)×W[0,1] ∂L/∂flatten[0]=(∂L/∂z1)×W[0,0]+(∂L/∂z2)×W[0,1]
= 0.0175 × 0.1 + ( − 0.0175 ) × 0.2 = 0.0175×0.1 + (-0.0175)×0.2 =0.0175×0.1+(−0.0175)×0.2
= 0.00175 − 0.0035 = 0.00175 - 0.0035 =0.00175−0.0035
= − 0.00175 = -0.00175 =−0.00175
4. 展平层反向传播
将12维梯度向量reshape为(3, 2, 2):
∇ P 1 = [ [ − 0.00175 , . . . ] , . . . ] ∇_P1 = [[-0.00175, ...], ...] ∇P1=[[−0.00175,...],...] # 2×2
∇ P 2 = [ [ . . . ] , . . . ] ∇_P2 = [[...], ...] ∇P2=[[...],...] # 2×2
∇ P 3 = [ [ . . . ] , . . . ] ∇_P3 = [[...], ...] ∇P3=[[...],...] # 2×2
5. 最大池化层反向传播
关键原则:梯度仅传递到前向传播中最大值所在位置
假设前向传播中,P1[0,0]=3.2来自A1的(0,0)位置,则:
∂ L / ∂ A 1 [ 0 , 0 ] = ∂ L / ∂ P 1 [ 0 , 0 ] = − 0.00175 ∂L/∂A1[0,0] = ∂L/∂P1[0,0] = -0.00175 ∂L/∂A1[0,0]=∂L/∂P1[0,0]=−0.00175
∂ L / ∂ A 1 [ 其他非最大值位置 ] = 0 ∂L/∂A1[其他非最大值位置] = 0 ∂L/∂A1[其他非最大值位置]=0
6. ReLU层反向传播
公式: ∂ L / ∂ C i = ∂ L / ∂ A i × I ( A i > 0 ) ∂L/∂C_i = ∂L/∂A_i × I(A_i > 0) ∂L/∂Ci=∂L/∂Ai×I(Ai>0) (其中I是指示函数)
假设A1[0,0] = ReLU(C1[0,0]) = 0,则:
∂ L / ∂ C 1 [ 0 , 0 ] = ∂ L / ∂ A 1 [ 0 , 0 ] × I ( 0 > 0 ) ∂L/∂C1[0,0] = ∂L/∂A1[0,0] × I(0 > 0) ∂L/∂C1[0,0]=∂L/∂A1[0,0]×I(0>0)
= − 0.00175 × 0 = -0.00175 × 0 =−0.00175×0
= 0 = 0 =0
假设A1[0,1] = ReLU(C1[0,1]) = 3.2 > 0,则:
∂ L / ∂ C 1 [ 0 , 1 ] = ∂ L / ∂ A 1 [ 0 , 1 ] × I ( 3.2 > 0 ) ∂L/∂C1[0,1] = ∂L/∂A1[0,1] × I(3.2 > 0) ∂L/∂C1[0,1]=∂L/∂A1[0,1]×I(3.2>0)
= [ 对应梯度 ] × 1 = [对应梯度] × 1 =[对应梯度]×1
7. 卷积层反向传播
卷积核梯度计算
公式: ∂ L / ∂ K = 卷积操作 ( 输入 X , 输出梯度 ∂ L / ∂ C ) ∂L/∂K = 卷积操作(输入X, 输出梯度∂L/∂C) ∂L/∂K=卷积操作(输入X,输出梯度∂L/∂C)
对于K1的权重K1[0,0]:
∂ L / ∂ K 1 [ 0 , 0 ] = Σ i Σ j X [ i : i + 3 , j : j + 3 ] [ 0 , 0 ] × ∂ L / ∂ C 1 [ i , j ] ∂L/∂K1[0,0] = Σ_i Σ_j X[i:i+3, j:j+3][0,0] × ∂L/∂C1[i,j] ∂L/∂K1[0,0]=ΣiΣjX[i:i+3,j:j+3][0,0]×∂L/∂C1[i,j]
输入梯度(如需要)
公式: ∂ L / ∂ X = 全卷积 ( 180 度旋转的 K , ∂ L / ∂ C ) ∂L/∂X = 全卷积(180度旋转的K, ∂L/∂C) ∂L/∂X=全卷积(180度旋转的K,∂L/∂C)(带填充)
第三部分:神经元视角计算逻辑
卷积层神经元
每个输出特征图的每个位置对应一个神经元:
- 感受野:输入图像的3×3区域
- 连接权重:卷积核的9个权重+1个偏置
- 计算 : z = Σ ( w i × x i ) + b z = Σ(w_i × x_i) + b z=Σ(wi×xi)+b
池化层神经元
每个输出位置对应一个神经元:
- 连接:来自前一层2×2区域的4个神经元
- 计算 : 输出 = m a x ( 输入 1 , 输入 2 , 输入 3 , 输入 4 ) 输出 = max(输入1, 输入2, 输入3, 输入4) 输出=max(输入1,输入2,输入3,输入4)
- 无参数学习
全连接层神经元
与传统神经元相同:
- 连接:与前一层所有神经元连接
- 计算 : z = Σ ( w i × a i ) + b z = Σ(w_i × a_i) + b z=Σ(wi×ai)+b
第四部分:关键公式总结表
| 层类型 | 前向传播公式 | 反向传播梯度公式 |
|---|---|---|
| 卷积层 | C = X ⊛ K + b C = X ⊛ K + b C=X⊛K+b | ∂ L / ∂ K = X ⊛ ∂ L / ∂ C ∂L/∂K = X ⊛ ∂L/∂C ∂L/∂K=X⊛∂L/∂C ∂ L / ∂ X = r o t 180 ( K ) ⊛ ∂ L / ∂ C ∂L/∂X = rot180(K) ⊛ ∂L/∂C ∂L/∂X=rot180(K)⊛∂L/∂C |
| ReLU | A = m a x ( 0 , C ) A = max(0, C) A=max(0,C) | ∂ L / ∂ C = ∂ L / ∂ A × I ( C > 0 ) ∂L/∂C = ∂L/∂A × I(C>0) ∂L/∂C=∂L/∂A×I(C>0) |
| 最大池化 | P = m a x ( 区域 ) P = max(区域) P=max(区域) | ∂ L / ∂ A i = ∂ L / ∂ P j ( 如果 A i 是最大值 ) ∂L/∂A_i = ∂L/∂P_j (如果A_i是最大值) ∂L/∂Ai=∂L/∂Pj(如果Ai是最大值) |
| 全连接 | Z = W ⋅ A + b Z = W·A + b Z=W⋅A+b | ∂ L / ∂ W = A ⋅ ( ∂ L / ∂ Z ) T ∂L/∂W = A·(∂L/∂Z)^T ∂L/∂W=A⋅(∂L/∂Z)T ∂ L / ∂ b = ∂ L / ∂ Z ∂L/∂b = ∂L/∂Z ∂L/∂b=∂L/∂Z ∂ L / ∂ A = W T ⋅ ∂ L / ∂ Z ∂L/∂A = W^T·∂L/∂Z ∂L/∂A=WT⋅∂L/∂Z |
| Softmax | P i = e z i / Σ e z j P_i = e^{z_i}/Σe^{z_j} Pi=ezi/Σezj | ∂ L / ∂ z i = P i − y i ∂L/∂z_i = P_i - y_i ∂L/∂zi=Pi−yi |
第五部分:参数更新示例
使用梯度下降法更新参数(学习率α=0.01):
更新全连接层权重W[0,1]:
W n e w [ 0 , 1 ] = W o l d [ 0 , 1 ] − α × ∂ L / ∂ W [ 0 , 1 ] W_new[0,1] = W_old[0,1] - α × ∂L/∂W[0,1] Wnew[0,1]=Wold[0,1]−α×∂L/∂W[0,1]
= 0.2 − 0.01 × ( − 0.056 ) = 0.2 - 0.01 × (-0.056) =0.2−0.01×(−0.056)
= 0.2 + 0.00056 = 0.2 + 0.00056 =0.2+0.00056
= 0.20056 = 0.20056 =0.20056
更新卷积核K1[0,0]:
假设计算得 ∂ L / ∂ K 1 [ 0 , 0 ] = 0.003 ∂L/∂K1[0,0] = 0.003 ∂L/∂K1[0,0]=0.003
K 1 n e w [ 0 , 0 ] = K 1 o l d [ 0 , 0 ] − α × ∂ L / ∂ K 1 [ 0 , 0 ] K1_new[0,0] = K1_old[0,0] - α × ∂L/∂K1[0,0] K1new[0,0]=K1old[0,0]−α×∂L/∂K1[0,0]
= 1 − 0.01 × 0.003 = 1 - 0.01 × 0.003 =1−0.01×0.003
= 1 − 0.00003 = 1 - 0.00003 =1−0.00003
= 0.99997 = 0.99997 =0.99997
第六部分:计算复杂度分析
| 操作 | 计算量 (本例) | 大O表示法 |
|---|---|---|
| 卷积层前向 | 3×(5×5)×(3×3) = 675次乘加 | O ( K 2 × M 2 × C i n × C o u t ) O(K²×M²×C_in×C_out) O(K2×M2×Cin×Cout) |
| 池化层前向 | 3×(2×2)×4次比较 = 48次比较 | O ( C × H o u t × W o u t × k 2 ) O(C×H_out×W_out×k²) O(C×Hout×Wout×k2) |
| 全连接前向 | 12×2 = 24次乘加 | O ( N i n × N o u t ) O(N_in×N_out) O(Nin×Nout) |
| Softmax前向 | 2次exp + 1次求和 + 2次除法 | O ( N c l a s s e s ) O(N_classes) O(Nclasses) |
| 反向传播 | 约2-3倍前向计算量 | O ( 前向计算量 ) O(前向计算量) O(前向计算量) |
注:K=卷积核尺寸,M=输出尺寸,C=通道数,N=神经元数
第七部分:可视化理解
前向传播数据流:
输入X(7×7)
→ [卷积K1] → C1(5×5) → [ReLU] → A1(5×5) → [最大池化] → P1(2×2)
→ [卷积K2] → C2(5×5) → [ReLU] → A2(5×5) → [最大池化] → P2(2×2)
→ [卷积K3] → C3(5×5) → [ReLU] → A3(5×5) → [最大池化] → P3(2×2)
→ [展平] → 向量(12) → [全连接] → Z(2) → [Softmax] → 概率(2)
反向传播梯度流:
损失L ← 概率(2) ← [Softmax梯度] ← Z(2) ← [全连接梯度] ← 向量(12)
← [reshape] ← (P1,P2,P3梯度) ← [池化梯度] ← (A1,A2,A3梯度)
← [ReLU梯度] ← (C1,C2,C3梯度) ← [卷积梯度] ← 输入X梯度
关键点总结
- 卷积层:通过局部连接和权值共享提取空间特征
- 池化层:降低空间分辨率,增强平移不变性
- 全连接层:整合所有特征进行最终分类
- 前向传播:数据从输入流向输出,计算预测值
- 反向传播:梯度从损失函数反向流动,计算参数更新量
- 计算核心:链式法则 + 各层特定的梯度公式