上一博文,我们学习了卷积神经网络的梯度和反向传播算法,本文我们来通过详细的推导和示例,结合卷积神经网络中卷积层与池化层(汇聚层)的反向传播过程,进一步加深对卷积神经网络的反向传播的理解。
建议大家对比前一博文来理解和学习,两种不同的表现形式,但是思路是相同的。
一. 损失函数关于卷积层权重 W 和偏置 b 的偏导数推导
假设第 l 层卷积层接收来自上一层的输出 A^(l−1)(尺寸为 Hin×Win×Cin),使用 F 个卷积核,每个卷积核尺寸为 k×k×Cin,偏置为 (b_f)^l(f=1,…,F),则该层的前向传播公式为:
定义该层的局部误差(或称误差项)为
所以,通常由上层传回的梯度乘以激活函数的导数,即
(1)关于权重 的偏导数
利用链式法则,损失 L 对于卷积核中某一权重的偏导数为
因此,我们就可以从前向传播的公式直接得出这一关系。简言之,因为前向传播中的运算是线性的,权重 W 与输入 a^{(l-1)} 的乘积使得对 W 求导时,输入值就直接作为乘数出现。
注意到,由前向传播公式可知,
因此,
(2)关于偏置 的偏导数
这两个公式就是卷积层参数 W 和 b 的梯度推导公式。
二. 汇聚层和卷积层误差项的推导过程
2.1 卷积层误差项的推导
在卷积层中,我们已经定义了误差项:
这一步通常由后续层传回的梯度开始(例如输出层计算得出),再乘上当前层激活函数的导数,得到每个位置、每个通道的 δ值。这些 将在反向传播过程中用于计算当前层参数的梯度,同时也会通过卷积核反向传播到上一层。
2.2 汇聚层(池化层)误差项的推导
池化层(或称汇聚层)没有可学习参数,其反向传播的目的是将输出梯度重新分配给输入。
(1)Max Pooling
假设对某个 2×2 区域,
前向最大池化得到输出 p=max{a1,a2,a3,a4}。设该输出位置接收到的梯度为 。
反向传播时,只将 δ_p 传递给在 A 中取到最大值的那个位置,其余位置梯度为 0。即:
(2)Average Pooling
对于相同区域的平均池化,
反向传播时,梯度 δ_p 被均分到区域内每个输入:
三. 具体的反向传播例子
我们构造一个简化的例子,展示一个只有单个卷积层的 CNN 模型,假设激活函数为线性函数(即 f(z)=z,所以 f′(z)=1),损失函数为均方误差(MSE)。
3.1 问题设置
- 输入图像:一个 3×3 灰度图像
- 卷积核:使用一个 2×2 卷积核 W 和偏置 b:
- 前向传播:采用 valid 卷积,输出尺寸为 2×2。
计算每个输出位置:
- 输出 (1,1): z11=0.1⋅1+0.2⋅2+0.3⋅4+0.4⋅5+0.5=0.1+0.4+1.2+2.0+0.5=4.2.
- 输出 (1,2): z12=0.1⋅2+0.2⋅3+0.3⋅5+0.4⋅6+0.5=0.2+0.6+1.5+2.4+0.5=5.2.
- 输出 (2,1): z21=0.1⋅4+0.2⋅5+0.3⋅7+0.4⋅8+0.5=0.4+1.0+2.1+3.2+0.5=7.2.
- 输出 (2,2): z22=0.1⋅5+0.2⋅6+0.3⋅8+0.4⋅9+0.5=0.5+1.2+2.4+3.6+0.5=8.2.
由于激活函数为线性,所以 a=z。
假设目标输出(标签)为 y,且损失函数为
为了简单起见,假设 y 对应每个输出位置的目标值分别为:
3.2 反向传播计算
(1)计算局部误差项 δ_{ij}
由于激活函数线性,f′(z)=1,因此
具体计算:
- δ11=4.2−5.0=−0.8
- δ12=5.2−6.0=−0.8
- δ21=7.2−7.0=0.2
- δ22=8.2−8.0=0.2
故误差矩阵为:
(2)推导卷积核 W 的梯度
根据公式:
(这里只考虑单通道,故省略通道索引)
对 w1(对应核左上角,u=1,v=1):
出现在所有输出位置对应的输入元素为:- 输出 (1,1):对应 X1,1=1
- 输出 (1,2):对应 X1,2=2
- 输出 (2,1):对应 X2,1=4
- 输出 (2,2):对应 X2,2=5
故:
对 w2(核右上角,u=1,v=2):
对应输入:- 输出 (1,1):对应 X1,2=2
- 输出 (1,2):对应 X1,3=3
- 输出 (2,1):对应 X2,2=5
- 输出 (2,2):对应 X2,3=6
故:
对 w3(核左下角,u=2,v=1):
对应输入:- 输出 (1,1):对应 X2,1=4
- 输出 (1,2):对应 X2,2=5
- 输出 (2,1):对应 X3,1=7
- 输出 (2,2):对应 X3,2=8
故:
对 w4(核右下角,u=2,v=2):
对应输入:- 输出 (1,1):对应 X2,2=5
- 输出 (1,2):对应 X2,3=6
- 输出 (2,1):对应 X3,2=8
- 输出 (2,2):对应 X3,3=9
故:
(3)推导偏置 b 的梯度
(4)参数更新(若采用梯度下降)
设学习率 η(例如 0.01),更新公式为:
假如初始 W 和 b 如前所述,上述计算得到梯度后就可以更新参数。
四. 汇聚层(池化层)的误差项推导
如前所述,池化层没有可学习参数,但需要将输出梯度“反传”到输入。以 2×2 最大池化为例:
前向传播:
假设输入区域:
输出 p=max{a1,a2,a3,a4}。
反向传播:
若该输出处接收到梯度 δ_p,则:
- 找到使 p 最大的那个元素。例如,若 a4 是最大值,则
对于平均池化,若
则反向传播时梯度均分:
五. 综合反向传播例子总结
在上面的例子中,我们展示了一个简单卷积层的前向传播、损失计算和反向传播推导:
- 前向传播:根据输入 X、卷积核 W 和偏置 b 计算出预激活输出 z;
- 损失函数:使用均方误差
- 误差项:
- 梯度推导:利用链式法则,将每个输出位置的误差与相应输入“切片”相乘,累加后得出卷积核参数和偏置的梯度;
- 池化层:示例中描述了最大池化和平均池化的反向传播梯度分配策略。
这种详细的推导展示了卷积神经网络中如何通过局部计算、参数共享和反向传播机制,逐层计算梯度并更新参数,使模型能够自动学习到图像的有用特征,从而完成分类、检测或其它视觉任务。
希望这个详细推导过程能帮助你深入理解卷积层和汇聚层(池化层)中误差项以及参数梯度的求导原理。
对于学习卷积神经网络的初学者,建议大家逐步深入:
- 初期重点掌握 CNN 的基本构成(卷积层、池化层、全连接层)及反向传播机制。
- 随着熟悉程度提升,再深入理解参数共享、局部不变性、上采样和下采样等高级概念,并尝试实现更复杂的模型(例如 U-Net、ResNet 等)。
通过理论学习与大量实践相结合,逐步理解 CNN 的工作原理和设计思想,你将能更自信地应用这些技术解决实际问题。