卷积convolution函数详解及反向传播中的梯度求导

本文深入探讨卷积概念,详细定义了卷积运算,并重点解析了反向传播过程中,误差值对输入X、权重W和偏置b的梯度推导,包括无重叠、行重叠、列重叠和行列重叠四种情况。同时,提供了编程实现的简化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要

本文给出 convolution 函数的定义, 并求解其在反向传播中的梯度

相关

配套代码, 请参考文章 :

Python和PyTorch对比实现卷积convolution函数及反向传播

系列文章索引 :
https://blog.youkuaiyun.com/oBrightLamp/article/details/85067981

正文

1. 概念

灰度图片单通道卷积 :
在这里插入图片描述
图片来源 : https://github.com/vdumoulin/conv_arithmetic

RGB图片三通道分别卷积, 将三个实数值结果相加 :
在这里插入图片描述
图片来源 : http://cs231n.github.io/convolutional-networks/

关于卷积的概念, 网络上已经有大量的详细资料, 都讲的很好, 这里就不再赘述了.

2. 卷积的定义

本文约定矩阵元素的脚标从 0 开始.

当 X 为 m x n 矩阵, W 为 2 x 2 矩阵, 步长为 1 时 :
y i j = ∑ i = 0 m − 2 ∑ j = 0 n − 2 ( x i , j w 00 + x i , j + 1 w 01 + x i + 1 , j w 10 + x i + 1 , j + 1 w 11 ) + b    i ⩽ m − 2    j ⩽ n − 2 y_{ij} = \sum_{i=0}^{m-2}\sum_{j=0}^{n-2}(x_{i,j}w_{00} + x_{i,j+1}w_{01}+x_{i+1,j}w_{10} + x_{i+1,j+1}w_{11}) + b\\ \;\\ i\leqslant m-2 \\ \;\\ j\leqslant n-2 \\ yij=i=0m2j=0n2(xi,jw00+xi,j+1w01+xi+1,jw10+xi+1,j+1w11)+bim2jn2
当 X 为 m x n 矩阵, W 为 p x q 矩阵, 步长为 1 时 :
y i j = ∑ r = 0 p − 1 ∑ s = 0 q − 1 x i + r , j + s w r s + b    i ⩽ m − p    j ⩽ n − q y_{ij} =\sum_{r=0}^{p-1}\sum_{s=0}^{q-1}x_{i+r,j+s}w_{rs}+ b\\ \;\\ i\leqslant m-p\\ \;\\ j\leqslant n-q\\ yij=r=0p1s=0q1xi+r,j+swrs+bimpjnq
当 W 为 p x q 矩阵, 步长为 t, 为保证整除, 填充后的 X 是 m x n 矩阵时 :
y i j = ∑ r = 0 p − 1 ∑ s = 0 q − 1 x i ⋅ t + r , j ⋅ t + s w r s + b    i ⩽ ( m − p ) / t    j ⩽ ( n − q ) / t y_{ij} = \sum_{r=0}^{p-1}\sum_{s=0}^{q-1}x_{i\cdot t+r,j\cdot t+s}w_{rs}+b\\ \;\\ i\leqslant (m-p)/t\\ \;\\ j\leqslant (n-q)/t\\ yij=r=0p1s=0q1xit+r,jt+swrs+bi(mp)/tj(nq)/t

偏置 b 为标量.

3. 反向传播

3.1 误差值对 X 的梯度的理论推导

当 W 为 p x q 矩阵, 步长为 t, 为保证整除, 填充后的 X 是 m x n 矩阵, 经 conv 卷积得到矩阵 g x h 矩阵 Y, 往前 forward 传播得到误差值 error (标量 e ). 上游的误差梯度向量 ∇ e ( Y ) \nabla e_{(Y)} e(Y) 已在反向传播时得到, 求 e 对 X 的梯度.

已知 :
y i j = ∑ r = 0 p − 1 ∑ s = 0 q − 1 x i ⋅ t + r ,    j ⋅ t + s w r s + b    i ⩽ ( m − p ) / t    j ⩽ ( n − q ) / t y_{ij} = \sum_{r=0}^{p-1}\sum_{s=0}^{q-1}x_{i\cdot t+r,\;j\cdot t+s}w_{rs}+b\\ \;\\ i\leqslant (m-p)/t\\ \;\\ j\leqslant (n-q)/t\\ yij=r=0p1s=0q1xit+r,

<think>我们正在讨论卷积神经网络(CNN)的正向传播和反向传播过程。根据引用内容,我们可以逐步构建解释。 首先,CNN的正向传播包括多个层次:卷积层、非线性激活函数(如ReLU)、池化层(如最大池化或平均池化)、全连接层以及最后的Softmax分类层。反向传播则是通过链式法则计算梯度并更新参数。 ### 正向传播 1. **卷积层(Convolution)**: - 输入: 图像或上一层的特征图,尺寸为$H_{in} \times W_{in} \times C_{in}$(高度、宽度、通道数)。 - 卷积操作: 使用多个卷积核(滤波器)进行局部连接操作。每个卷积核在输入上滑动,计算局部区域的点积并加上偏置。 - 输出: 特征图,尺寸为$H_{out} \times W_{out} \times C_{out}$,其中$C_{out}$是卷积核的数量。 - 计算公式: $$Z^{[l]} = A^{[l-1]} * W^{[l]} + b^{[l]}$$ 其中$*$表示卷积操作,$A^{[l-1]}$是上一层的激活值,$W^{[l]}$和$b^{[l]}$是当前层的权重和偏置。 2. **非线性激活(ReLU)**: - 应用ReLU函数: $A^{[l]} = \max(0, Z^{[l]})$,增加非线性。 3. **池化层(Pooling)**: - 目的: 降维,减少计算量,增强特征不变性。 - 最大池化: 取局部区域的最大值。 - 平均池化: 取局部区域的平均值。 - 输出尺寸会按池化窗口大小和步长缩小。 4. **全连接层(Fully-Connected)**: - 将池化后的特征图展平成一维向量,然后通过全连接层。 - 计算公式: $Z^{[l]} = W^{[l]} A^{[l-1]} + b^{[l]}$,再经过激活函数。 5. **Softmax与交叉熵损失**: - 最后一层通常用Softmax函数将输出转换为概率分布: $$\hat{y}_i = \frac{e^{z_i}}{\sum_{j} e^{z_j}}$$ - 交叉熵损失函数: $$\mathcal{L}(\hat{y}, y) = -\sum_{i} y_i \log(\hat{y}_i)$$ ### 反向传播 反向传播的目标是计算损失函数对每一层参数的梯度,以便用梯度下降法更新参数。核心是链式求导。 1. **Softmax层梯度**: - 损失对Softmax输入的梯度: $$\frac{\partial \mathcal{L}}{\partial z_i} = \hat{y}_i - y_i$$ 2. **全连接层梯度**: - 假设全连接层后接Softmax,则其输入$Z^{[l]}$的梯度$\delta^{[l]}$由上一层梯度反向传播得到。 - 权重梯度: $$\frac{\partial \mathcal{L}}{\partial W^{[l]}} = (\delta^{[l]})^T A^{[l-1]}$$ - 偏置梯度: $$\frac{\partial \mathcal{L}}{\partial b^{[l]}} = \delta^{[l]}$$ 3. **卷积梯度**: - 引用[4]中的代码展示了卷积反向传播的实现。设当前层输出梯度为$dZ^{[l]}$(即下一层传回的梯度),则: - 输入梯度$dA^{[l-1]}$: 通过将$dZ^{[l]}$与卷积核$W^{[l]}$进行全卷积(并填充)得到。 - 权重梯度$dW^{[l]}$: 通过将输入$A^{[l-1]}$与$dZ^{[l]}$进行局部卷积得到。 - 偏置梯度$db^{[l]}$: 对$dZ^{[l]}$的每个通道求和。 - 具体公式参考代码注释。 4. **池化层梯度**: - **最大池化**: 梯度回传到前一层时,只传递给前向传播时最大值所在的位置,其他位置为0。 - **平均池化**: 梯度均匀分布到前一层对应窗口的所有位置。 ### 实现细节 - **卷积反向传播**(引用[4]代码): - 输入: `dz`(当前层输出梯度),`cache`(存储前向传播的输入、权重、偏置和超参数)。 - 输出: `da_input`(输入梯度),`dw`(权重梯度),`db`(偏置梯度)。 - 过程: - 遍历每个样本、每个输出位置(高度和宽度)、每个输出通道。 - 定位到输入图像的局部区域(slice)。 - 更新输入梯度:`da_temp`在对应slice位置加上$w \times dz$。 - 更新权重梯度:`dw`在对应通道加上输入slice乘以当前`dz`。 - 更新偏置梯度:`db`在对应通道加上当前`dz`。 ### 总结 CNN通过卷积层提取空间特征,池化层降低维度,全连接层进行分类。反向传播利用链式法则逐层计算梯度,更新参数。具体实现中,卷积层的反向传播需要仔细处理局部连接和参数共享的特性。 §§相关问题§§ 1. 卷积神经网络中卷积反向传播的具体数学推导是什么? 2. 池化层在反向传播中如何处理梯度? 3. 如何优化卷积神经网络的训练过程? 4. CNN中常用的正则化方法有哪些? 5. 卷积神经网络在图像识别任务中为什么比全连接网络更有效?</think>### 卷积神经网络(CNN)的正向传播与反向传播详解 #### **一、正向传播过程** 正向传播通过多层结构提取输入数据的特征,最终输出预测结果。流程如下: 1. **卷积层(Convolution)** - **输入**:图像或特征图(尺寸 $H \times W \times C$) - **操作**: - 卷积核(尺寸 $F \times F \times C$)在输入上滑动,计算局部区域的点积: $$Z_{x,y}^{[l]} = \sum_{i=1}^F \sum_{j=1}^F \sum_{k=1}^C W_{i,j,k}^{[l]} \cdot A_{x+i-1,y+j-1,k}^{[l-1]} + b^{[l]}$$ - 输出特征图尺寸由步长(`stride`)和填充(`pad`)决定: $$H_{\text{out}} = \left\lfloor \frac{H_{\text{in}} - F + 2\text{pad}}{\text{stride}} \right\rfloor + 1$$ - **输出**:特征图(尺寸 $H_{\text{out}} \times W_{\text{out}} \times N$,$N$ 为卷积核数量)[^2][^3]。 2. **非线性激活(ReLU)** - 引入非线性:$A^{[l]} = \max(0, Z^{[l]})$,保留正值,抑制负值[^2]。 3. **池化层(Pooling)** - **最大池化**:取局部区域最大值,保留显著特征。 - **平均池化**:取局部区域平均值,平滑特征。 - 输出尺寸缩减,例如 $2\times2$ 池化使尺寸减半[^3][^5]。 4. **全连接层(Fully-Connected)** - 将池化后的特征展平为一维向量,通过权重矩阵计算: $$Z^{[l]} = W^{[l]} A^{[l-1]} + b^{[l]}$$ - 输出送入 Softmax 层分类[^2]。 5. **Softmax 与损失计算** - Softmax 输出概率分布:$\hat{y}_i = \frac{e^{z_i}}{\sum_j e^{z_j}}$ - 交叉熵损失:$\mathcal{L} = -\sum_i y_i \log(\hat{y}_i)$[^2]。 --- #### **二、反向传播过程** 反向传播通过链式法则计算梯度,从输出层向输入层逐层更新参数: 1. **Softmax 与全连接层梯度** - Softmax 输入梯度:$\frac{\partial \mathcal{L}}{\partial z_i} = \hat{y}_i - y_i$ - 全连接层参数梯度: $$\frac{\partial \mathcal{L}}{\partial W^{[l]}} = (\delta^{[l]})^T A^{[l-1]}, \quad \frac{\partial \mathcal{L}}{\partial b^{[l]}} = \delta^{[l]}$$ 其中 $\delta^{[l]} = \frac{\partial \mathcal{L}}{\partial Z^{[l]}}$ 为上层回传梯度[^2][^4]。 2. **池化层梯度** - **最大池化**:梯度仅回传到前向传播中最大值的位置,其他位置为 0。 - **平均池化**:梯度均匀分配到前向传播的局部区域所有位置[^5]。 3. **卷积梯度** 设当前层输出梯度为 $dZ$,输入梯度 $dA_{\text{in}}$、卷积梯度 $dW$、偏置梯度 $db$ 计算如下: ```python def conv_backward(dZ, cache): A_in, W, b, hparams = cache # 前向传播缓存 stride, pad = hparams['stride'], hparams['pad'] dA_in = np.zeros_like(A_in) dW = np.zeros_like(W) db = np.zeros_like(b) for i in range(m): # 遍历样本 for h in range(H_out): # 遍历输出高度 for w in range(W_out): # 遍历输出宽度 for c in range(C): # 遍历输出通道 # 定位输入局部区域 v_start = h * stride v_end = v_start + F h_start = w * stride h_end = h_start + F a_slice = A_in[i, v_start:v_end, h_start:h_end, :] # 计算梯度 dA_in[i, v_start:v_end, h_start:h_end, :] += W[c,:,:,:] * dZ[i, h, w, c] dW[c,:,:,:] += a_slice * dZ[i, h, w, c] db[c] += dZ[i, h, w, c] return dA_in, dW, db ``` - **数学原理**: - $dA_{\text{in}}$:通过 $dZ$ 与卷积核 $W$ 的**转置卷积**得到。 - $dW$:$dZ$ 与输入局部区域 $A_{\text{in}}$ 的卷积结果。 - $db$:$dZ$ 的通道求和[^4][^5]。 --- #### **三、关键设计原理** 1. **局部感知** 卷积核仅连接输入局部区域,减少参数量并捕捉空间局部特征(如图像边缘、纹理)[^3]。 2. **参数共享** 同一卷积核在输入不同位置复用,提升计算效率并增强平移不变性[^3]。 3. **反向传播核心** 通过链式求导从损失函数反向计算各层梯度,结合梯度下降更新参数: $$W_{\text{new}} = W_{\text{old}} - \alpha \frac{\partial \mathcal{L}}{\partial W}$$ 其中 $\alpha$ 为学习率[^1][^4]。 --- #### **四、应用场景** - **图像识别**:物体分类(ImageNet)、人脸检测。 - **医学影像**:肿瘤分割、X光分析。 - **自然语言处理**:文本分类(卷积核捕捉局部词序列特征)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值