由于下学期毕设要做CNN的东西,最近开始接触CNN。看了一些资料,发现这些资料里面讲的BP+SGD的训练策略都是针对conv layer 的,而像caffe这种ConvNet库,里面包含了很多非卷积层,那么这些层里面的back propagation是怎么运作的呢?鄙人搜索能力太弱了,在网上找了半天都没有找到,,,,找不到就自己开始推到吧,sigh~
首先,先考虑经典的 conv layer back propagation formula。(参考 http://neuralnetworksanddeeplearning.com/chap2.html)
下面都假设大家已经看了这个链接,并知道BP1~BP4里面各个变量的含义了。
这四个公式只适用于 全部是 conv layer 构建起来的网络,没有其他类型的layer。虽然 conv layer alone 可以表现相当好的学习能力,但是最近两三年CNN在视觉领域那么受欢迎,不仅仅是因为conv layer,还要归功于其他类型的layer。
常见的其他类型 layer 有 pooling layer,lrn layer (local response normalization),dropout layer 等。如果按照caffe的定义,那么连每层上的activation function都可以看做是一个layer,不妨叫做neuron layer, 那么由于activation function可以有很多取法,那么neuron layer 的种类也由很多,如sigmoid, relu, tanh, cross entropy。。。neuron layer 在back propagate 的时候,操作很简单,你只需要计算activation function 的微分,替换公式BP1中的。那么对应pooling layer 和 lrn layer 呢?往后看。。。。
下面我们假设第L个卷积层和第L+1个卷积层之间不是直接相连的,而是这样的结构 conv_L --> relu --> pooling --> lrn --> conv_L+1
相比于推导出BP1~BP4的原网络,这个网络每个conv layer之间多了pooling 和 lrn,现在的问题就是怎么修改BP公式,让误差能够顺利反向传播。我的想法是这样的:除了 BP2,其他公式是不用修改的,因为真正引入差别的是在添加了pooling 层和 lrn 层之后,两个卷积层没有能够直接相连了,导致zL不是 conv_L+1 的输入,而是 aL=lrn{ pooling [ relu (zL) ] } 。
下面我们把中间变量用字母表示一下, zL --> yL --> xL --> aL,即 yL=relu (zL), xL=pooling(yL),aL=lrn(xL)。为了方便,我们省略下标L 。
原来的 σ 是activation function,即 relu。仔细想一想就可以发现,加了pooling 和 lrn 之后,无非就是把 σ 看做是上面几个“函数”的复合,即 σ(.) = lrn{ pooling [ relu (.) ] },
所以我们只需要求BP2 中 的等价表达式。
下面是推导过程: