CNN中卷积核与卷积运算的前向推导与推导过程

@CNN中卷积核与卷积运算的前向推导与推导过程
作者:技术烧
链接:https://www.jianshu.com/p/daaaeb718aed
来源:简书
CNN神经网络算法是常用的模式识别算法,该算法通过卷积运算将图片特征存储到多个卷积核中,卷积核通过算法的反向传输一步步逼近于图片特征,最常用的反向传导方法是BP反向传导方法,采用最速下降法,将结果误差传递到每一个过程参数中,对于该方法在后面会做专门的介绍,本文主要介绍CNN神经网络中卷积步骤的前向与反向传导过程。

为何会专门开这个题目来讨论,因为在很多的博文中,只是很随意介绍该算法的过程,更多的是通过抄袭而来,让很多的读者感到困惑,另外,由于matlab中的conv2函数是严格按照卷积运算而来,因此很多人会困惑翻转问题,因此本博文将仔细介绍下整个卷积过程与反向卷积过程。后面将会推出关于卷积意义的探讨。

1、卷积过程

根据离散二维卷积公式,有:

CNN中卷积核与卷积运算的前向推导与推导过程

其中A为被卷积矩阵,K为卷积核,B为卷积结果,该公式中,三个矩阵的排序均从0开始,即A矩阵的序号如下所示:

CNN中卷积核与卷积运算的前向推导与推导过程

由于该矩阵的序号排列方式与我们平时的书写方式不同,为了方便,我将上面卷积公式改写成下面的公式,后面的分析也用该公式进行分析:

CNN中卷积核与卷积运算的前向推导与推导过程

该公式所用矩阵就是我们所熟悉的从A11开始的矩阵了:
CNN中卷积核与卷积运算的前向推导与推导过程

现在对于上面卷积过程进行分析:我们用来做例子的A矩阵为m* m(3* 3)二维矩阵,K为n*n(2 *2)的二维矩阵。
CNN中卷积核与卷积运算的前向推导与推导过程

卷积过程先将卷积核逆时针旋转180°,被卷积矩阵扩展到(m+n)*(m+n)大小,将扩展部分用0代替,其序号用负数代替,即如下所示:
CNN中卷积核与卷积运算的前向推导与推导过程

即有B11=A00* K22+A01* K21+A10* K12+A11* K11 (1)

同理:

B12=A01* K22+A02* K21+A11* K12+A12* K11

B13=A02* K22+A03 * K21+A12* K12+A13* K11

B14=A03* K22+A04* K21+A13* K12+A14* K11

B21=A10* K22+A11* K21+A20* K12+A21* K11

B22=A11* K22+A12* K21+A21* K12+A22* K11

B23=A12* K22+A13* K21+A22* K12+A23* K11

B24=A13* K22+A14* K21+A23* K12+A24* K11

B31=A20* K22+A21* K21+A30* K12+A31* K11

B32=A21* K22+A22* K21+A31* K12+A32* K11

B33=A22* K22+A23* K21+A32* K12+A33* K11

B34=A23* K22+A24* K21+A33* K12+A34* K11

B41=A30* K22+A31* K21+A40* K12+A41* K11

B42=A31* K22+A32* K21+A41* K12+A42* K11

B43=A32* K22+A33* K21+A42* K12+A43* K11

B44=A33* K22+A34* K21+A43* K12+A44* K11

以上便是整个卷积计算过程,在Matlab中可用conv2函数进行卷积计算:

B=conv2(A,K,’full’);

Conv2函数的第一个输入参数为被卷积矩阵,第二个为卷积核,第三个参数可输入卷积输出形式,总共有三个:‘full’,‘same’和‘valid’,用下面的例子便可以看出这三个的区别:

A=[1 2 3

4 5 6

7 8 9];

K=[1 2

3 4];

B=conv2(A,K,‘full’)

C=conv2(A,K,‘same’)

D=conv2(A,K,‘valid’)

输出结果为:

B =

1 4 7 6

7 23 33 24

19 53 63 42

21 52 59 36

C =

23 33 24

53 63 42

52 59 36

D =

23 33

53 63

‘full’的输出结果为n+m-1,’same’的输出结果为m,’valid’的输出结果为m-n+1。在CNN算法的前向过程,其卷积是’valid’型卷积,因此我们只对’valid’型卷积的反向推导过程进行推导,另外两种类型的推导类似。

2、卷积过程的反向推导

假设最终误差E传递到B处的误差为C,B11的误差为C11,B12的误差为C12…,当其前向运算为’valid’类型时则其误差矩阵可表示为以下C矩阵:
CNN中卷积核与卷积运算的前向推导与推导过程

(a)对A矩阵进行求导

根据矩阵传递规则,有下面传递性质:

CNN中卷积核与卷积运算的前向推导与推导过程

现将上面公式组(1)进行组合,举例对A22进行求导:

CNN中卷积核与卷积运算的前向推导与推导过程

E=C22+C23+C32+C33
CNN中卷积核与卷积运算的前向推导与推导过程

则有:
CNN中卷积核与卷积运算的前向推导与推导过程

同理,可对A矩阵其他成员进行求导,可得出规律是:矩阵A的误差是矩阵B的误差C与卷积核K’(K’是卷积核K旋转180°的矩阵)的卷积。

因此当matlab中,输入的前向函数为:B=conv2(A,K,’valid’);

其对A误差的反向传递为:
CNN中卷积核与卷积运算的前向推导与推导过程

(b)对卷积核K矩阵进行求导

与对A求导原理相同,现对K11进行求导如下:
CNN中卷积核与卷积运算的前向推导与推导过程

则有:
CNN中卷积核与卷积运算的前向推导与推导过程

K的其他成员的求导同样可以用该方式求取,为了方便我们观察,我们再对K22求导:
CNN中卷积核与卷积运算的前向推导与推导过程

我们可以总结规律:

当matlab中,输入的前向函数为:

B=conv2(A,K,’valid’);

其对K的反向函数为:
CNN中卷积核与卷积运算的前向推导与推导过程

由于网上多个编辑的版本,导致有时候在是否转动180°的问题上犯困难,因此

应为其前向与反向统一公式

另外,我也给出了另外一种习惯的前向反向公式:

当个输入前向函数为:

B=conv2(A,rot90(K,2),’valid’);

其对A的反向函数为:
CNN中卷积核与卷积运算的前向推导与推导过程

对K的反向函数为:
CNN中卷积核与卷积运算的前向推导与推导过程