跳转至

17.1 卷积的前向计算原理

17.1 卷积的前向计算⚓︎

17.1.1 卷积的数学定义⚓︎

连续定义⚓︎

h(x)=(f*g)(x) = \int_{-\infty}^{\infty} f(t)g(x-t)dt \tag{1}

卷积与傅里叶变换有着密切的关系。利用这点性质,即两函数的傅里叶变换的乘积等于它们卷积后的傅里叶变换,能使傅里叶分析中许多问题的处理得到简化。

离散定义⚓︎

h(x) = (f*g)(x) = \sum^{\infty}_{t=-\infty} f(t)g(x-t) \tag{2}

17.1.2 一维卷积实例⚓︎

有两枚骰子f,g,掷出后二者相加为4的概率如何计算?

第一种情况:f(1)g(3), 3+1=4,如图17-9所示。

图17-9 第一种情况

第二种情况:f(2)g(2), 2+2=4,如图17-10所示。

图17-10 第二种情况

第三种情况:f(3)g(1), 1+3=4,如图17-11所示。

图17-11 第三种情况

因此,两枚骰子点数加起来为4的概率为:

\begin{aligned} h(4) &= f(1)g(3)+f(2)g(2)+f(3)g(1) \\\\ &=f(1)g(4-1) + f(2)g(4-2) + f(3)g(4-3) \end{aligned}

符合卷积的定义,把它写成标准的形式就是公式2:

h(4)=(f*g)(4)=\sum _{t=1}^{3}f(t)g(4-t)

17.1.3 单入单出的二维卷积⚓︎

二维卷积一般用于图像处理上。在二维图片上做卷积,如果把图像Image简写为I,把卷积核Kernal简写为K,则目标图片的第(i,j)个像素的卷积值为:

h(i,j) = (I*K)(i,j)=\sum_m \sum_n I(m,n)K(i-m,j-n) \tag{3}

可以看出,这和一维情况下的公式2是一致的。从卷积的可交换性,我们可以把公式3等价地写作:

h(i,j) = (I*K)(i,j)=\sum_m \sum_n I(i-m,j-n)K(m,n) \tag{4}

公式4的成立,是因为我们将Kernal进行了翻转。在神经网络中,一般会实现一个互相关函数(corresponding function),而卷积运算几乎一样,但不反转Kernal:

h(i,j) = (I*K)(i,j)=\sum_m \sum_n I(i+m,j+n)K(m,n) \tag{5}

在图像处理中,自相关函数和互相关函数定义如下:

  • 自相关:设原函数是f(t),则h=f(t) \star f(-t),其中\star表示卷积
  • 互相关:设两个函数分别是f(t)和g(t),则h=f(t) \star g(-t)

互相关函数的运算,是两个序列滑动相乘,两个序列都不翻转。卷积运算也是滑动相乘,但是其中一个序列需要先翻转,再相乘。所以,从数学意义上说,机器学习实现的是互相关函数,而不是原始含义上的卷积。但我们为了简化,把公式5也称作为卷积。这就是卷积的来源。

结论:

  1. 我们实现的卷积操作不是原始数学含义的卷积,而是工程上的卷积,可以简称为卷积
  2. 在实现卷积操作时,并不会反转卷积核

在传统的图像处理中,卷积操作多用来进行滤波,锐化或者边缘检测啥的。我们可以认为卷积是利用某些设计好的参数组合(卷积核)去提取图像空域上相邻的信息。

按照公式5,我们可以在4x4的图片上,用一个3x3的卷积核,通过卷积运算得到一个2x2的图片,运算的过程如图17-12所示。

图17-12 卷积运算的过程

17.1.4 单入多出的升维卷积⚓︎

原始输入是一维的图片,但是我们可以用多个卷积核分别对其计算,从而得到多个特征输出。如图17-13所示。

图17-13 单入多出的升维卷积

一张4x4的图片,用两个卷积核并行地处理,输出为2个2x2的图片。在训练过程中,这两个卷积核会完成不同的特征学习。

17.1.5 多入单出的降维卷积⚓︎

一张图片,通常是彩色的,具有红绿蓝三个通道。我们可以有两个选择来处理:

  1. 变成灰度的,每个像素只剩下一个值,就可以用二维卷积
  2. 对于三个通道,每个通道都使用一个卷积核,分别处理红绿蓝三种颜色的信息

显然第2种方法可以从图中学习到更多的特征,于是出现了三维卷积,即有三个卷积核分别对应书的三个通道,三个子核的尺寸是一样的,比如都是2x2,这样的话,这三个卷积核就是一个3x2x2的立体核,称为过滤器Filter,所以称为三维卷积。

图17-14 多入单出的降维卷积

在上图中,每一个卷积核对应着左侧相同颜色的输入通道,三个过滤器的值并不一定相同。对三个通道各自做卷积后,得到右侧的三张特征图,然后再按照原始值不加权地相加在一起,得到最右侧的白色特征图,这张图里面已经把三种颜色的特征混在一起了,所以画成了白色,表示没有颜色特征了。

虽然输入图片是多个通道的,或者说是三维的,但是在相同数量的过滤器的计算后,相加在一起的结果是一个通道,即2维数据,所以称为降维。这当然简化了对多通道数据的计算难度,但同时也会损失多通道数据自带的颜色信息。

17.1.6 多入多出的同维卷积⚓︎

在上面的例子中,是一个过滤器Filter内含三个卷积核Kernal。我们假设有一个彩色图片为3x3的,如果有两组3x2x2的卷积核的话,会做什么样的卷积计算?看图17-15。

图17-15 多入多出的卷积运算

第一个过滤器Filter-1为棕色所示,它有三卷积核(Kernal),命名为Kernal-1,Keanrl-2,Kernal-3,分别在红绿蓝三个输入通道上进行卷积操作,生成三个2x2的输出Feature-1,n。然后三个Feature-1,n相加,并再加上b1偏移值,形成最后的棕色输出Result-1。

对于灰色的过滤器Filter-2也是一样,先生成三个Feature-2,n,然后相加再加b2,最后得到Result-2。

之所以Feature-m,n还用红绿蓝三色表示,是因为在此时,它们还保留着红绿蓝三种色彩的各自的信息,一旦相加后得到Result,这种信息就丢失了。

17.1.7 卷积编程模型⚓︎

上图侧重于解释数值计算过程,而图17-16侧重于解释五个概念的关系:

  • 输入 Input Channel
  • 卷积核组 WeightsBias
  • 过滤器 Filter
  • 卷积核 kernal
  • 输出 Feature Map

图17-16 三通道经过两组过滤器的卷积过程

在此例中,输入是三维数据(3x32x32),经过2x3x5x5的卷积后,输出为三维(2x28x28),维数并没有变化,只是每一维内部的尺寸有了变化,一般都是要向更小的尺寸变化,以便于简化计算。

对于三维卷积,有以下特点:

  1. 预先定义输出的feature map的数量,而不是根据前向计算自动计算出来,此例中为2,这样就会有两组WeightsBias
  2. 对于每个输出,都有一个对应的过滤器Filter,此例中Feature Map-1对应Filter-1
  3. 每个Filter内都有一个或多个卷积核Kernal,对应每个输入通道(Input Channel),此例为3,对应输入的红绿蓝三个通道
  4. 每个Filter只有一个Bias值,Filter-1对应b1,Filter-2对应b2
  5. 卷积核Kernal的大小一般是奇数如:1x1, 3x3, 5x5, 7x7等,此例为5x5

对于上图,我们可以用在全连接神经网络中的学到的知识来理解:

  1. 每个Input Channel就是特征输入,在上图中是3个
  2. 卷积层的卷积核相当于隐层的神经元,上图中隐层有2个神经元
  3. W(m,n), m=[1,2], n=[1,3]相当于隐层的权重矩阵w_{11},w_{12},......
  4. 每个卷积核(神经元)有1个偏移值

17.1.8 步长 stride⚓︎

前面的例子中,每次计算后,卷积核会向右或者向下移动一个单元,即步长stride = 1。而在图17-17这个卷积操作中,卷积核每次向右或向下移动两个单元,即stride = 2。

图17-17 步长为2的卷积

在后续的步骤中,由于每次移动两格,所以最终得到一个2x2的图片。

17.1.9 填充 padding⚓︎

如果原始图为4x4,用3x3的卷积核进行卷积后,目标图片变成了2x2。如果我们想保持目标图片和原始图片为同样大小,该怎么办呢?一般我们会向原始图片周围填充一圈0,然后再做卷积。如图17-18。

图17-18 带填充的卷积

17.1.10 输出结果⚓︎

综合以上所有情况,可以得到卷积后的输出图片的大小的公式:

H_{Output}= {H_{Input} - H_{Kernal} + 2Padding \over Stride} + 1
W_{Output}= {W_{Input} - W_{Kernal} + 2Padding \over Stride} + 1

以图17-17为例:

H_{Output}={5 - 3 + 2 \times 0 \over 2}+1=2

以图17-18为例:

H_{Output}={4 - 3 + 2 \times 1 \over 1}+1=4

两点注意:

  1. 一般情况下,我们用正方形的卷积核,且为奇数
  2. 如果计算出的输出图片尺寸为小数,则取整,不做四舍五入