windows编译tensorflow tensorflow单机多卡程序的框架 tensorflow的操作 tensorflow的变量初始化和scope 人体姿态检测 segmentation标注工具 tensorflow模型恢复与inference的模型简化 利用多线程读取数据加快网络训练 tensorflow使用LSTM pytorch examples 利用tensorboard调参 深度学习中的loss函数汇总 纯C++代码实现的faster rcnn tensorflow使用记录 windows下配置caffe_ssd use ubuntu caffe as libs use windows caffe like opencv windows caffe implement caffe model convert to keras model flappyBird DQN Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Neural Networks Fast-style-transfer tensorflow安装 tensorflow DQN Fully Convolutional Models for Semantic Segmentation Transposed Convolution, Fractionally Strided Convolution or Deconvolution 基于tensorflow的分布式部署 用python实现mlp bp算法 用tensorflow和tflearn搭建经典网络结构 Data Augmentation Tensorflow examples Training Faster RCNN with Online Hard Example Mining 使用Tensorflow做Prisma图像风格迁移 RNN(循环神经网络)推导 深度学习中的稀疏编码思想 利用caffe与lmdb读写图像数据 分析voc2007检测数据 用python写caffe网络配置 ssd开发 将KITTI的数据格式转换为VOC Pascal的xml格式 Faster RCNN 源码分析 在Caffe中建立Python layer 在Caffe中建立C++ layer 为什么CNN反向传播计算梯度时需要将权重旋转180度 Caffe使用教程(下) Caffe使用教程(上) CNN反向传播 Softmax回归 Caffe Ubuntu下环境配置

为什么CNN反向传播计算梯度时需要将权重旋转180度

2016年05月17日

为什么CNN反向传播计算梯度时需要将权重旋转180度

CNN最近在计算机领域遍地开花,最基础的图像分类,目标检测,图像分割,跟踪,边缘检测等Topic的桥头堡都插上了CNN的大旗,在CNN不断刷新传统方法的结果时,我们需要深入的理解CNN的原理。

CNN最主要的就是梯度优化算法,正向传播,反向梯度传播更新权重。具体的推导和演示请看我前面的博客http://manutdzou.github.io/2016/05/15/CNN-backpropagation.html。如果你深入理解算法原理会发现一个很怪异的地方,在反向计算梯度时需要将卷积核的权重旋转180度?为什么呢?这个问题起初也困扰我很久,现在作详细地解释。

1

上述公式表示第$j$层feature map的$\delta$等于第$j+1$层的feature map的$\delta$和第$j+1$层的卷积核旋转180度后作卷积再乘以第$j$层feature map的激发函数。

由于卷积操作等于翻转180度后的相关操作,因此表述成CNN前向卷积,反向相关运算。在这再一次被数学的精妙所吸引啊,大自然的对偶关系真是造物主的神迹,咳咳,跑题了。。。

为什么要翻转卷积核呢?其实本质上还是BP算法。

在多层感知器中计算$\delta$误差如下:

2

前层节点的$\delta$等于和该层节点相连接的$w$和后层节点的$\delta$相乘。BP算法的本质就是梯度链式求导。

那如何将多层感知器的求导规则对应卷积网络的推导呢?卷积网络本质上也是多层感知器,只是有了感受野和权值共享。

3

如上图将全连接的多层感知器改成权值共享的卷积网络。上图表示一个$3\times 3$的feature map和$2\times 2$的卷积核卷积,如果你还看不出来那下面一个图将完全展示上图的过程:

4

由于卷积操作等于翻转180度后的相关,所以需要将卷积核上下左右翻转,所以一共就输出4个节点,每个节点是一次相关操作,每个节点和对应颜色卷积核参数的连接情况非常清楚了。

展开成为MLP以后你应该会计算梯度传播了吧,就是BP算法。

5

假设卷积后的feature map的$\delta$为$\delta_{11}$,$\delta_{12}$,$\delta_{21}$,$\delta_{22}$,所以根据链式求导规则不考虑激发函数,前一层第一个节点的$\delta$值为$\delta_{11}w_{22}$,第二个节点的的$\delta$值为$\delta_{11}w_{21}+\delta_{12}w_{22}$,如下图

6

7

由上图可以看出前一层feature map的$\delta$正好等于后一层feature map的$\delta$和翻转180度后的卷积核做卷积(吐槽下我都觉得叙述的好拗口,但这就是真理啊)。

所以如果前向卷积核是做卷积,则后向传播算feature map的$\delta$时候卷积核做翻转后的卷积(或者叫相关);如果前向卷积核是做相关,则后向传播算feature map的$\delta$时候卷积核做翻转后的相关(或者叫卷积)!有的库用相关实现,有的库用卷积实现,本质上都是一样的,而且这里的卷积都是指严格意义上的离散卷积。卷积神经网络也可以叫做相关神经网络,只是卷积神经网络听上去可能更高大上一点吧。

理论推导

警示:前方高能

在传统的MLP中,对于一个神经元

\[\delta_{j}^{l}=\frac{\partial C}{\partial z_{j}^{l}}\]

其中$z_{j}^{l}$定义为

\[z_{j}^{l}=\sum_{k}w_{jk}^{l}a_{k}^{l-1}+b_{j}^{l}\]

$a_{j}^{l}=\sigma \left ( z_{j}^{l} \right )$是当前层的激发函数,可以是sigmoid, hyperbolic tangent or relu

将MLP替换为Convolutions将$z_{j}$替换为$z_{x,y}$:

8

这是一个标准的CNN前向传播时候的写法,并且根据卷积定理转换为相关运算。同样error对$l$层求倒数:

9

其中$z_{x,y}^{l}$和 $z_{x{}’,y{}’}^{l+1}$连接,将上式写成如下形式:

10

第一项为定义的$l+1$层的$\delta$,第二项展开以后变的很大,我们不需要惧怕这样一个大怪兽,其中很多分量求导后都等于0,只有那些以$x=x{}’-a$和$y=y{}’-a$的分量导数不为0。所以最后写成:

11

将$a=x{}’-x$和$b=y{}’-y$替换,则上式写成

14

上述式子是卷积的相关表示形式,也可以写成:

12

这不是很眼熟?如果写成:

\[ROT180\left ( w_{x,y}^{l+1} \right )=w_{-x,-y}^{l+1}\]

这不正是翻转的卷积核么。

最后更新权重的$\delta$

13

也就是卷积核的权重$\delta$等于当前层feature map的$\delta$和前一层feature map的值旋转180度后作卷积或者表述为卷积核的权重$\delta$等于当前层feature map的$\delta$和前一层feature map的值作相关

看我写的辛苦求打赏啊!!!有学术讨论和指点请加微信manutdzou,注明

20


blog comments powered by Disqus