卷积的意义

2022-11-29 17:34:56 浏览数 (2)

卷积公式

卷积在数学上的表达如下

这是两个函数组合的反常积分。我们用这样一个例子来说明,就是一个人一天的进食和消化情况。

这个f(t)函数代表了进食,横坐标代表着进食的时间,纵坐标代表着进食的数量。

这个g(t)函数代表了消化,横坐标代表着消化的时间,纵坐标代表着剩余量占总进食量的比例。

如果不考虑消化问题,问下午2点的时候,胃里还有多少食物?

这个问题比较简单,就是求一个定积分

f(t)dt就可以了。

但是如果考虑消化问题,就没有那么简单了。假设此人在中午12点吃了一碗米饭,那么到下午两点还剩多少呢?

上图中f(t)函数的12点表示g(t)的原点,此时刚吃下米饭,还没有消化,那么到下午2点的时候剩余的米饭比例就是g(14-12),那么还剩下的米饭量就是f(12)*g(14-12)。当然这只是一个点,如果在上午10点的时候还吃了一个面包,那么在下午2点的食物剩余量是多少呢?

这里以此类推,面包的剩余量就是f(10)*g(14-10),总食物量就是f(12)*g(14-12) f(10)*g(14-10)。

上面是两个特殊的点,如果此人在t时刻前任意一个时刻都在进食,那么到t时刻的剩余的总食物量是多少呢?

我们任意定义一个时刻x时刻,这个x时刻可以是t时刻前的任意一个时刻。那么x时刻本身到t时刻的食物剩余量为f(x)*g(t-x),那么所有时刻的剩余食物量就是求一个定积分

这里我们需要特别注意这两个函数之间的变量的对应关系。

上图中,我们知道在f(t)函数中T时刻吃进去的东西还没有消化,它对应g(t)函数的初始时刻0。

如果以T时刻为基准,那么f(t)函数中T时刻前面的点都相当于是有时间消耗的,离T时刻之前越远的点消耗的时间就越多,食物的消耗量就越大,那么就有了上图的f(t)与g(t)的时刻点一一对应的关系。

通过这两个公式

做比较,可以发现,它们只是积分区间不同,其他都是一样的,这也是卷积公式的物理含义——一个系统,如果输入不稳定,而输出是稳定的,那么就可以用卷积来求系统存量。

卷积之所以叫卷积,我们可以将上面的图中的g(t)进行翻转。

因为对g(t)函数进行了翻转,所以叫卷积。

图像卷积操作

图像的卷积操作的具体过程可以参考Tensorflow深度学习算法整理 中的卷积神经网络,这里不再赘述。

现在我们需要关心的是卷积核对图像的这种卷积操作跟卷积公式

有啥关系?

我们都知道蝴蝶效应。上图中在t时刻发生了飓风,在t时刻之前的x时刻有一群蝴蝶扇动了翅膀,这次事件会对t时刻的飓风产生影响,但是这个影响是会随着时间的推移产生变化。通过g(t)函数,我们知道,这个影响力是随着时间的推移而逐渐衰减的。

那么我们来看这个卷积,它处理的是飓风发生的时候,之前蝴蝶扇动翅膀对自己产生了多少影响。基于此我们可以这样来理解卷积,在某一个时刻发生了一件事,而这件事的产生会受到之前发生很多事的影响。比如说在x时刻发生的事会对t时刻产生影响。具体的影响要看从x时刻到t时刻经历的时间,它会随着时间进行变化。g(x)函数就是规定之前发生的事的影响力是如何变化的。当然这个g(x)函数不一定是衰减的,它可能是随着时间不断变换的,更有可能是增长的。甚至于这个影响并不是随着时间变化的,而是距离变化的,也就是说在f(x)中的横坐标是距离而不是时间,而g(t)函数也就变成了随着距离的变化而产生影响。

那么在图像的卷积操作就是看图像中很多的像素点对某一个像素点是如何影响的。

在深度学习的反向传播过程中,每一个卷积核的初始参数都是随机的,卷积核在不断的学习过程中会固化到一个固定的一组数字,这组数字就代表了图像中某个区域的一组特征。而且卷积核的数量也很多,每个卷积核可能学习到的特征也是不同的。现在假设有这样一个3*3的卷积核

它可以使图像变得更平滑,更朦胧。该操作称为平滑卷积操作,效果如下

所谓平滑操作就是让某一个像素点周围的像素点和自己相差不要太大。该卷积核就是在求平均值,就是让周围的像素点和该像素点相比,该像素点的数值是不是太高了,如果太高了就拉低一点;如果太低了就拉高一点。如此我们可以对卷积核进行这样的理解,它规定了周围的像素点如何对当前像素点产生影响的。

3*3的卷积核看的就是一圈像素点对中间当前像素点产生的影响。5*5、7*7的卷积核就是周围两圈、三圈像素点对中间当前像素点产生的影响。

图像卷积的公式如下所示

f (x,y) 代表图像像素点的输入,g (m,n) 代表卷积核中的各个值。整个公式的意思就是图像中的像素点与卷积核中的值先相乘再相加求和,由于像素点是一个一个离散的,所以这里不能使用积分而是求和。

如果只考虑距离 (x,y) 相邻 1 个像素的影响

上图中左边是图像中的像素点,右边是 g (m,n) 函数 (此时还不是卷积核)。我们以 f (x-1,y-1) 对 f (x,y) 的影响来说明,代入公式 f (x,y)*g (m,n) 有

f(x-1,y-1)*g(x-(x-1),y-(y-1))=f(x-1,y-1)*g(1,1)。

如果考虑 f (x,y) 周围所有的点,则有

在这里我们可以发现左下角的像素点 f (x-1,y-1) 对应的是 g (m,n) 中右上角的值 g (1,1);正下方的 f (x,y-1) 的像素点对应的是 g (m,n) 中正上方的值 g (0,1);右下角的像素点 f (x 1,y-1) 对应的是 g (m,n) 中左上方的值 g (-1,1)。这样的话有点像之前 f (t) 和 g (t) 的反向对应关系,此时我们将 g (m,n) 旋转 180 度

此时我们再来看对应关系,那么它们刚好是相同位置上的彼此对应。故而 g (m,n) 函数不是卷积核,而旋转 180 度之后的才是卷积核。

只有卷积核才可以和图像像素值直接相乘再相加,而把旋转的步骤给省略了,所以它也是一个卷积运算。

卷积神经网络

这里我们想知道的是卷积神经网络是如何对图像进行特征提取的。

这里我们依然要从傅里叶变换切入,有关傅里叶变换的详细内容可以参考高等数学整理 (三) 中的傅立叶变换

上图的左边是一个电脉冲信号,纵轴是电压的高低,横轴是时间;右边是左边对应的频域的信号,横轴是频率,纵轴是频率信号的强弱。

要想把左边的图像变成右边的图像就需要做如下计算

这个就是傅里叶变换的公式。我们提到的信号往往都是指一个物理量在时间上的变化情况,可以是周期的也可以是非周期的。上图中的信号就是非周期的,但其实信号这个概念还可以更广,图片也可以看成是一个信号。图片是静态的,不会随着时间的变化而变化。但是可以把像素点的位置看成是空间里的二维平面坐标轴,像素点的 RGB 值是垂直于该平面的第三个坐标轴。

这个信号的周期就不是时间而是像素点之间的距离。而变换后的频率单位也不再是 Hz。如果依然用二维来表示的话,那么就不再是时域和频域,而是空间域和变换域。

变换域中的一个点是将空间域中的全域信息进行了浓缩。

但变换域中不同的点考虑的角频率 ω 不同,而这个角频率 ω 其实就是不同频率的正弦、余弦信号。

对于在图像中,我们可以把不同的角频率 ω 看成是不同的特征,它是由这个函数决定的。

不同的特征都有不同的特征值,这个特征值就是函数的取值。该函数是一个复变函数,也就是说它具体的取值是一个复数。而复数会提供两个信息,把复数用指数形式表现出来就是

其中是复数的模,代表不同频率的正弦、余弦曲线的振幅;幅角代表不同频率的正弦、余弦函数的相位。具体幅角的大小就是 F (ω) 函数的虚部除以实部,再求反正切的数值。

把所有的特征和特征值相乘,代表这个特征在原信号中的强弱。也就是说把所有的特征都考虑进来,就可以还原出原信号,即把特征和特征值相乘再相加就可以变回原来的信号。因为这里的特征是连续的,所以要对它们求一个定积分。

这个公式就是傅里叶逆变换。

通过以上的分析,我们可以看出卷积神经网络对图像进行特征的提取其实就是把图像看成一个信号,而图像像素的位置构成空间域,然后使用傅里叶变换转成变换域,而变换域中不同频率的正、余弦波就是我们要提取的特征。

以上是把图像中的特征当成一个全局来看待,浓缩到一个像素点中,但我们希望的是把图片中的局部情况浓缩起来而不是全局。

傅里叶变换有一个好处,那就是空间域的波形,在变换域中某种程度上已经可以做到和位置无关了。

无论这个波形在什么位置,它对应到变换域中振幅的图像都是不变的,唯一变化的是相位。这对于特征识别来说非常重要,我们本来只关心有没有这样的一高一低的波形,不太在乎它到底在哪。

如果在空间域中增加了一个一模一样的波形,虽然我们肉眼可以很轻松的识别它是一样的,但是到变换域中却会发生翻天覆地的变化。为什么会发生这样的情况呢?因为傅里叶变换总是从全局出发,一个波形和两个波形是完全不同的。

但如果我们能对空间域增加约束,对傅里叶变换这个感受的范围从全域缩小到局部,那么就能看出来左边和右边这两个波形的特征是一模一样的。这也是为什么不能图省事,把图片直接做一个傅里叶变换就算完成了特征提取。

给傅里叶变换的感受范围加上约束,这个方法叫做加窗傅里叶变换,或者叫短时傅里叶变换。卷积神经网络中的卷积是一个二维的加窗傅里叶变换。

希尔伯特空间变换 (基变换)

上图是傅里叶变换的空间域和变换域的图像和公式。我们可以看到无论是空间域还是变换域,它们都是在一个二维空间中把一个信号的信息全部呈现出来的,它们只有纵横两个维度。

如果我们对描述信号的空间进行升维,升到无穷维。

上图中左边的坐标系代表无穷维空间 H,它上面的一个点,代表右边的二维空间的一条曲线 (横轴是一个实数轴,无穷维各个维度的取值对应其纵轴的值)。这恰好是空间域中的波形曲线,也就是说在空间域中用一条曲线描述的问题,到无穷维空间中只需要一个点就行,它们是一个一一对应的关系。这样就相当于让二维空间的曲线降维成一个点。其实不光是二维空间的曲线,三维、四维空间的图像都可以降维成无穷维空间的一个点,只要图像的维度是有限的,都可以降维成一点。

一个空间中的点可以用向量来表示。当我们把一个 f (t) 函数看成是一个无穷维空间的向量的时候,很多事就会更容易了。比如坐标系变换。

上图中紫色的坐标轴是一个新的坐标系,而该向量在新坐标系中的坐标为

其中是向量在轴上投影的模;该式子的前三项就是向量和坐标轴向量的内积。而第四项就是坐标轴向量的单位向量。这里是在一个无穷维空间中讨论问题,如果这个无穷维空间对向量内积是完备的,那么这样一个是无穷维又有内积的空间被称为希尔伯特空间。

对于向量的内积,如果我们已经知道向量的坐标,那么内积还可以写成两个向量的坐标值逐项相乘再相加。

则向量与的内积如上图所示,由于是无穷连续的实数,所以又可以用一个定积分来表示。

故在轴上的投影最终可以写成

它是内积的定积分乘以新坐标轴的单位向量,而这个单位向量就可以看作是我们前面一直说的特征。不同坐标轴代表着不同的特征,前面的定积分就是这个特征的特征值。

无穷维的向量,对应到二维空间的曲线 F (n),这个二维坐标系是变换域,描述这条曲线的函数就是代表内积的定积分。空间域到变换域,实际就是在希尔伯特空间做了一次坐标变换,变换域里的函数就是坐标变换后特征值的表达式。这个特征值,也就是函数 f (n) 代表的是向量在新坐标系下坐标轴上分量的大小。它跟坐标轴的单位向量相乘,就是向量在各个坐标轴上的分量。这些分量本身就是向量,只要将这些分量向量加起来,其实就是向量本身,所以这个变换的逆过程可以写成

我们将 n 用 ω 来替换,坐标轴用一组具体的向量 e^iωt 代入,就有了

因为 e^iωt 是复数,整个式子就变成了复变函数,两个复数的内积就不再是直接相乘了,而是一个复数和另外一个复数的共轭相乘,所以具体计算内积的时候就需要在 e 的指数上加一个负号。

傅里叶变换其实就是在希尔伯特空间做的一个坐标系变换 (有关坐标系变换可以参考线性代数整理 (二) 中的坐标转换和线性变换),只不过傅里叶变换选的这一组坐标系 (基) 很特别,是 e^iωt,这组新的基两两之间是正交的。

然后是其逆变换,同样将向量换成 e^iωt,有

我们来看一个这个模,它等于向量自己本身的内积,然而它并非等于 1,而是下面的公式

其中 T 是周期,,用 ω 替换后为

得出的结果分母是无穷小,分子是 2π,代入逆变换的式子中就是

这个无穷小∆ω 就可以看作是微分 dω,连加也就变成了积分

  • 总结上面的描述

希尔伯特空间的一个向量,它就代表空间域中的一个波形

此时保持希尔伯特空间的向量不变,更改它的坐标系

那么此时向量在新坐标系中的坐标就是变换域中的曲线

而作为新坐标系 (基)本身,同样是一个希尔伯特空间向量,那么它在空间域中就是一个正弦、余弦曲线。如下图的紫色曲线。

傅里叶变换考虑全局的情况,是因为这个正弦、余弦曲线是全局的。以它们作为新坐标系,也就是以它们作为锚点去衡量信号,最后找到的特征都是全局特征。我们可以对这个基做一些改变,不再考虑全局的情况,只是体现出局部情况。最简单的方法就是对这个正弦、余弦做一个约束,只在一个小窗口中进行波动,其他情况都是 0。

这个窗口之内的特征就会成为新锚点,在窗口之外就不再考虑。这样的话,坐标轴考虑的情况需要增加一个维度,窗口开在不同的位置是不同的坐标轴,窗口中信号的频率不同也是不同的坐标轴。那么这个新的基如下

其中变量 s 就是窗口的位置,s-1、s 1 中的 1 是窗口的大小。由于这种分段函数不是处处可微的,于是 g 函数还可以写成

这其实就是一个正态分布的函数,a 相当于方差,由它来决定窗口的大小;s 是期望,由它来决定窗口的位置。成像就是这个样子

这个使用正态分布来做 g 函数的变换,就是 Gabor 变换。变换后的特征函数有两个变量,一个还是用 n 来控制频率,它决定了不同的特征;另一个就是 s,控制窗口的位置。这里需要注意的是不把窗口大小作为变量,它只是一个参数。因为任何一个窗口的大小,都可以有一组完备的基。

这个 g 函数可以给傅里叶变换增加很多的可能性,g 函数不同最后带来了各种各样不同的变换。正态分布函数是其中的一种

如果 g 函数是一个指数函数,那么它就是拉普拉斯变换,会让正弦、余弦曲线不断的衰减。

如果窗口大小不再是固定的了,而是也可以作为变量,可以根据频率动态的变化,这就是一个小波变换。

总之各种不同名字的变换的本质就是在希尔伯特空间中选择了一组不同的基,然后对原来的函数进行变换。

现在我们来看一下 Gabor 变换特征在变换域中的图像

上图中左边是空间域,右边是变换域,由于 Gabor 变换对应的特征值 F 函数有 2 个变量,所以变换域是一个三维空间。此时如果在空间域中增加一个同样的波形,在变换域中的图形如下

我们可以看到,在变换域中增加了一个鼓包,并且波形跟之前的是一样的。从这里我们可以看出,Gabor 变换可以达到特征局部 —— 如果一个图像在不同的位置出现了相同的两个特征,反映到变换域中,它们的特征值也是相同的。

变换函数中的 n 对应的是变换域中的 n 坐标轴,这个坐标轴上不同的取值,代表着不同的频率,也就是不同的特征;变换函数中的 s 对应的是变换域中的 s 坐标轴,这个坐标轴上不同的取值,代表着空间域中不同的窗口位置。

Gabor 变换与卷积神经网络的对应关系

上图的最左边是原始图片,在将其输入到全连接层之前,先经过卷积层的特征提取。中间的网格图像就是卷积层提取的特征图。下面是 Gabor 变换的公式。

左边的原始图片就是空间域的信号,它所对应的就是 Gabor 变换中的 f (t) 函数。中间的特征图就是变换后的 F (n,s) 函数,它是变换后的结果,绿色像素点的位置就是 F (n,s) 函数中的变量 s。我们再将特征图中某一个像素点包含的信息给展开

上图中的模式就是特征,它是由不同的卷积核卷积计算的结果,对应的是卷积后特征图的不同的通道。不同的卷积核代表着不同的特征,不同特征的编号对应到 F (n,s) 函数中的变量 n。卷积核下面具体的值就是特征值,就是函数 F (n,s) 的具体取值了。卷积核的中心对准的就是变换结果中的 s。卷积核的大小就是窗口的大小,因为图片是二维的信号,所以窗口的大小也是二维的,现在是 3*3 卷积,所以这个 3*3 对应到函数中就是参数 a。至于卷积核中具体的数值,也就是具体的波形,是由这组函数来决定,其具体的数值不需要我们人为的去发现,而是由卷积神经网络自己去学习到的,用卷积核进行计算,本质上也是一种线性计算,所以一个卷积核里面的参数具体多少,通过梯度下降法就能学习到。

严格的说这里已经不是 Gabor 变换,Gabor 变换特指窗口函数是正态分布,对应的波是正弦、余弦波。但是在卷积神经网络中具体学习到的是什么样子,就不一定了。这里只不过是使用 Gabor 变换为切入来说明,既然是一个 Gabor 变换,为什么叫卷积运算呢?如果我们将后面的部分统一用一个 K 函数来进行表示

这个公式跟卷积公式非常像,唯一区别的就是函数 K 中的变量,如果变成了这个形式就完全相同了

假如 K 函数本身是一个偶函数的话,也就是说这个基波是一个对称的波,那么直接换过来就可以了。如果是一个奇函数,不是对称的,只需要增加一个负号就行。虽然 Gabor 变换和卷积的式子有相似的地方,但是它们还不是一回事。卷积定理说的是两个函数,先卷积,再傅里叶变换,等价于两个函数先傅里叶变换然后相乘。而 Gabor 变换是没有先卷积再傅里叶变换的,只不过是在数学形式上和卷积一样。

在图像的卷积操作的时候,通常会叠加多层卷积层,这么做的目的是因为特征图的结构和 RGB 的原始图并没有本质的区别,无论经过多少次卷积,它在结构上是不会改变的。经过多次卷积操作,它可以让每一层都使用更小的卷积核,获得更大的感受野。经过多层卷积层的叠加,只需要使用 3*3 的卷积核,就能让感受野大到覆盖整个图像。

0 人点赞