深度学习之二:CNN推导

前面看过了CNN的基本结构,经典的模式如下图:



 

上图经典的CNN模型主要可以概括为三个部分:

convolution层:convolution是将原来的输入向量映射成多个feature map,每个feature map的权重和偏移量都是一样的

sub-sampling层:sub-sampling 层将feature map进一步缩小,可以选择down-sampling的方法有很多,如max-pooling是选取所选区域的最大值,也有是选取所选区域的每个像素的输出值的平均                 值,当然也有是将所选区域的每个像素的输出值进行求和,但是目的只有一个,那就是进一步将feature map压缩

全连接层:CNN中卷积层和sub-sampling层可以多个组合使用,在最后面的sub-sampling层后面加入几个全连接层,最后连接到输出层中去

 

了解完这一点后,根据一般的神经网络BP算法,我们构造完损失函数L,然后在训练过程中就使用BP算法进行梯度下降求导了,本文就是介绍关于CNN求导过程。

整篇文章参考的论文为【1】Notes on Convolutional Neural Networks ,作者Jake Bourvie比较详细的介绍了CNN 的求导方法。

 

文章假设已经掌握了经典的BP算法,同时对于损失函数也有一定的了解,常用的平方损失函数或者cross-entropy函数等,所以下文不会给出从头到尾的推导公式,只是着重介绍在卷积层和sub-sampling层的求导过程。

 

一,首先来看卷积层的求导(求误差敏感项以及权重和偏置值):

 

从输入层到卷积层的feature map,我们使用的是如下计算公式:

 

 其中Mj表示的是输入层的选中区域,而Kij核函数表示的是权重参数,也就是w参数,f(.)表示的是激励函数,一般使用sigmoid,也有资料【2】表示使用ReLU函数能够更好的训练深度神经网络,总之这个式子表示的是从上一输入层到卷积层的计算过程,feature map共享相同的Kernel和biase也就是w和b参数,不同的feature map 的w和b参数不一样

 

现在来计算一下卷积层的梯度下降公式:

 

目的:计算卷积层的各个参数的梯度,也就是计算上面式子的Kij和b的导数值

假设每个卷积层后面都跟着sub-sampling层,BP算法告诉我们,要想求得本层的参数,那么就需要求出损失函数对本层输出结果的导数,这里就出现了一个问题,卷积层的大小和sub-sampling层的大小不一样,这就对求导产生的难度。

为了求导,我们可以将sub-sampling层按照之前的卷积层到sub-sampling层的映射规则,将sub-sampling层展开成和卷积层一样的大小,我们看一下是如歌展开的:

 

假设卷积层为4*4大小,然后sub-sampling层为2*2大小,我们假设现在使用BP算法求得的sub-sampling敏感项大小是:

 

 

  •  假设在从卷积层到sub-sample层是使用均值的方法,那么可以将sub-sampling 的敏感项"up-sampling"到如下图:

 

 

 

  •  如假设使用的是max-pooling方法,那么可以选择其他区域为0,其up-sampling的结果可能是下图:

 

 之所以是使用“可能”两个字,是因为0的位置需要根据卷积层到sub-sampling层的最大值在卷积层的位置决定,因此还需要记住从convolution层到sub-sampling层的映射位置。

 

在得到卷积层output敏感项之后,就可以进行对卷积层的参数进行求导了:

 

 
(1)
 
(2)
 
(3)
 

其中(1)式中的up(.)指的就是讲suB-sampling层按照之前说的规则“展开”,βl+1 表示的是sub-sampling“展开后”卷积层的output敏感项,f0(u` j)则是对卷积层的激励函数求导,这和BP算法是一致的

(2)式表示对卷积层参数b的求导,(3)式表示的是对卷积层参数Kij的求导,其实也就是对权重w进行求导,Pi表示的是卷积层上一层输入值块,也就是卷积区域的输入值矩阵,和BP算法保持一致。

在【1】这篇文章中,有一种新的方法计算这部分求导,其实是为了方便MATLAB编程,我们以求 L-1层的敏感项(δl-1)举例说明:

 

假设卷积层前面是一个3*3大小的通道,卷积核大小为2*2,那么在卷积层应该有2*2大小,我们假设现在已经求出的卷积层的敏感项为:

 

 卷积核为:



我们先将卷积层L的敏感项“FULL”化:(稍后解释为什么)

 

 

 

那么对卷积层的Xij(也就是前一层的敏感项)求导的结果就是

 

 

   
 
   *  =
 

注意这里*表示的离散卷积也就是先要将卷积核旋转180度然后进行卷积相乘。其实这里也是根据BP算法进行推导的,比如最中间的2.3是由矩阵[1,1,2,3]的 1的右下角,1的左下角,2的右上角,3的左上角的四个因子相乘所得,所以2.3=1*0.6+1*0.5+2*0.3+3*0.2得来

 

当然如果有多个feature map,只需要将所得到的3维矩阵相加即可

 

二,前面部分从convolution层到sub-sampling层没有考虑使用线性变换,也就是说可能从卷积层到sample层还可能有参数Biase和w参数,下面就这一点做个说明

 

计算公式:


 其中down表示的是从卷积层到sub-sampling层使用的函数,例如max-pooling使用的是最大值,在论文【1】里面,作者使用的求和,也就是将卷基层的输出直接相加得到dowm(.)注意到这里使用的 βj `和(1) 式中使用的是一样的参数,之所以是这样,是因为如果从卷积层到sub-sampling层使用的是求和的话,那么卷积层的敏感项“展开项”都是一样的 βj ` ,所以(1)式中的 βj ` 就是这么来的

 

好了现在按照下面式子求出各个项的参数:



 
(4)
 
(5)

这个和一般的BP算法是一样的,这里求上一层的敏感项的时候,可以将down(.)当做一个整体求导,然后按照之前所说明的方式“展开”成和convolution层一样大小的去求卷积层各个参数导数

 

 

三,拓展

【1】还介绍了一下优化CNN的方法,如给不同的map不一样的比例参数ai,也说明了一些关于规范化(regulation)方面的内容,其求导过程大同小异,就不一一提及

 

 

参考文献:

【1】Notes on Convolutional Neural Networks,Jake Bouvrie

【2】Deep Sparse Rectifier Neural Network,Xavier Glorot..

【3】Deep learning:五十一(CNN的反向求导及练习)

猜你喜欢

转载自luchi007.iteye.com/blog/2285391
今日推荐