CNN中的梯度的求法和反向传播过程
2017-05-22 22:35
302 查看
写这个起因是前段时间面试的时候被问到了CNN中反向传播该怎么求,我说直接算就好了呀,面试官让我下来再看看。之后问了下舍友,舍友说需要去把卷积核旋转180°来反向传播,然后我就赶紧查了下相关资料,发现还是非常interesting的。【不过这种本质上还是链式法则直接求的结果,只是形式上会比较tricky】
xℓij=∑a=0m−1∑b=0m−1ωabyℓ−1(i+a)(j+b).
上式中xℓij表示第ℓ层的坐标为i,j的点是如何计算出来的。
不过一个有意思的地方在于,在一些外文资料中,卷积层是按照卷积真正的计算顺序倒着乘的,比如参考资料3中的写法,有些是按照正常的顺序来乘的。这个顺序倒是无所谓的,正着乘的话只是相当于把卷积核倒转了180°之后倒着乘的。
但是这个地方也确实解释了,我之前的一个疑惑,就是卷积明明是倒着乘的呀,为啥CNN中是正着的。看来它只是为了方便计算而已。
像CNN用matlab写的话,其自带的
这样的好处有:因为经过原来卷积训练之后,可能特征维度依然很大,还是会容易很出现过拟合,而通过池化大大较少特征的维度,减少过拟合的出现。【注意这里也说明了,只要能够降低计算的维度和参数个数,就能够减少过拟合】
池化层最主要的好处就是提供了一种不变性:
如果人们选择图像中的连续范围作为池化区域,并且只是池化相同(重复)的隐藏单元产生的特征,那么,这些池化单元就具有平移不变性 (translation invariant)。这就意味着即使图像经历了一个小的平移之后,依然会产生相同的 (池化的) 特征。在很多任务中 (例如物体检测、声音识别),我们都更希望得到具有平移不变性的特征,因为即使图像经过了平移,样例(图像)的标记仍然保持不变。例如,如果你处理一个MNIST数据集的数字,把它向左侧或右侧平移,那么不论最终的位置在哪里,你都会期望你的分类器仍然能够精确地将其分类为相同的数字。
以上节选自UFLDL里面的说明。
另外全连接层也就意味着破坏了其空间结构,所以全连接层之后不能再有卷积层了。
∂E∂xℓij=∂E∂yℓij∂yℓij∂xℓij=∂E∂yℓij∂∂xℓij(σ(xℓij))=∂E∂yℓijσ′(xℓij)
∂E∂yℓ−1ij=∑a=0m−1∑b=0m−1∂E∂xℓ(i−a)(j−b)∂xℓ(i−a)(j−b)∂yℓ−1ij=∑a=0m−1∑b=0m−1∂E∂xℓ(i−a)(j−b)ωab
可以看到第二个式子就表示了,从这一层向上一层传播的公式,是这一层的误差按照相反方向的卷积进行卷积一遍。不过需要将越界的点进行补零操作。
所以误差的反向传播可以如下:
δl−1x,y=δlx−m,y−m∗(wrot180∘)
所以求wab梯度的计算就如下:
∂E∂ωab=∑i=0N−m∑j=0N−m∂E∂xℓij∂xℓij∂ωab=∑i=0N−m∑j=0N−m∂E∂xℓijyℓ−1(i+a)(j+b)
所以我们只用讲被选择的最大的那个的误差向前传播就好,没有被选择的就置为0向前传播。
所以这里我们可以看到Max-Pooling层的传播过程有点类似于dropout的情况。所以其能够防止过拟合。
UFLDL大名鼎鼎,以及发现现在这个UFLDL出新版了,将来抽空看一下。
Backpropagation In Convolutional Neural Networks图文并茂,不过文章的书写和计算方式不太符合的习惯。
卷积神经网络(Convolutional Neural Network)
关于卷积神经网络的相关介绍也太多了,所以这里就简要提一下。CNN中主要有3种layer形式:卷积层(Convolutional)
卷积层自不必我多说啊,太多关于这个的介绍了。xℓij=∑a=0m−1∑b=0m−1ωabyℓ−1(i+a)(j+b).
上式中xℓij表示第ℓ层的坐标为i,j的点是如何计算出来的。
不过一个有意思的地方在于,在一些外文资料中,卷积层是按照卷积真正的计算顺序倒着乘的,比如参考资料3中的写法,有些是按照正常的顺序来乘的。这个顺序倒是无所谓的,正着乘的话只是相当于把卷积核倒转了180°之后倒着乘的。
但是这个地方也确实解释了,我之前的一个疑惑,就是卷积明明是倒着乘的呀,为啥CNN中是正着的。看来它只是为了方便计算而已。
像CNN用matlab写的话,其自带的
conv函数就是倒着乘的。这点要注意。
池化层(Pooling也叫sub-sampling)
池化主要是在一个长方形区域内,选取特征的最大值(或者平均值)。这样的好处有:因为经过原来卷积训练之后,可能特征维度依然很大,还是会容易很出现过拟合,而通过池化大大较少特征的维度,减少过拟合的出现。【注意这里也说明了,只要能够降低计算的维度和参数个数,就能够减少过拟合】
池化层最主要的好处就是提供了一种不变性:
如果人们选择图像中的连续范围作为池化区域,并且只是池化相同(重复)的隐藏单元产生的特征,那么,这些池化单元就具有平移不变性 (translation invariant)。这就意味着即使图像经历了一个小的平移之后,依然会产生相同的 (池化的) 特征。在很多任务中 (例如物体检测、声音识别),我们都更希望得到具有平移不变性的特征,因为即使图像经过了平移,样例(图像)的标记仍然保持不变。例如,如果你处理一个MNIST数据集的数字,把它向左侧或右侧平移,那么不论最终的位置在哪里,你都会期望你的分类器仍然能够精确地将其分类为相同的数字。
以上节选自UFLDL里面的说明。
全连接层(Fully-Connected)
经过几层的卷积和池化层之后,需要经过若干层的全连接层,为了达到分类用的softmax函数,所以必须经过一个全连接层(也可以是几个,像AlexNet的就是3层全连接层,可能是因为3层全连接就能表示任意函数了吧)。另外全连接层也就意味着破坏了其空间结构,所以全连接层之后不能再有卷积层了。
卷积神经网络上的求导和反向传播
卷积层
对于卷积层的反向传播,只要记得下面这两个公式就好:∂E∂xℓij=∂E∂yℓij∂yℓij∂xℓij=∂E∂yℓij∂∂xℓij(σ(xℓij))=∂E∂yℓijσ′(xℓij)
∂E∂yℓ−1ij=∑a=0m−1∑b=0m−1∂E∂xℓ(i−a)(j−b)∂xℓ(i−a)(j−b)∂yℓ−1ij=∑a=0m−1∑b=0m−1∂E∂xℓ(i−a)(j−b)ωab
可以看到第二个式子就表示了,从这一层向上一层传播的公式,是这一层的误差按照相反方向的卷积进行卷积一遍。不过需要将越界的点进行补零操作。
所以误差的反向传播可以如下:
δl−1x,y=δlx−m,y−m∗(wrot180∘)
所以求wab梯度的计算就如下:
∂E∂ωab=∑i=0N−m∑j=0N−m∂E∂xℓij∂xℓij∂ωab=∑i=0N−m∑j=0N−m∂E∂xℓijyℓ−1(i+a)(j+b)
Pooling 层
Pooling层没有做学习/计算,只是做了选择。所以我们只用讲被选择的最大的那个的误差向前传播就好,没有被选择的就置为0向前传播。
所以这里我们可以看到Max-Pooling层的传播过程有点类似于dropout的情况。所以其能够防止过拟合。
参考文献
Convolutional Neural Networks这篇Blog算是我主要了解这个反向传播过程的一篇Blog,讲的也非常清晰。UFLDL大名鼎鼎,以及发现现在这个UFLDL出新版了,将来抽空看一下。
Backpropagation In Convolutional Neural Networks图文并茂,不过文章的书写和计算方式不太符合的习惯。
相关文章推荐
- 三、梯度下降与反向传播(含过程推导及证明)
- CNN反向传播训练参数过程
- BP神经网络,BP推导过程,反向传播算法,误差反向传播,梯度下降,权值阈值更新推导,隐含层权重更新公式
- 编写C语言版本的卷积神经网络CNN之三:CNN的误差反向传播过程
- 卷积神经网络(CNN)反向传播理论推导
- 梯度下降与反向传播详解
- 神经网络反向传播梯度计算数学原理
- caffe loss以及正则项反向传播过程
- Caffe梯度传播过程
- BP(反向传播)算法和CNN反向传播算法推导(转载)
- PyTorch: 梯度下降及反向传播
- 实现属于自己的TensorFlow(二) - 梯度计算与反向传播
- 梯度下降法和误差反向传播推导
- LSTM反向传播过程记录
- CNN卷积神经网络和反向传播
- 深度学习21天实战Caffe学习笔记--笔记5--caffe中前向传播、反向传播及最优化求解过程
- CNN卷积神经网络--反向传播(3,Notes on Convolutional Neural Networks)
- 【深度学习】梯度下降和反向传播
- 梯度下降和反向传播
- 卷积神经网络CNN(重点:反向传播)