卷积神经网络参数更新公式推导

内容比较全,转载收藏,备不时之需。

一、引言

与全连接神经网络不同,卷积神经网络每一层中的节点并不是与前一层的所有神经元节点相连,而是只与前一层的部分节点相连。并且和每一个节点相连的那些通路的权重都是相同的。举例来说,对于二维卷积神经网络,其权重就是卷积核里面的那些值,这些值从上而下,从左到右要将图像中每个对应区域卷积一遍然后将积求和输入到下一层节点中**,得到下一层的特征图。因此其权重和偏置更新公式与全连接神经网络不通。通过卷积核替代权重矩阵的意义在于:1. 降低的计算量;2. 权重得到共享,降低了参数量。

UFLDL(Unsupervised feature learning and deep learning tutorial)课程只给出了线性回归,Logistic回归,多层神经网络等公式推导,对于CNN只给出了结论,缺乏公式推导过程。

根据《Deep learning》这本书的描述,卷积神经网络有3个核心思想:

1. 稀疏交互(sparse interactions),即每个节点通过固定个(一般等于卷积核元素的数目,远小于前一层节点数)连接与下一层的神经元节点相连; 尽管是稀疏连接,但是在更深层的神经单元中,其可以间接地连接到全部或大部分输入图像。如果采用了步幅卷积或者池化操作,那么这种间接连接全部图像的可能性将会增加。

2. 参数共享(parameter sharing),以2D卷积为例,每一层都通过固定的卷积核产生下一层的特征图,而这个卷积核将从上到下、从左到右遍历图像每一个对应区域;

3. 等变表示(equivariant representations),卷积和参数共享的形式使得神经网络具有平移等变形,即f(g(x))=g(f(x))。另外,pooling操作也可以使网络具有局部平移不变形。局部平移不变形是一个很有用的性质,尤其是当我们只关心某个特征是否出现而不关心它出现的具体位置时。池化可以看作增加了一个无线强的先验,这一层学的函数必须具有对少量平移的不变形。

一般说的神经网络的一层包括了那个仿射变换、探测级的非线性**函数,和池化操作,如下图所示:

二、预备知识:

1. 二维卷积的计算。需要先将卷积核顺时针翻转180度,然后再和图像中对应位置像素值相乘求和,这样得到的结果才是卷积后特征位置的点。如下图所示:

a. 在tensorflow中,卷积核的定义直接就是旋转后的卷积核,计算时对应位置相乘相加即可;

b. 在numpy, scipy和matlab中,定义的卷积核是没有旋转过的,计算时需要先旋转180度,然后对应位置相加再求和。

2. 二维卷积的定义为:

三、网络结构

1. 卷积核采用K表示,大小为:n*n,输入X为m*m矩阵,K_rot表示K旋转180度;

2. 每一层**前的特征向量为Z,**后的特征向量为Y,即Y=f(Z);

3. 每一层的输入X可以看成是前一层**后的特征向量Y;

4. 损失函数用J来表示。

四、前向(Forward Propagation)传播公式

1. 仿射变换:

卷积核大小为n*n,所以有效卷积定义:

2. 第h层卷积层输出:

    **前:

  **后:

一般有平均池化和最大池化两种方式,本质上都是对特征图中的元素进行加权求和。平均池化是每个特征元素权重都一样,最大池化是最大元素那个权重为1,其余为0。假设每个特征元素权重都是

\lambda^{h+1}

,池化步长为d,第h+1层池化层输出为:

池化后输出的Y大小为:(m-n+1)/d*(m-n+1)/d,其中(m-n+1)为上一个卷积操作后的特征图宽度或高度。需要注意的是,这里的l+1只是为了表示方便,实际上的第l+1层指的是有卷积层和池化层共同组成的整体算作一层,如上图所示。

4. 第h+2层卷积层:

**前输出:

用矩阵形式表达为:

五、后向(Backward Propagation)参数更新公式

1. 对卷积层**前输出的偏导数:

损失函数为J,对卷积层输出求导与对下一层池化层输出求导之间的关系

上面的遍历i,j其实有些没用,只有和z_p,q有关的才会被用到。

用矩阵表示上式为:

其中

{up}_{d \times d}

表示在水平和垂直方向复制d次,从而使得和池化前特征图大小一样。

2. 对池化层**前输出的偏导数:

上面的i和j的起点应该从和z^{h_1}_{p,q}有关的那个方形区域的左上角开始。上式可写为:

用矩阵表达为:

用matlab卷积函数可以写为:

3. 对卷积层卷积核和偏置的偏导数:

其中

上述为对rotate后的卷积核求的导数,对无rotate的只需将将结果rotate180度即可,用matlab代码可以写成如下:

4. 对池化层权重和偏置的偏导数:

用矩阵形式写为:

六、总结:

    CNN公式推导的主要难点在于卷积核适合局部像素进行运算以及池化层的函数表达上。对于其他的如跨层连接或者有回路的网络,具体的参数递推公式估计会更难。估计tensorflow等框架里面是将每个模块封装好的,所以底层数据流不用管具体是怎么算的,只需要像搭积木那样直接堆叠即可。下一步就是研究将sparse coding融合到CNN中,推导其参数更新公式。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值