卷积神经网络前向及反向传播过程数学解析

卷积神经网络前向及反向传播过程数学解析

本文章为博主个人关于卷积神经网络个人总结笔记,内容涉及卷积神经网络前向及反向传播过程的公式推导,有助于深度理解卷积神经网络整个数据传递和训练过程,帮助实现个人对卷积神经网络搭建提供理论支持,主要参考电子书籍《neuron network and deep learning》《deep learning》、还有博客“CNN的反向传播过程的推导(池化层、卷积层)”,有关本文的电子pdf版可以前往下载(包含公式原版)

1、卷积神经网络初印象

在这里插入图片描述
  上述图片只是为了让大家对卷积神经网络有一个初步的认识,知道大概会是一个什么样的结构,图中下标有点错误大家忽略哈!只需要看这整个过程即可。

2、卷积神经网络性质

  卷积神经网络具有几个和全连接神经网络不同的性质,和一些需要注意的特性,这个需要提前了解,这里先列举出来:
(1)稀疏性(也可以叫局部感受野):对于全连接网络,上一层神经元都全部与下一层神经元每个神经元连接,而对于卷积神经网络,上一层神经元只有局部与下一层的神经元连接,如下图,与下一层神经元连接的局部区域也叫做局部感受野,通常由一个(n,n)矩阵表示。
在这里插入图片描述
然后我们往右移动一个像素(一个神经元)移动局部感受野,连接下一个神经元。
在这里插入图片描述

(2)参数共享:不同于全连接神经网络的每一个上一层神经元对于下一层神经元都有单独的参数,卷积神经网络对下一层所有神经元都使用同一个参数(都为上述的(n,n)矩阵)得到,这也就意味着下一层所有神经元检测到完全相同的特征,只不过是在上一层神经元不同位置。这种性质是很有现实意义的,我们想象下,对于一幅图像每一处位置,假如需要检测一些相同的特征,比如物体的边缘,我们其实只需要一个专门用于检测边缘的参数即可,无需对于每个不同局部感受野都采用不同参数,这样需要的参数也更少。
  因为这个原因,所以我们把上一层到下一层的映射称为一个特征映射,我们把定义特征的映射的权重称为共享权重,以这种方式定义特征映射的偏置称为共享偏置,其统称为一个卷积核或者滤波器。往往一个卷积核只能检测一种局部特征的类型,所以往往我们需要多个卷积核来实现对输入层多个特征的映射,如下图:
在这里插入图片描述
(3)池化层(pooling layer):在全连接网络中,我们并不会对隐含层的神经元尺寸进行后续缩放,但是在卷积神经网络中我们往往需要做一个池化层的操作,简化从卷积层的输出。其有一个直观理解就是,一但一个特征被发现,往往它的准确位置没有相对于其他特征位置的信息重要,并且这样可以减少后续参数数量。常采用的是最大池化,也就是取池化部位的最大值,如下图所示:
在这里插入图片描述
(4)多输入特征的卷积运算规则:往往上一层网络有多个特征映射,比如上面例子的3×24×24特征映射,有3个特征映射,又比如对于输入的图像为RGB图像,往往也有三个通道,这个时候我们允许下一层的每个神经元从它的局部感受野中所有3×n×n(n为卷积核大小)输入神经元学习,具体怎么学习呢?就是对于下一层每个神经元其输入为上一层每个特征映射的局部感受野的权重和,简单说就是对不同特征映射采用不同的卷积核,然后加起来作为下一层神经元的输入。如下图(来源):
在这里插入图片描述
对于步长为1的卷积,公式表示如下:
在这里插入图片描述
  其中Z表示神经元的输入值,l表示第l层,i表示其第i个特征向量(也就是之前说的特征映射,后续都用”特征向量“表示),j、k表示一个特征向量第j行,第k列;A表示神经元的输出值,s表示该层的特征向量数,m、n表示一个卷积核第(m,n)个的值,B为偏置。由于一般线性代数中下标都从1开始,所以上式有-1这项。而对于步长为d的卷积运算,其公式为:
在这里插入图片描述

3、前向传播

3.1、卷积层层级间传递

  这里来对下面这个卷积神经网络结构进行分析:
在这里插入图片描述
  先对虚线部分进行前向传播分析,对输入到第一层神经元其实就可以包含在这里面,ap代表池化层输出,代表有s个特征向量,j、k表示其特征向量第j行,第k列。w表示权重,i对应下一层神经元特征向量个数,s代表上一层特征向量个数,m、n表示一个卷积核第(m,n)个的值,b为偏置,z为该层神经元输入,a为该层神经元输出(本篇文章都认为z为神经元输入,经过激活函数都变为a,即神经元的输出)。假设卷积水平和竖直步长都为d,卷积不对输入特征边缘扩展,所以公式为:在这里插入图片描述
上图例子即为l=1时候的情况。
用矩阵形式表示为:
在这里插入图片描述

3.2、池化操作

  假设ap表示池化层输出,d表示池化的步长,m、n表示一个池化核第(m,n)个的值,其它参数跟之前一样,则最大值池化公式有:在这里插入图片描述
此过程往往需要记录最大值所在的位置,因为后续反向传播过程需要利用此信息进行反向传播。
  如果为平均值池化,则有公式:
在这里插入图片描述
可用一个总方程式表示为:在这里插入图片描述

3.3、卷积层到全连接层传递

  对于卷积神经网络,目前也有很多网络最后采用一个全连接层来作为分类器。
在这里插入图片描述
  如上图,全连接层有10个神经元,其输入为前一层的池化后特征向量,有3个特征向量。那么这是怎么做到的呢?其实就是有3×10个12×12的卷积核卷积出来的,对于输入的每一张图,用了一个和图像一样大小的核卷积,这样整幅图就变成了一个数了,如果厚度是3就是那3个核卷积完了之后相加求和。这样就能把一张图高度浓缩成一个数了,并且保证全连接层的每个神经元都和池化层的每个特征向量相连。用公式表示为:
在这里插入图片描述
矩阵形式表达式为:
在这里插入图片描述
  自此,卷积神经网络的前向传播过程每个部分几乎,当然你也许会问如果最后一层不使用全连接层怎么弄,这就是全卷积神经网络,暂时这里先不讨论全卷积神经网络,后续会专门一期讨论全卷积神经网络。

4、卷积神经网络的反向传播过程

  神经网络参数更新规则都是梯度下降方法,这里也不例外,可以通过链式法则求出任意参数的梯度,下面给出反向传播总公式:
在这里插入图片描述
我们将利用这个公式和链式法则反向传播实现参数更新计算。
  为了方便中间计算和理解,我们定义一个中间项,误差δ:
在这里插入图片描述
其中上面标示全连接层误差,下面标示卷积层的误差。

4.1、全连接层误差公式

由链式法则我们可以将其写为:
在这里插入图片描述
或者表示成:


在这里插入图片描述

4.2、全连接层向池化层反向传递公式

在这里插入图片描述
由之前给的池化层到全连接层的前向传递公式:
在这里插入图片描述所以得到:
在这里插入图片描述
写成矩阵形式为:
在这里插入图片描述

4.3、池化层到卷积层的误差公式

  在反向传播时,我们首先会把池化层梯度的所有子矩阵矩阵大小还原成池化之前的大小,然后如果是最大池化,则把池化层梯度的所有子矩阵的各个池化局域的值放在之前做前向传播算法得到最大值的位置。如果是Average,则把池化层梯度的所有子矩阵的各个池化局域的值取平均后放在还原后的子矩阵位置。这个过程一般叫做upsample。
  用一个例子可以很方便表示:假如我们的池化区域大小是2×2,步长也为2,第i个子特征矩阵为:
在这里插入图片描述
(1)如果是最大值池化,假设我们之前在前向传播时记录的最大位置分别是左上、右下、右上、左下则转换后的矩阵为:
在这里插入图片描述
(2)如果是平均池化,则进行平均,转换后的矩阵为
在这里插入图片描述
这样我们就得到了卷积层的误差公式:
在这里插入图片描述
  由池化层的结果向前一层传播的话,由于池化层没有参数需要学习,但是由于池化操作造成了数据维度的变化,所以需要有一个数据的上采样过程,上采样过程跟池化的方法有关。
  上述公式写成矩阵形式为:
在这里插入图片描述

4.4、卷积层之间的误差传递

根据链式规则我们可以得到:
在这里插入图片描述
所以这里主要是求第二项的值,但是这里又跟全连接网络不一样,不是简单的权重的转置,下面来分析:
  首先我们通过一个例子看一下有什么规律,假设l层的输出有:
在这里插入图片描述卷积核为:
在这里插入图片描述
l+1层输入:
在这里插入图片描述
其有下列运算关系:
在这里插入图片描述
误差传递公式:
在这里插入图片描述
  我们可以发现,其实a11在左上角,只参与了卷积运算1次,赋值给了z11;a12参与了两次卷积运算分别赋值给了z11和z12;等等。那么我们求z对于a的偏导自然就是这种规则:求对a11的偏导我们就只需要求z11处误差对其的偏导;求对a12的偏导我们就需要求对z11和z12处误差对其的偏导和,也就是要对其两个做运算,其它以此类推,这时你回想下上面提到过的运算,是的,这是否也可以用卷积操作来实现呢?由规律来看自然其卷积核大小也是2×2,但是单独对l+1层的误差矩阵做卷积肯定不会得到a矩阵的3×3大小,而且也要符合刚才运算规律,所以我们需要对l+1层误差矩阵做一些变换,将其周围添加宽度为n-1的0(这里假设卷积核长宽相等,其中n为卷积核的尺寸)如下:
在这里插入图片描述
  但是我们又发现,如果直接这样与w卷积核做卷积,我们发现和z11项误差相乘的是w22,与公式中w11矛盾,其实这里也需要对卷积核做一些变换,我们这用的是180°旋转变换,将其变换为:
在这里插入图片描述
  最后误差传递方程可以写成这样:
在这里插入图片描述
  经过验证是正确的,自此我们就总结出对于卷积层之间的运算规则:先要将对于上一层z的误差矩阵周围用0扩展,扩展尺寸为卷积核的大小n减1,然后将卷积核旋转180°,最后就是跟卷积层前向传播一样的卷积操作,所以最后反向传播公式可以写成下面表达式:
在这里插入图片描述
将上式写成矩阵形式表达式为:
在这里插入图片描述
至此,误差在卷积神经元之间的传播就完成了。

4.5、参数w和b的梯度公式

  还是老方法,根据反向传播的链式法则求参数w和b的梯度可以由下面式子给出:
在这里插入图片描述
  所以,要求上面的式子,主要就是第二部分,而这可以通过之前给的前向传播过程中卷积层之间的传递公式来计算,下面给出之前公式,来找出其关系:
在这里插入图片描述
对于参数b,我们其实可以很简单的看出来其关系,其梯度直接为:
在这里插入图片描述
而对于参数w其实不难得出:
在这里插入图片描述
  看到这个式子你是否觉得有点眼熟,是的,这个式子跟之前前向传播卷积层之间的传递公式类似,只不过累加号下标变成了j,k而之前的是s,m,n。其中m,n代表卷积核的参数,那么我们回到现在这个式子,我们是否可以将下标j,k看做是新的卷积核的参数,也就是说其实现在这个式子也是卷积操作,只不过卷积核变成了(j,k)也就是l+1层第i个特征向量的输入,事实是可以这样考虑的,我们可以发现,当卷积步长为1时,式子可以变成:
在这里插入图片描述
  我们可以发现这和之前给的卷积运算公式是一样的,这里的卷积核已经变成了以(j,k)大小的第l+1层的误差δi,但是对于步长不为1的情况,我们看公式可以知道,它其实是对a水平和竖直方向隔了d-1个而进行卷积,这里我们可以转换一下思维,如果对a是隔了d-1个值进行卷积,其实也可以说是将δ进行一个变换,在每行与每列之间插入d-1个数值为0的值,这样直接与a进行卷积就可以保证在这些为0值的位置的a可以不被累加进去,实现了卷积运算,当步长为2时,具体变换例子如下:
在这里插入图片描述
这样我们就可以直接使用卷积的公式进行计算了:
在这里插入图片描述
所以我们可以直接用上述公式代表所有情况,当d等于1时,也就是不做插值处理。
  所以模型参数的梯度对应的矩阵形式的运算为:
在这里插入图片描述

5、总结

  最后我们来总结下卷积神经网络下前向与反向传播过程:

5.1前向传播

卷积到卷积层:
在这里插入图片描述
卷积层到池化层:
在这里插入图片描述
池化层到全连接层:
在这里插入图片描述

5.2反向传播

最后的全连接层误差:
在这里插入图片描述
全连接到池化层误差传递:
在这里插入图片描述
池化层到卷积层误差传递:
在这里插入图片描述
卷积层之间误差传递:
在这里插入图片描述
模型参数梯度:
在这里插入图片描述
  以上步骤就几乎包括了卷积神经网络训练及预测所有过程,当然很多时候最后的全连接网络不是单层的,是多层全连接层,上述过程也没有讲到全连接层之间的传递,但是这里默认你是知道这个过程的,并且如果你不知道我也建议你先去了解全连接神经网络的前向及反向传播过程再来研究卷积神经网络,这样更容易理解一点。还有这里也没有包括全卷积神经网络,全卷积神经网络最后不是使用全连接网络作为分类器,而是直接使用卷积操作,具体这一方面知识后续会单独出一篇介绍。

  • 11
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值