写这个起因是前段时间面试的时候被问到了CNN中反向传播该怎么求,我说直接算就好了呀,面试官让我下来再看看。之后问了下舍友,舍友说需要去把卷积核旋转180°来反向传播,然后我就赶紧查了下相关资料,发现还是非常interesting的。【不过这种本质上还是链式法则直接求的结果,只是形式上会比较tricky】
卷积神经网络(Convolutional Neural Network)
关于卷积神经网络的相关介绍也太多了,所以这里就简要提一下。CNN中主要有3种layer形式:
卷积层(Convolutional)
卷积层自不必我多说啊,太多关于这个的介绍了。
上式中 xℓij 表示第 ℓ 层的坐标为 i,j 的点是如何计算出来的。
不过一个有意思的地方在于,在一些外文资料中,卷积层是按照卷积真正的计算顺序倒着乘的,比如参考资料3中的写法,有些是按照正常的顺序来乘的。这个顺序倒是无所谓的,正着乘的话只是相当于把卷积核倒转了180°之后倒着乘的。
但是这个地方也确实解释了,我之前的一个疑惑,就是卷积明明是倒着乘的呀,为啥CNN中是正着的。看来它只是为了方便计算而已。
像CNN用matlab写的话,其自带的conv
函数就是倒着乘的。这点要注意。
池化层(Pooling也叫sub-sampling)
池化主要是在一个长方形区域内,选取特征的最大值(或者平均值)。
这样的好处有:因为经过原来卷积训练之后,可能特征维度依然很大,还是会容易很出现过拟合,而通过池化大大较少特征的维度,减少过拟合的出现。【注意这里也说明了,只要能够降低计算的维度和参数个数,就能够减少过拟合】
池化层最主要的好处就是提供了一种不变性:
如果人们选择图像中的连续范围作为池化区域,并且只是池化相同(重复)的隐藏单元产生的特征,那么,这些池化单元就具有平移不变性 (translation invariant)。这就意味着即使图像经历了一个小的平移之后,依然会产生相同的 (池化的) 特征。在很多任务中 (例如物体检测、声音识别),我们都更希望得到具有平移不变性的特征,因为即使图像经过了平移,样例(图像)的标记仍然保持不变。例如,如果你处理一个MNIST数据集的数字,把它向左侧或右侧平移,那么不论最终的位置在哪里,你都会期望你的分类器仍然能够精确地将其分类为相同的数字。
以上节选自UFLDL里面的说明。
全连接层(Fully-Connected)
经过几层的卷积和池化层之后,需要经过若干层的全连接层,为了达到分类用的softmax函数,所以必须经过一个全连接层(也可以是几个,像AlexNet的就是3层全连接层,可能是因为3层全连接就能表示任意函数了吧)。
另外全连接层也就意味着破坏了其空间结构,所以全连接层之后不能再有卷积层了。
卷积神经网络上的求导和反向传播
卷积层
对于卷积层的反向传播,只要记得下面这两个公式就好: