从网上搜索看,很多人理解“卷积”是困难的。“卷积”这个词,就吓住了很多人。
图1 从网上搜索看,很多人理解“卷积”是困难的
有2个原因:
第一,汉语其他地方几乎从不用“卷积”这个词,所以中国人无法理解字面含义;
第二,很多人熟记卷积的公式、在工作中经常使用,但是并不理解卷积的实质含义。
理解卷积(Convolution),是理解卷积神经网络(CNN:Convolutional Neural Network)的关键。也是让我们理解,为什么最近9年(2012-2021),人类最厉害的人工智能算法卷积神经网络,其实只是计算加权平均。
卷积是英文convolution的翻译,convolution的英文释义是盘绕,弯曲(a twist or curve)。
图2 Convolution的英文释义
为了便于理解英文convolution,我们可以和revolution对比:
“revolution”的词根re是“重新”的意思,revolution就是通过“重新创造”带来的变化,即革命、巨变;
苹果重新定义手机即Apple reinvents the phone,即re就是强调“全新”的意思。
“Convolution”的词根con是“共同”的意思,即本质不变,但通过转动、旋转、扭曲和弯曲带来的变化。
不同于中文,在英语中,convolution是一个可以被用于日常表达,如crosses adorned with elaborate convolutions,用精巧的曲线装饰的十字架。
如果“revolution”被翻译为“革变”,那“convolution”可以翻译为“卷变”。
所以,“convolution”引申为,本质不变,但是通过“变换”而带来的变化。记住了这个本质词义,后面对于“convolution”的各种花式变种,才会坦然接受,不再疑惑。
Convolution的中文翻译是“卷积”,但卷积这个词在现代汉语当中,几乎不在其他地方使用,所以直接理解词义几乎是不可能的。
“卷”和convolution有关系的,但是“积”就没有什么关系了。我们推测,卷积这个中文翻译,是对卷积的数学公式做了“形式化”的解读,我们可以简单理解,卷积就是卷起来的乘积,可以理解为累加或叠加(对连续函数为积分)起来的乘积。
连续形式:
离散形式:
(函数f和函数g的卷积的计算公式,是累加(或积分)起来的乘积)
可以说,正是因为“卷积”这个中文翻译丢掉了“convolution”最本质的词义“本质不变的变换”,而是和具体的计算公式进行绑定,所以,给中国人理解,带来了很大困扰。
这导致很多网上解释“卷积”的文章,都是对这个数学公式的形式进行解读,其实是颠倒了因果。
我们在大学课本里面就学习过卷积,主要是在《信号系统》当中。当一个信号经过一个系统之后,产生的输出,实际上就是这个输入x(n)和系统的冲击响应h(n)的卷积。
图3 系统的框图
延伸阅读:当然,这里要求系统是线性时不变系统(Linear Time-Invariant System),但大家可以不用关注这个,因为我们绝大部分时间只讨论这样的系统。
延伸阅读:这里只需要理解,系统的特性,完全由冲击响应h(n)完整描述了即可。冲击响应在物理世界并不存在,但是它是直接解释卷积公式的关键,见本文附录。详见参考资料[3]的第二章。
系统定义为处理(或变换)信号的物理设备。或者进一步说,凡是能将信号加以变换以达到人们要求的各种设备都是系统[1]。
信号处理是研究用系统对含有信息的信号进行处理(变换),以获得人们所希望的信号,从而达到提取信息、便于利用的一门学科。信号处理的内容包括滤波、变换、检测、谱分析、估计、压缩、识别等一系列的加工处理[1]。
卷积的过程其实就是相当于一个信号经过了一个系统进行处理,最典型的就是滤波器。
图4 时域信号处理前后的波形[2]
图5 微分滤波器后的图片效果[3]:(a) 2张原始图片;(b) 原始图片经过一个微分滤波器后的结果
在这里,只需要大家了解一个概念,就是卷积实质上是对信号进行滤波,它能够“过滤出”我们感兴趣的、对我们有用的信息。
延时阅读:时域的卷积等于频域的乘积。傅里叶变换是一种频域分析法,它将信号表示成把周期信号分解成基波和各次谐波,非周期信号能够看成是周期无限长的周期信号[3]。傅里叶变换对信号的分析方法,是了解信号的成份的一种方法。卷积运算等价于傅里叶变换后的频域的乘积运算,有助于我们理解,卷积是对信号成份进行提取。
我们以前在通讯系统的时候,我们学习到的信号一般都是一维的,因为我们的输入和我们的输出,都是时间的函数。因为每个时刻输入都是一个电平信号的数字,这个数字是一维的。
图像信号在每个时刻所输入的图像都有长和宽两个概念,所以图像的卷积就要考虑到二维了。
回顾一维离散卷积的定义:
二维数据的卷积的定义,只需要将变了m和n变成二维的即可:
先将h(m1, m2)绕其原点旋转180度,然后平移其原点,m1轴上平移n1,m2轴上平移n2,然后两个函数乘积相加,得到一个点处的输出。
可以看出,对于每一个点(n1, n2),实际是把一个点的像素值用它周围的点的像素值的加权平均代替。
图像处理中的卷积与上面的定义稍微有一点不同。用一个模板(通常我们叫Kernel)和一幅图像进行卷积,对于图像上的一个点,让模板的原点和该点重合,然后模板上的点和图像上对应的点相乘,然后各点的积相加,就得到了该点的卷积值。对图像上的每个点都这样处理。由于大多数模板都是对称的,所以模板不旋转。
图6 一个 3×3 的卷积核,在图像上的滑动
可以看出,图像卷积,实际上,是把一个点的像素值用它周围的点的像素值的加权平均代替。
延伸阅读:Convolution运算,仍然是一种线性运算。
由于模板不旋转,所以图像卷积的计算公式,已经和二维卷积的公式不同了,且与互相关函数(cross-correlation)相同[4],但是我们仍然称之为“卷积”。在参考文献[5]中,有各种卷积操作的变种。
只要我们理解了convolution的词义是“本质不变的变换”,就会对这样的具体计算的变种坦然接受。其操作依然是加权平均、乘加运算,其目的仍然是提取有用信息。
所以,卷积的本质是滤波(特征提取),操作是加权平均、乘加运算,其目的是提取有用信息。
延伸阅读:在通常的深度学习卷积层,有填充(Padding)、步长(Stride)的概念,这样做的好处是对防止图像边缘信息丢失、图像尺寸的控制更好,这使得操作与二维卷积的经典公式差别更大,但是convolution的本质含义并没有改变。
图7 三个图像卷积操作的效果
理解了上面的概念,你就知道对图片进行滤波,是一种常见的操作。我们现在用的各种美颜工具,比如说磨皮、皮肤变白,你可以理解为是一种滤波行为,依靠的就是卷积操作。
由于卷积或者说滤波是传统图像处理中的常用方式,所以,OpenCV 4中提供了filter2D()函数用于实现图像和卷积模板之间的卷积运算。
代码清单5-1 filter2D()函数原型 1. void cv::filter2D(InputArray src, 2. OutputArray dst, 3. int ddepth, 4. InputArray kernel, 5. Point anchor = Point(-1,-1), 6. double delta = 0, 7. int borderType = BORDER_DEFAULT 8. ) src:输入图像。 dst:输出图像,与输入图像具有相同的尺寸和通道数。 ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围,具体的取值范围在表5-1给出,当赋值为-1时,输出图像的数据类型自动选择。 kernel:卷积核,CV_32FC1类型的矩阵。 anchor:内核的基准点(锚点),默认值(-1,-1)代表内核基准点位于kernel的中心位置。基准点即卷积核中与进行处理的像素点重合的点,其位置必须在卷积核的内部。 delta:偏值,在计算结果中加上偏值。 borderType:像素外推法选择标志,可以选取的参数及含义已经在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
注意 filter2D()函数不会将卷积模板进行旋转,如果卷积模板不对称,需要首先将卷积模板旋转180°后再输入给函数的第四个参数。
图8 卷积神经网络的示例图
如上图所示,卷积神经网络架构与常规人工神经网络架构非常相似,特别是在网络的最后一层,即全连接(Fully Connected layers)。
在图中,卷积层Layer1使用了64个7×7卷积核(Kernel),Layer2使用了16个5×5卷积核。每一个卷积层的输出叫特征图(feature maps),因为我们预期它表示了图片的特征。
我们自然而然的会选择用多个不同的filters(即卷积核)对同一个图片进行多次抓取。如下图,同一个图片,经过两个(红色、绿色)不同的filters扫描过后可得到不同特点的Feature Maps。每增加一个filter,就意味着你想让网络多抓取一个特征。
图9 两个卷积核学习两个Feature Maps
与OpenCV不同的是,深度神经网络中的卷积核(Kernel)是通过训练得到的,而OpenCV的函数中是人工指定的。所以,我们并不知道深度神经网络中学习的卷积核(Kernel)的参数,到底提取的什么特征,比如到底是模糊化还是边缘检测。这就是我们说,卷积神经网络是黑箱的原因之一。
在CNN的语境下,kernel = filter = feature detector。
对比普通的深度神经网络,卷积层的优点是:
1)局部连接。即避免了把二维图像(长宽)的raw data直接摊平(flatten)为一维数据输入深度神经网络,保留了二维图像的相邻图像块的信息;
2)滤波提取特征。利用了传统图像处理的卷积核(Kernel)的滤波(特征提取)能力;
以上两个优点,是卷积神经网络本质的优势,这使得Yann LeCun在1989首次提出“卷积神经网络”以来,32年时间里面一直是图像处理的最流行深度神经网络。可以大胆预测,技术将来的新网络结构,也一定会用到上面的2个因素。
顺带的,卷积神经网络也具备了以下优点:
1)具备了“平移不变性”,因为卷积核(Kernel)会把输入图像扫描一遍,且参数共享(即一个卷积核扫描输入图像时只用同一套参数),所以,被检测物体无论在哪个位置,都能被检测到;
图10 在不同位置的同一形状
2)解决尺寸不变性成为可能。如下图,通过卷积层的级联,可以学习到不同尺寸的特征。也可以一次性使用多个不同filter size来抓取多个范围不同的概念是一种顺理成章的想法,而这个也就是Inception网络。
图11 在人脸识别中经过层层的卷积后,所能够探测的形状、概念也变得越来越抽象和复杂
1)对特征的全局位置不敏感。由于卷积核参数共享,即一个卷积核扫描输入图像时只用同一套参数(主要是为了大大减小计算量),与实际情况不符,因为图片上有的位置的信息可能更有价值,有的位置的信息价值低一些。
2)难以跟踪图像中的远距离依赖关系。由于卷积核size的限制,提取的特征是局部敏感的,每个操作仅考虑图像的局部区域。
卷积层模型的训练来识别人脸可以编码信息是否“眼睛”、“鼻子”或“嘴”的特征出现在输入图像中,但是这些表示不会有这样的“眼睛上面鼻子”或“嘴下面的鼻子”的特征,因为每一个卷积内核不会足够大来处理多个这些特性。
为了跟踪图像中的远距离依赖关系,需要大的接收场,实际上,这涉及使用更大的核或更多的卷积层,但以牺牲效率为代价,并使模型极其复杂,甚至无法训练。
图12 Transformer试图解决长依赖问题(2020年5月)
计算机视觉中的Transformer就是为了解决长依赖问题,DETR(arxiv.org/2005.12872)提出了一个简单的模型,实现了与SOTA对象检测方法相同的精度和性能。即,CNN输出的特征不是直接平铺,进入全连接层,而是将特征块输入到Transformer的编码器,学习长依赖信息。
图13 Vision Transformer (ViT)结构示意图(2020年10月)
Vision Transformer (arxiv.org/2010.11929)提出了一种新的图像识别SOTA,该模型甚至可以完全依靠自我关注,并且能够提供与当前SOTA相当的性能。【注意:Patch块就是利用了局部连接,Linear Projection会用到乘加操作,起到滤波提取特征的效果】
3)卷积神经网络仍然没有考虑视频流的时序信息,即图像的前后帧的信息。这也是你在看到现在的视频检测框中,框晃动,有时甚至时有时无的原因之一。
4)卷积神经网络本身没有解决旋转和视角不变性,克服这一不变性的主要手段还是靠大量的数据。
图14 CNN没有解决旋转和视角不变性
卷积神经网络的创始人是著名的计算机科学家Yann LeCun,目前在Facebook工作,他是第一个通过卷积神经网络在MNIST数据集上解决手写数字问题的人。
图15 Yann LeCunn
以下是几个比较有名的卷积神经网络结构,详细的请看CS231n。
网络结构名词 | 提出人 | 时间 | 说明 |
时间延迟网络(Time Delay Neural Network, TDNN) | Alexander Waibel等 | 1987 | TDNN是一个应用于语音识别问题的卷积神经网络,使用FFT预处理的语音信号作为输入,其隐含层由2个一维卷积核组成。TDNN的表现超过了同等条件下的隐马尔可夫模型(Hidden Markov Model, HMM)。
|
平移不变人工神经网络(SIANN) | Wei Zhang | 1988 | 第一个二维卷积神经网络,应用于检测医学影像。 |
LeNet | Yann LeCun | 1989 | 第一个成功的卷积神经网络。 LeNet包含两个卷积层,2个全连接层,共计6万个学习参数,规模远超TDNN和SIANN,且在结构上与现代的卷积神经网络十分接近。 LeCun (1989) 对权重进行随机初始化后使用了随机梯度下降(Stochastic Gradient Descent, SGD)进行学习,这一策略被其后的深度学习研究所保留。此外,LeCun (1989)在论述其网络结构时首次使用了“卷积”一词 ,“卷积神经网络”也因此得名。 |
AlexNet | Hinton和他的学生Alex Krizhevsky | 2012 | 获得2012年ImageNet竞赛冠军。也是在那年之后,更多的更深的神经网络被提出,成为最近9年图像处理上最流行的算法,比如优秀的vgg,GoogLeNet。 类似LeNet,但更深更大。使用了层叠的卷积层来抓取特征(通常是一个卷积层马上一个max pooling层) |
GoogLeNet | Christian Szegedy | 2014 | 2014年ImageNet竞赛的第一名。 减少parameters数量,最后一层用max pooling层代替了全连接层,更重要的是Inception-v4模块的使用。 |
VGGNet | Oxford Visual Geometry Group | 2014 | 2014年ImageNet竞赛的第二名。VGG模型在多个迁移学习任务中的表现要优于googLeNet。 只使用3x3 卷积层和2x2 pooling层从头到尾堆叠。 |
ResNet | Microsoft Research的4位学者 | 2015 | 2015年的ImageNet竞赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)中获得了图像分类和物体识别的优胜。 引入了跨层连接和batch normalization。 |
延伸阅读:理解了卷积层的本质是滤波(特征提取),操作是加权平均、乘加运算,其目的是提取有用信息,就对其他的各种的、无数的变种感到迷惑,比如,深度神经网络的结构的发展趋势有[6]:
- 使用small filter size的卷积层和pooling
- 去掉parameters过多的全连接层
- Inception(一次性使用多个不同filter size)
- 跳层连接
1)卷积实质上是对信号进行滤波,它能够“过滤出”我们感兴趣的、对我们有用的信息。
2)图像卷积的公式与二维卷积有变化,但卷积的含义不变,本质是滤波(特征提取),操作是加权平均、乘加运算,其目的是提取有用信息。
3)卷积或者说滤波是传统图像处理的常用方式,OpenCV提供了相应的函数。
4)对比普通的深度神经网络,卷积层的优点:1)局部连接;2)滤波提取特征。这2个因素会一直是图像处理的关键要素。
5)卷积层的局限性:1)对特征的全局位置不敏感。2)没有考虑图像中特征的依赖关系。
下面我们对一维离散信号的卷积公式做直观解释,详见参考文献[3]第二章。
首先,我们人为定义了单位脉冲(或单位样本):
(这是关键,因为这个定义,所以h[n]就是δ[n]的响应)
所以,我们可以将输入序列x[n]表示为:
根据线性系统的叠加性质,对输入x[n]的响应y[n]就是上面的单位脉冲的响应的加权线性组合。再加上我们定义的δ[n]的响应就是h[n],所以y[n]就是h[n]的加权线性组合。
由此可见,一个线性系统在时刻n的响应就是在时间上每一点的输入值所产生的各个响应在该时刻n的叠加。这个结果称为卷积和(convolution sum),并且右边的运算称为x[n]和h[n]的卷积,并符号记作
相关文章
理解人工智能算法,初中数学知识就够了
5分钟理解激活函数让神经网络能逼近任何函数
《数字信号处理教程》 程佩青 清华大学出版社
Chapter 5: Linear Systems https://www.dspguide.com/ch5/1.htm
《信号与系统》奥本海姆
卷积(convolution)和互相关(cross-correlation) https://blog.csdn.net/u013498583/article/details/79481144
卷积有多少种?一文读懂深度学习中的各种卷积 https://baijiahao.baidu.com/s?id=1626340857776537248
YJango的卷积神经网络——介绍 https://zhuanlan.zhihu.com/p/27642620
一文让你理解什么是卷积神经网络 https://www.jianshu.com/p/1ea2949c0056
https://baike.baidu.com/item/卷积神经网络/17541100?fr=aladdin
用Transformer完全替代CNN https://zhuanlan.zhihu.com/p/266311690
注:本文只代表个人观点,与任何组织和单位无关。