CNN卷积神经网络反向传播机制的理解

如果对CNN的结构不是很清楚的,可以参考tornadomeetDeep learning:三十八(StackedCNN简单介绍)和zouxy09的Deep 

Learning(深度学习)学习笔记整理系列之(七)。本文主要参考Notes on Convolutional Neural Networks,zouxy09也写过

该论文的笔记


闲话不说,进入正题。

回顾一下BP神经网络算法,针对单独一个样本的前向方向运算,先上一串公式和图(随便画的比较丑),



         


CNN卷积神经网络反向传播机制的理解_第1张图片

以上的一串公式,描述了BP神经网络算法的全过程。式中“。”表示点乘。公式(1)描述样本n的训练误差,其中c为输出层节点的个数,t是训练样本正确的结果,y是网络训练的输出结果。公式(2)描述了每一层神经网络的前向传播过程,其中W是权值,b是偏置,f(.)是网络的激活函数(一般采用sigmoid)。公式(3)求偏置b的导数δ,我们称为敏感度。公式(4)描述敏感度由输出层到前面每一层的反向计算公式,最后一层的δ计算与前面层的计算公式不同(第L层),需要注意;f(.)表示f(.)的导数。公式(5)描述了权值W的导数,求出δ后可以轻松地求出。求出各层W和b的导数,然后结合学习率、动量等一些参数,就可以进行BP网络的反向权值偏置的调整。

       由上可知,反向传播的关键在于灵敏度的计算。根据公式(4),可知灵敏度的方向计算方法如下:l层节点i的灵敏度,等于{“与l层节点i相连接的l+1层节点的灵敏度(如果是全连接,那就是l+1层的所有灵敏度)”和“与l层i节点相连接的权值”的内积,然后乘以l层i节点激活函数的导数值}。

(定义一下本文中的内积:两个大小相同的矩阵或者向量,对应位置的元素相乘,然后求和得到一个输出值。)


回顾完BP,接下来 讨论传统的 CNN 网络(个人称呼,指对上层 map 逐像素卷积过去,卷积层后跟下采样层,且 ”s” 层和 ”c” 层的 map 全连接的 CNN

一. CNN前向传播

1.1 卷积层

还是先上公式,


这里规定l层是卷积层,那么它与上一层的连接是通过卷积运算的,与下一层的连接则是下采样运算。公式中l表示第l层;j表示feature map的下标; Mj指与l层第j张feature map相连接的l-1层feature map集合,在这里默认是全连接,即上一层的全部feature map都与下一层的每个feature map相连;k表示该层卷积窗,b表示该层偏置。

1.2 下采样层

上公式,


这里规定l层是下采样层,那么它与下一层的连接是通过卷积运算的,与上一层的连接则是下采样运算。公式中j表示feature map的下标b表示该层偏置。



二. CNN反向传播

2.1 卷积层

先约束下一些变量以方便理解:设卷积窗大小为s*s,l层为卷积层且feature map大小为m*m,下采样因子为n,那么l-1层feature map大小为(m+s-1)*(m+s-1),l+1层feature map大小为(m/n)*(m/n)。

现在已知δ l+1,要求l层的灵敏度δ l,根据公式(4),容易得到计算公式


其中βjl+1相当于公式(4)中的权值Wl+1ujl及其f(.)运算结果的size都是m*m,j表示feature map的下标。

在这里,灵敏度反向传播的算法是:δl中的每一个点δlij,等于{“δl+1中所有与δlij相连接的值”和“与δlij相连接的权值βjl+1” 的内积(这里想做内积的是两个向量,相当于矩阵乘里的行与列相乘然后求和),然后乘以l层激活函数的导数}。

由于下采样,l层的灵敏度map的size是l+1层map的n倍,也就是说,“δl+1中的一个灵敏度值”连接到“δl中的一个n*n大小的灵敏度patch”,因此,我们需要将δl+1上采样以到与上层灵敏度map一样大小,以达到l+1层的map与l层的map灵敏度值一对一连接,然后与l层激活函数的导数点乘,最后和权值相乘。按照公式(4),应该先是权值与灵敏度做矩阵乘,然后再与激活函数的导数做点乘;这里的情况是下采样层的权值都一样是一个常数,所以运算关系无所谓了。


注意,BP网络中是下层所有节点的灵敏度都和上层的每一个节点的灵敏度相连接,要做到反向传播,要做到下层≥1个灵敏度连接到上一层的每一个灵敏度;而CNN卷积层的情况是下层1个灵敏度值连接到上层n*n个灵敏度,所以要上采样。


计算完灵敏度,便可以计算偏置和权值的导数了,

           
其中,其中(u,v)表示l-1层中与做卷积的feature map的patch的中心位置,lj)uv表示δlj中(u,v)位置的值,(pl-1j)uv
卷积时与做内积的patch(输出一个值)。这样,偏置b的导数就相当于灵敏度map的求和;klij的导数等于l-1层中第i张
map做过卷积运算的所有patch的加权和,因为通过卷积核,即权值klij,与patch相连的下一层灵敏度是lj)uv

2.2 下采样层

先约束下一些变量以方便理解:设卷积窗大小为s*s,l层为下采样层且featuremap大小为m*m,下采样因子为n,那么l-1层feature map大小为(m*n)*(m*n),l+1层featuremap大小为(m-s+1)*(m-s+1),l层N张map,l+1层M张map。

先上公式,

。f(uli)



第一个式子用来计算l层的敏感度map,其中δl+1与δl通过卷积核kijl+1相连接,而且l+1层中与l层中一张map δil相连的map有M张,对应

的卷积窗也有M个。另外,δl+1中的一个元素对应δl中相应位置的一个patch元素,且一个元素和一个s*s的patch元素是由式中卷积核相

连的。所以这l+1层中一个敏感度值和该卷积核的全卷积,M张map都这么做一遍再叠加起来,就能计算得到l层中相应位置一整个patch

的敏感度值(全卷积会处理l+1层敏感度值的边界,对缺少的元素补0)。可以直接对M对“卷积核与l+1层敏感度map”分别做全卷积,得

到M个与l层feature map一样大小的矩阵,再与l层相应的激活函数导数矩阵点乘,就得到了l层的敏感度map。这里计算的关键,还是

于找到l+1层与l层相连接的敏感度和卷积核。

第二个式子计算下采样层的偏置导数,与卷积层的计算是一样的。

第三个式子计算下采样层的权值的导数。这里下采样层的权值都是一样的一个常数βl,l-1层的一个n*n大小的patch经过下采样成一个元

素后,通过该权值与l层相应位置的一个元素相连接,根据公式(5),可以得到第三个式子。

 

至此,分析完毕。总的来说,无论是BP还是CNN,做分析需要注重的一点是,弄清楚节点之间的连接关系。



你可能感兴趣的:(Deep,Learning)