(六)6.18 cnn 的反向传导算法
本文主要内容是 CNN 的 BP 算法,看此文章前请保证对CNN有初步认识,可参考Neurons Networks convolutional neural network(cnn)。
网络表示
CNN相对于传统的全连接DNN来说增加了卷积层与池化层,典型的卷积神经网络中(比如LeNet-5 ),开始几层都是卷积和池化的交替,然后在靠近输出的地方做成全连接网络,这时候已经将所有两维2D的特征maps转化为全连接的一维网络的输入。在前向传导或城中中,也只有两处与传统的 MLP 有所不同,分别是卷积层前向传导,与 pooling 传导到卷积层,如下图所示:

在上图中,层 $(l-1)$ 可以为pooling 层或是输入层,$(l)$ 层对 $(l-1)$ 层进行卷积操作,$(l+1)$ 对 $(l)$ 进行pooling操作。
符号表示
$K^{(l-1)}$:$(l-1)$ 层用到的卷积核,即$(l-1)$ 层的权值参数;
$K^{(l-1)}_{ij}$:从 $(l-1)$层映射到 $(l)$ 层Feature Map j 所用到的卷积核 $j$ 的第 $i$ 个卷积模板;
$b^{(l-1)}$:$(l-1)$ 层的偏置参数;
$b^{(l-1)}_j$:映射到 $(l)$ 层中的 Feature Map j 的偏置参数;
$w^{(l)}$:表示 $(l)$ 层的参数;
$w^{(l)}_j$:卷积层第 j 个Feature Map 到 pooling 层第 j 个 Feature Map 是一一对应关系,即每个Feature Map 对应一个$w^{(l)}_j$;
$b^{(l)}$:$(l)$ 层的偏置参数;
$b^{(l)}_j$:卷积层第 j 个Feature Map 到pooling层第 j 个 Feature Map的偏置参数;
$z^{(l)}$:$(l)$ 层的输入;
$a^{(l)}$:$(l)$ 层的输出.
前向传导
CNN 的前向传导,首先从 $(l-1)$ 层到 $(l)$ 层,此处一般为多对多的形式,即对多个通道进行卷积操作,生成多个Feature Map,$(l)$ 层第 j 个Feature Map的输入 $z_j^{(l)}$ 的计算如下:
\[\mathbf{z}_j^{(l)} = \left ( \sum_{j \in M_j}\mathbf{a}_i^{(l-1)}*\mathbf{K}_{ij}^{(l-1)}\right)+b_j^{(l-1)}\]
需要注意:这里 $\mathbf{z}_j^{(l)},\mathbf{a}_i^{(l-1)},\mathbf{K}_{ij}^{(l-1)}$ 均为向量形式," * "表示卷积操作,$\mathbf{z}_j^{(l)}$ 代表 第j 个 Feature Map 的输入,$\mathbf{a}_i^{(l-1)}$ 代表第 $(l-1)$ 层第 i 个 Feature Map的输出,$\mathbf{K}_{ij}^{l-1}$ 代表第 j 个卷积核中第 i 个卷积模板,要生成 $(l)$ 层的第 j 个Feature Map,需要对 $(l-1)$ 层的 $M_j$ 个通道同时进行卷积操作,对得到的结果加偏置求和即可。
第 $(l)$ 层的输出只需要对输入$z_j^{(l)}$ 做一个激活函数即可:

综上,从
层 到
层可以用下图描述:

接下来从
到传导到第
层,此处对应pooling 操作,一般为一对一的形式,
层的第 N 个 Feature Map 生成
层的N个 Feature Map ,计算过程如下:

这里down(.)对应的是一个下采样(sub-sampling) 函数,这个函数会对
层的输出中的n-n的像素块进行pooling操作,使得输出在横纵方向都缩小n倍。经过down(.)操作后,
与
有相同的 size 根据以上公式计算
即可。同理,输出继续做一个映射:

至此,前向传导过程已经可以求得,接下来与MLP类似,就是根据链式求导法则,求得残差的反向传导。
前馈 (Back Propagation)
对于
pooling 层,假设已知其第 j 个Feature Map 的残差向量
,将其传导到
,即pooling层的误差传导到卷积层:

比如对于
,即
层的第 j 个 Feature Map 的残差项如下图左,对其做
操作,得到下图右:

后
操作与
相反,
操作会还原
的残差map,使其与卷积层的map大小一致,即还原到down(.)之前的大小。这里残差为一对一传递,将层
的map的激活函数的偏导数与从第
层的
得到的残差map逐元素相乘,最后乘以参数
即可,注意这里
为一个常量,每个Feature Map j 对应一个参数
。
卷积层
与
层一般为多对多的关系,根据以上分析求得了卷积层的残差项
,接下来就是卷积层的残差反向传导的过程。卷积层前面分两种情况,1)若卷积层前面为pooling层,则上面假设已知的
就是根据这里的推导所求得,并不是凭空出现。2)卷积层前面为初始输入。
首先回忆卷积过程,卷积核 j 会对
层多个通道进行卷积(每个通道对应 j 的一个卷积模板
)求和,才会得到得到层
的第 j 个 Feature Map,所以
层的通道 i 的残差项应该由与之相关的层
的所有Feature Map j 共同前向传导。假设与
层的通道 i 相关的
的所有Feature Map 共有 M 个,则有:

后做卷积的意思是完全卷积 假设输入图像 A 大小为 a x b,卷积核 B 大小为c x d,
操作会对A进行填充,在 A 左右各填充(d-1)列,上下各填充(c-1)行,即
后 A 的大小变为( a+2c-2)x(b+2d-2),用B对
后的A做卷积,则卷积返回的大小为(a+b-1)x(a+b-1)。
即为旋转180度。
此处公式设计到卷积操作,形式比较复杂,下面引入一个示例来讲解上述公式:
层的大小为 3 x 3,对
层的通道 i (为了便于说明,假设
层为单通道),通过如下两个卷积核
、
,得到
层的两个Feature Map,假设其残差已经求得(前边已经讲过如何求卷积层的残差),残差分别为
。

分别进行
操作与
操作:

将
与
进行卷积,
与
进行卷积:

注意此处不考虑
项(或者认为是线性激活 即
= 1),对结果求和有:

以上过程即完成了整个公式
的计算,为什么这么计算呢?可以把以上过程展开,把
与
展开为全连接的形式,(此处清楚起见,只写了
),根据MLP中误差按权值平均反向传导的形式 可求得
层的残差
,其实归根到底还是MLP得形式。

求解网络参数的导数
至此,关于CNN中的输入前向传导与残差的后向反馈全部计算完成,下面可以根据
来对网络的权值
进行求导。
假设当前损失函数为
1)对于
,根据链式求导法则:


根据残差的定义与前边的计算公式:

可得到如下公式,公式中的累加是因为 conv 层中 n *n 的区域变为 1个 1*1 的 pooling 元素,但是 这 n*n 的权值取值是一样的,所以对该权值求导是 pooling 层所有节点的累加:


这里
均为实数,且
中的所有元素的参数均为
,所以对结果向量进行求和操作。这里的
代表对
层Feature Map j 中的所有元素求和
2)对于
,根据链式求导法则:


根据残差的定义与前边的计算公式:

可得:


同样通过一个实例说明关于卷积核的偏导数求解过程,对
层的通道 i 用卷积核
进行卷积操作,得到
层的 Feature Map j,其残差
已经求得,对于下图左的卷积过程展开,下图右为展开后:


注意这里
层的节点① ② ④ ⑤ 用卷积核
卷积生成生成
层的节点①,即
层的节点① ② ④ ⑤ 与
层的节点①通过权值
相连,分别为
回忆传统的MLP网络的参数求导公式:

所以这里有对于单个
层的节点①对应的权值求导有:

考虑
层的节点② ③ ④对应的权值与节点①对应的权值相等(用的同一卷积核
):所以可以忽略
节点对应的下标:

同样分别对节点
层的节点② ③ ④对应的权值求导,比如对于节点 ④:

最终将偏导数项相加有:

下图描述了以上过程,等等,仔细观察一下以上公式,这不就是用
层残差Map 对
层的输出
做卷积吗?oh my god,
的导数可以通过对
层的输出
与卷积层
的残差矩阵卷积得到!!
、
总结以上公式综上所述:
1)任意层前向传到到卷积层与卷积层前向传导到pooling层


2)pooling层前馈到卷积层,与卷积层前馈到任意层


3)任意层与卷积层之间参数的求导

4)pooling层与卷积层之间参数的求导

一些复杂的卷积操作matlab函数('valid' 与 'full' 表示的卷积模式不同):


至此,CNN中的前后向传导的过程全部推倒完毕,其实万变不离其宗,归根到底还是MLP那一套BP算法,接下来就是实现CNN了,也就是cs231n的作业。
参考:
Notes on Convolutional Neural Networks,Jake Bouvrie
http://www.cnblogs.com/tornadomeet/p/3468450.html
http://blog.csdn.net/zouxy09/article/details/9993371
(六)6.18 cnn 的反向传导算法的更多相关文章
- CS229 6.18 CNN 的反向传导算法
本文主要内容是 CNN 的 BP 算法,看此文章前请保证对CNN有初步认识. 网络表示 CNN相对于传统的全连接DNN来说增加了卷积层与池化层,典型的卷积神经网络中(比如LeNet-5 ),开始几层都 ...
- UFLDL 教程学习笔记(二)反向传导算法
UFLDL(Unsupervised Feature Learning and Deep Learning)Tutorial 是由 Stanford 大学的 Andrew Ng 教授及其团队编写的一套 ...
- 卷积神经网络(CNN)反向传播算法
在卷积神经网络(CNN)前向传播算法中,我们对CNN的前向传播算法做了总结,基于CNN前向传播算法的基础,我们下面就对CNN的反向传播算法做一个总结.在阅读本文前,建议先研究DNN的反向传播算法:深度 ...
- 卷积神经网络(CNN)前向传播算法
在卷积神经网络(CNN)模型结构中,我们对CNN的模型结构做了总结,这里我们就在CNN的模型基础上,看看CNN的前向传播算法是什么样子的.重点会和传统的DNN比较讨论. 1. 回顾CNN的结构 在上一 ...
- 反向传播算法 Backpropagation Algorithm
假设我们有一个固定样本集,它包含 个样例.我们可以用批量梯度下降法来求解神经网络.具体来讲,对于单个样例(x,y),其代价函数为:这是一个(二分之一的)方差代价函数.给定一个包含 个样例的数据集,我们 ...
- 神经网络训练中的Tricks之高效BP(反向传播算法)
神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) zouxy09@qq.com http://blog.csdn.net/zouxy09 ...
- 循环神经网络(RNN)模型与前向反向传播算法
在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系.今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Rec ...
- (3)Deep Learning之神经网络和反向传播算法
往期回顾 在上一篇文章中,我们已经掌握了机器学习的基本套路,对模型.目标函数.优化算法这些概念有了一定程度的理解,而且已经会训练单个的感知器或者线性单元了.在这篇文章中,我们将把这些单独的单元按照一定 ...
- CNN的反向传播
在一般的全联接神经网络中,我们通过反向传播算法计算参数的导数.BP 算法本质上可以认为是链式法则在矩阵求导上的运用.但 CNN 中的卷积操作则不再是全联接的形式,因此 CNN 的 BP 算法需要在原始 ...
随机推荐
- UITableView多选删除
设置一个在编辑状态下点击可改变图片的cell FileItemTableCell.h #import <UIKit/UIKit.h> @interface FileItemTableCel ...
- Oracle MySQL
http://blog.jobbole.com/46510/ http://blackproof.iteye.com/blog/1570456 http://blog.csdn.net/yzsind/ ...
- poj 3072(最短路)
题目链接:http://poj.org/problem?id=3072 一涉及稍微计算几何方面的东西就要做好久,一开始先用SPFA写的,可能是由于松弛次数过多导致精度损失,郁闷了好久,然后改成Dijk ...
- C#中out的用法
out的用法 out 关键字会导致参数通过引用来传递.这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化.若要使用 out 参数,方法定义和调用方法都必须显式使用 out ...
- YARN集群维护部分问题汇总
云梯开发人员在云梯Yarn集群的搭建和维护过程中做了许多工作,本文选择这期间部分较为典型的问题,通过对这些问题的分析和解决方案,为大家分享分布式系统问题调查的经验. 调查的问题 1. 2013年初引入 ...
- oci.dll文件是用来干嘛的? 如果没有安装ORACLE客户端提示oci.dll未加载
oracle数据库开发编程中,没有找到oci.dll,一般是系统的 path 设置有问题, 查找oci.dll, 然后加入到系统路径.oci.dll 可下载解压到系统盘的system32目录下.然后打 ...
- online judge 提交代码应该注意的事项
首先,eclipse工程上出现红色的惊叹号,这个时候一般是工程的参考library或者build path的jar文件或者库文件缺失,可以右键工程,打开properties,点击 java build ...
- Spring AOP 创建切面
增强被织入到目标类的所有方法中,但是如果需要有选择性的织入到目标类某些特定的方法中时,就需要使用切点进行目标连接点的定位.增强提供了连接点方位信息:如织入到方法前面.后面等,而切点进一步描述织 ...
- 总结JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作
一.Iframe 篇 //&&&&&&&&&&&&&&&&&&a ...
- GraphicsMagick / ImageMagick缺少lib报错no decode delegate for this image format
下载相应的lib,编译安装就行了 cd ~ #下载包 wget http://www.imagemagick.org/download/delegates/zlib-1.2.7.tar.gz wget ...