hdy 发表于 2025-7-29 22:50

大数据通识第10讲:卷积神经网络反向传播原理


介绍卷积神经网络(Convolutional Neural Networks, 简称CNN)基本概念的文章有很多,但是讲卷积神经网络反向传播算法的却不多,有些讲了,但是讲的比较晦涩难懂,因此这篇文章主要来介绍一下CNN的反向传播算法。
一、卷积神经网络的整体结构卷积神经网络是从常规的全连接神经网络延伸发展而来,其整体结构如下图所示,主要由三部分组成,分别为卷积层、池化层以及全连接层。
卷积神经网络的前部分是卷积层和池化层,一般是1个卷积层后面跟1个池化层,两个以成对的方式出现,卷积层和池化层可以多次出现,需要根据实际应用场景来设计网络结构。
Flatten意思是将原来多维的神经元转化为全连接神经网络中的1维向量形式,紧接着是一个我们所熟悉的全连接神经网络,最后由全连接神经网络输出最终的结果。

二、CNN反向传播的基本思路
我们知道全连接神经网络通过梯度下降算法和反向传播算法来进行学习,从而学习到最适合的参数。卷积神经网络中卷积层以卷积操作的方式进行,而不是全连接的模式,池化层又是一种完全不同的计算模式。很显然,全连接神经网络的反向传播算法不能直接用于卷积神经网络。那么卷积神经网络要怎么学习,怎么来计算参数的梯度?
CNN反向传播算法实现的基本思路如下:CNN主要有三个基本模块组成,误差反向传播时,首先遇到的全连接网络层,然后是池化层和卷积层。采取逐一突破解决的策略,只要解决了每个基本模块的误差反向传播问题,也就完整地解决了CNN的误差反向传播问题,如下图所示:(1)全连接层:这一层就是普通的全连接神经网络,因此直接用反向传播算法即可(如不熟悉,参考前期文章大数据通识第9讲:神经网络模型)
(2)池化层:解决池化层误差如何向上一层传播的问题,由于池化层是一个固定的操作,它没有参数需要学习,因此相对简单。
(3)卷积层:比较麻烦的是卷积层,它具有参数共享、神经元局部连接等特点,与全连接模式有很大的不同,这是需要重点去解决的。全连接层的反向传播在这里就不再介绍,下面重点介绍如何解决池化层和卷积层的误差反向传播问题。
三、池化层的误差反向传播
最为常见的池化策略是最大池化和平均池化,我们首先来解决最大池化的误差反向传播问题。
(一)最大池化
1、理解最大池化过程
简单来说,最大池化就是输出卷积层结果中区域内神经元的最大激活值,它把区域内的最大激活值作为浓缩特征(代表特征)进行提取。下面是一个具体例子,输入是一个4×4的矩阵,假设池化的过滤器为2×2,步长为2,那么池化后的结果是一个2×2的矩阵。首先是左上角的四个元素,四个元素中最大值是9,对应池化后的结果是9;过滤器往右移动两个元素(因为步长为2),右上角四个元素最大值是2,那么池化后结果是2。以此类推,最终的得到一个2×2的矩阵,如下图。
从上面的过程我们可以看到池化有一个最大的特征:池化层没有参数需要学习。池化是一个固定的操作,对于最大池化来说,就是选取区域内的最大值,这里不像全连接网络或者卷积层,没有权重和偏置参数需要学习。因此在反向传播过程中,只要把误差传回到上一层(从池化层传回到卷积层)即可,不需要计算参数的梯度。

2、误差反向传播的数学推导
为了更为方便地理解池化层的误差反向传播过程,可以把最大池化的过程转化为我们所熟悉的常规神经网络形式,如下图所示:
我们把原先二维矩阵的形式转化为一维向量的形式,可以理解为全连接神经网络的一种特殊形式,在这里神经元之间的权重参数是固定的。以原先二维矩阵左上角的四个神经元(激活值分别为1,3,2,9)为例,分别对应到转化后的常规神经网络中的L-1层的第1,2,5,6个神经元,他们连接到L层的第1个神经元,由于是最大池化,因此L-1层第1,2,5个神经元到L层第1个神经元的权重固定全部为0,而第6个神经元(区域内最大值)到L层第1个神经元的权重固定为1,池化层神经元的激活函数可以看作为f(z)=z。在这样的权重和激活函数设置下,这个神经网络与最大池化过程相同了。因此,我们要解决的问题变为:在常规神经网络架构下,在L层的神经元误差已知的情况下,如何计算得到L-1层的误差。如下图所示:
先来约定下下标的含义,我们用下标j来标识L-1层的每个神经元,用下标k来表示L层的每一个神经元,那么根据全连接神经网络的计算方法,可以得到L-1层各神经元的误差如下:由于L-1层的神经元发生的变化有可能影响到L层的每一个神经元,因此根据链式法则,L-1层第j的神经元的误差等于损失函数C对L层的每一个神经元的带权输入z求导(用下标k遍历了L层的神经元),再乘以L层的带权输入Z对L-1层的带权输入变量z的求导结果。根据上面公式,我们先来计算左上角4个元素的误差(常规神经网络中对应为L-1层中下标分别为j=1,2,5,6的神经元)。由于L-1层的第1个神经元没有参与到任何L层神经元的计算(权重参数固定为0),也就是说,L-1层这个神经元的激活值无论发生任何变化,都没有影响到下一层,因此计算公式中该项为0,最终的误差结果也为0。对于L-1层的第2个和第5个神经元,同样的道理,其误差也均为0。再来看L-1层的第6个神经元,这个就比较特殊了,因为L层的池化结果就取自这个神经元的激活值,直接影响了L层神经元的结果,因此有如下:根据链式法则,当k不等于1时,求导结果均为0(因为L-1层第6个神经元没有连接到L层除第1个之外的神经元,也可以理解为权重参数为0);只有当k=1时求导结果才不为0,再将L层的带权输入z代入,得到如下结果:采用同样的计算方法,可以得到L-1层剩余神经元的误差,如下图所示,L-1层中未被取到最大值的神经元误差均为0,L-1层中取到最大值的神经元的误差等于L层对应神经元的误差乘以L-1层该神经元的激活函数导数。
基于上面的结果,可以将最大池化的误差反向传播计算方法进一步简化为如下表达形式:
左边的矩阵是上采样(Up-Sampling)结果,在最大池化时记录最大值的索引位置,在误差反向传播时,将误差δ放到原先最大值的位置,其余位置补0;右边的矩阵是第L-1层的每个神经元的激活函数导数,两个矩阵按元素相乘(阿达马积)就是最终的L-1层的误差结果。推广到一般情况,可以用如下公式表示:圆圈里面一个点的符号代表按元素的乘积,也称作阿达马积或舒尔积,例如:在最大池化的上采样中,在max pooling位置记录最大值的索引位置,然后在unpooling阶段时将对应的值放到原先最大值的位置,其余位置补0。
3、重叠池化下的误差反向传播
前面举的例子是池化过程没有重叠的情况,例如前面例子中,由于池化过滤器为2×2,步长为2,因此每次选取最大值的区域是没有重叠的。
但是如果将池化过滤器的步长设置为1(池化过滤器仍为2×2),那么就会存在重叠的情况,如下图所示:这个例子中输入矩阵中激活值为9的这个神经元被同时选取到了4次,对应到右边蓝色圆圈内的池化结果。
那么在这种情况下,最大池化的上采样结果应该是怎么样的?采用相同的推导思路,有如下结果:
就刚才的例子来说,输入矩阵激活值为9的神经元最大池化时被选取到4次,那么池化层中对应的4个神经元的误差都要加到输入矩阵激活值为9的这个神经元,没有被选取到的神经元则补0。
上面介绍的是单通道情况下的误差反向计算方法,那么在多通道的情况下怎么办?在多通道的情况下,由于池化过程是对每个通道独立进行的,因此在误差反向传播时,也只要针对每个通道独立运用上述误差反向传播计算方法即可。
(二)平均池化
平均池化就是输出卷积层结果中区域内神经元激活值的平均值,是对区域内浓缩特征提取的另一种方式。
1、理解平均池化过程
采用与前面相同的例子(池化过滤器为2×2,步长为2)来说明平均池化的过程,平均池化就是输出区域内(对应到这个例子是2×2区域)神经元激活值的平均值。由于输入矩阵是4×4规模,那么池化之后是一个2×2的矩阵。以输入矩阵左上角2×2区域中的四个元素(1,3,2,9)为例,其平均值为3.75,填入右边矩阵第一个元素。以此类推,最终得到右边2×2的平均池化结果。
2、误差反向传播的数学推导
采用与最大池化相同的推导方法,将二维矩阵形式转化为常规神经网络的形式,如下图所示:
注意这张图中与最大池化的不同点,在平均池化中,L-1层第1,2,5,6个神经到L层第1个神经元的权重变为固定的1/4(池化过滤器为2×2),但是没有到L层其余3个神经元的连接线,可以理解为权重为0。根据链式法则,L-1层第1,2,5,6个神经元的误差计算方式如下:
同样的方法,对于L-1层剩余神经元的误差计算结果如下:
将上面的结果转化为矩阵按元素相乘(阿达马积)的方式如下:
前面是一个具体的例子,那么把平均池化的误差计算方式推广的一般情况下如下:其中:up函数为对L层误差的上采样函数。
四、卷积层的反向传播
前面介绍了池化层的误差反向传播,接下来看一下卷积层的误差是如何反向传播的,与池化层相比,卷积层的误差反向传播更为复杂,但是基本的思路是一样的。
(1)先用一个例子来直观理解下
为了降低描述的复杂度,我们换一个3×3规模小一点的例子:卷积层的输入是一个3×3的矩阵,卷积过滤器为2×2,步长为1(stride=1),那么卷积后的结果是一个2×2的矩阵,如下图:
根据卷积计算原理,有如下结果:
采用与池化层相同的思路,我们把二维卷积的形式转化为常规神经网络的形式,如下图:
我们把原先二维矩阵的形式转化为一维向量的常规神经网络形式,L-1和L层神经元之间的连线代表了卷积核中的参数(w_11,w_12,w_21,w_22),与全连接方式不同,L层的神经元只会与L-1层的四个神经元(因为卷积核为2×2)相连。从上面的神经网络图中可以看到,L-1层的第1个神经元(其激活值为a_11)仅仅影响L层的第1个神经元(带权输入为z_11),那么L-1层a_11所在神经元的误差如下:
再来看L-1层的第2个神经元,L-1层的a_12影响L层的z_11和z_12,那么L-1层a_12所在神经元的误差如下:
用相同的方法,可以得到L-1层剩余神经元的误差,这里对下标做了转换,将原来1维下标转化为2维下标形式,有如下结果:
转化为卷积表示形式,则有:
卷积层误差反向传播后的结果等于卷积层(L层)的误差经过零填充后,与卷积核旋转180度后的卷积,再与L-1层的激活函数导数按元素相乘。
(2)为什么需要旋转180度,用数学推导来证明
为了方便理解,先对下标的含义进行约定,如下图所示:
L-1层每个神经元的误差计算方式如下:
到了这一步,可能稍微有点不太容易理解,主要是这个式子中的下标为什么是这么个写法?
这里展开来解释一下,如下图所示,L层的带权输入z是L-1层某个区域与卷积核按元素相乘的结果,在卷积核步长为1时,卷积后结果中元素的下标与输入矩阵中起始的下标是一样的。因此L-1层的元素也是从下标(x′,y′)开始,由于要遍历卷积核中的权重参数w,因此下标要再加上m-1和n-1,这里为什么还要减去1,是因为卷积核参数的索引从1开始的,因此对应到L-1层的元素下标变为(x′+m-1,y′+n-1)。

上面式子中红框部分,看着比较复杂,由于是对L-1层的索引为(x,y)的变量z求导,因此只有当满足x′+m-1=x ,y′+n-1=y条件时,求导结果才不为0,所以式子可以进一步简化为:
根据x′+m-1=x ,y′+n-1=y条件,则有x′=x-m+1, y′=y-n+1,将x′,y′代入上述式子:
再设m′=-m,n′=-n,代入上式有:
到了这一步,基本上已经证明完了,上面的式子就是卷积层(L层)的误差经过零填充后,与卷积核旋转180度后的卷积,再与L-1层的激活函数导数按元素相乘,虽然不是特别直观,但是按照元素一个个去验证就是这个结论。进一步简化的话,可以用下面公式来表示:
(3)卷积层偏置参数的求导
在已知卷积层误差的情况下,对于偏置参数b的求导相对简单,其最终结果是卷积层中各神经元的误差之和。理解偏置参数的求导过程的的关键点是偏置参数b在CNN中是共享的,如下图所示:
具体数学证明过程如下,这里单通道情况下的推导,在多通道的情况下,对于偏置b的求导是结果也是一样的:
(4)卷积层权重参数的求导
CNN中由于权重参数w是共享的,因此对于任何一个权重参数来说,它参与了卷积层中每一个神经元的计算过程,因此在对某个权重参数求导时,需要遍历卷积层中的每一个神经元(下面公式中用索引(x,y)来遍历L层的每一个神经元),具体推导过程如下:
上面式子中,只有当m′=m,n′=n时,下面的求导结果才不等于0:
因此,最终有:
让我们更为直观地来理解下这个公式,对于卷积核中的某个权重参数w来说,每一次卷积运算都会与L-1层的某个神经元的激活值相乘,如下图所示。因此在对某个权重参数求导时:除了与这个权重参数相关的L-1层的激活值,其余项的求导结果都是0,而 x+m-1和y+n-1,正是反映了索引为(m.n)的w与上一层的激活值a之间的关联关系。
五、总结
上面对池化层(包括最大和平均池化)、卷积层的误差反向传播计算过程进行了详细的介绍。在卷积神经网络中,包括卷积层、池化层和全连接层三个基本模块,在误差反向传播过程中,遇到哪一层就采用对应的误差反向传播计算方法,因此无论卷积神经网络的结构多么的复杂,都可以顺利地解决误差反向传播和参数梯度计算问题。

Gray 发表于 2025-7-31 13:59

图文结合很清晰

dangweixia 发表于 2026-4-7 19:16

卷积神经网络反向传播原理

陛下万年 发表于 2026-5-15 09:05

天哥GG 发表于 2026-5-15 19:23

大数据通识第10讲:卷
页: [1]
查看完整版本: 大数据通识第10讲:卷积神经网络反向传播原理