CNN中的梯度的求法和反向传播过程

写这个起因是前段时间面试的时候被问到了CNN中反向传播该怎么求,我说直接算就好了呀,面试官让我下来再看看。之后问了下舍友,舍友说需要去把卷积核旋转180°来反向传播,然后我就赶紧查了下相关资料,发现还是非常interesting的。【不过这种本质上还是链式法则直接求的结果,只是形式上会比较tricky】

卷积神经网络(Convolutional Neural Network)

关于卷积神经网络的相关介绍也太多了,所以这里就简要提一下。CNN中主要有3种layer形式:

卷积层(Convolutional)

卷积层自不必我多说啊,太多关于这个的介绍了。

xij=a=0m1b=0m1ωaby1(i+a)(j+b).

上式中 xij 表示第 层的坐标为 i,j 的点是如何计算出来的。

不过一个有意思的地方在于,在一些外文资料中,卷积层是按照卷积真正的计算顺序倒着乘的,比如参考资料3中的写法,有些是按照正常的顺序来乘的。这个顺序倒是无所谓的,正着乘的话只是相当于把卷积核倒转了180°之后倒着乘的。
但是这个地方也确实解释了,我之前的一个疑惑,就是卷积明明是倒着乘的呀,为啥CNN中是正着的。看来它只是为了方便计算而已。
像CNN用matlab写的话,其自带的conv函数就是倒着乘的。这点要注意。

池化层(Pooling也叫sub-sampling)

池化主要是在一个长方形区域内,选取特征的最大值(或者平均值)。
这样的好处有:因为经过原来卷积训练之后,可能特征维度依然很大,还是会容易很出现过拟合,而通过池化大大较少特征的维度,减少过拟合的出现。【注意这里也说明了,只要能够降低计算的维度和参数个数,就能够减少过拟合】

池化层最主要的好处就是提供了一种不变性

如果人们选择图像中的连续范围作为池化区域,并且只是池化相同(重复)的隐藏单元产生的特征,那么,这些池化单元就具有平移不变性 (translation invariant)。这就意味着即使图像经历了一个小的平移之后,依然会产生相同的 (池化的) 特征。在很多任务中 (例如物体检测、声音识别),我们都更希望得到具有平移不变性的特征,因为即使图像经过了平移,样例(图像)的标记仍然保持不变。例如,如果你处理一个MNIST数据集的数字,把它向左侧或右侧平移,那么不论最终的位置在哪里,你都会期望你的分类器仍然能够精确地将其分类为相同的数字。

以上节选自UFLDL里面的说明。

全连接层(Fully-Connected)

经过几层的卷积和池化层之后,需要经过若干层的全连接层,为了达到分类用的softmax函数,所以必须经过一个全连接层(也可以是几个,像AlexNet的就是3层全连接层,可能是因为3层全连接就能表示任意函数了吧)。

另外全连接层也就意味着破坏了其空间结构,所以全连接层之后不能再有卷积层了。

卷积神经网络上的求导和反向传播

卷积层

对于卷积层的反向传播,只要记得下面这两个公式就好:

Exij=Eyijyijxij=Eyijxij(σ(xij))=Eyijσ(xij)

Ey1ij=a=0m1b=0m1Ex(ia)(jb)x(ia)(jb)y1ij=a=0m1b=0m1Ex(ia)(jb)ωab

可以看到第二个式子就表示了,从这一层向上一层传播的公式,是这一层的误差按照相反方向的卷积进行卷积一遍。不过需要将越界的点进行补零操作。
所以误差的反向传播可以如下:
δl1x,y=δlxm,ym(wrot180)

所以求 wab 梯度的计算就如下:
Eωab=i=0Nmj=0NmExijxijωab=i=0Nmj=0NmExijy1(i+a)(j+b)

Pooling 层

Pooling层没有做学习/计算,只是做了选择。
所以我们只用讲被选择的最大的那个的误差向前传播就好,没有被选择的就置为0向前传播。
所以这里我们可以看到Max-Pooling层的传播过程有点类似于dropout的情况。所以其能够防止过拟合。

参考文献

  1. Convolutional Neural Networks这篇Blog算是我主要了解这个反向传播过程的一篇Blog,讲的也非常清晰。
  2. UFLDL大名鼎鼎,以及发现现在这个UFLDL出新版了,将来抽空看一下。
  3. Backpropagation In Convolutional Neural Networks图文并茂,不过文章的书写和计算方式不太符合的习惯。

你可能感兴趣的:(机器学习)