zoukankan      html  css  js  c++  java
  • (六)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)} ight)+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的作业。

     参考:

    UFLDL,Ng

    Notes on Convolutional Neural Networks, Jake Bouvrie 

     

    http://www.cnblogs.com/tornadomeet/p/3468450.html

    http://blog.csdn.net/zouxy09/article/details/9993371

     

  • 相关阅读:
    Cannot resolve symbol 'SpringBootApp
    Java读取ZIP文件ZipEntry.getsize()总是返回-1?
    java 读取zip里面的xml文件
    导出:xml zip
    jquery form submit提交方式
    [转][C#]无法创建虚拟目录。ASP.NET 2.0 尚未在 Web服务器上注册。
    [转][C#].Net反编译利器
    [转][echarts]地图轮播
    [转][C#]AutoFac 使用方法总结
    [转]用代码访问 Https
  • 原文地址:https://www.cnblogs.com/ooon/p/5418555.html
Copyright © 2011-2022 走看看