在泛函分析中,卷积、旋积或摺积(英语:Convolution)是通过两个函数f和g 生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。
卷积是分析数学中一种重要的运算。简单定义:设f(χ),g(χ)是R上的两个可积函数,作积分:
可以证明,关于几乎所有的实数x,上述积分是存在的。并且把卷积记做h(x)=(f*g)(x)
这样生硬的公式,长时间不用可能就要忘了。记下来用几种形象的比喻来理解一下卷积到底在“卷”什么。
一、第一层理解
有一个人特别喜欢吃东西,一日三餐吃的特别多,总之1天24小时不断在吃东西,横坐标表示时间,纵坐标表示进食量。
吃进去就得消化,因此随着时间的延长,食物也在不断地被消化。
有了输入和输出这二者随时间变化的关系,接下来看一个具体的问题:下午2点,这个人的肚子里还剩多少食物?在这个过程吃和消化在不停的变化,计算起来应该还挺麻烦的。
想想刚刚的卷积公式,用f函数表示进食,用g函数表示消化, 如果不考虑消化问题,计算肚子里还剩多少食物,其实就是对f(t)这个函数求积分进行了,计算曲线下的面积。
显然还要再考虑消化,加入考虑12点的时候吃了一碗米饭,到14点还能剩多少呢?
由于g函数表示食物还剩下的比例,因此用12点吃下去的食物,乘以2小时候消化完剩余食物的比例,就能得到还在肚子里的食物量。这还只是一个点的情况,再增加一个点,上午10点吃了一个面包,到下午2点还能剩多少?
一次类推,如果能把每个时间点的进食量都和消化函数g乘一下,就能得到每个点进食后再下午14点肚子里还剩多少食物。
有个这个数据,再把所有的点的剩余量再加一下,就能得到最终再14点肚子里剩余的食物总量。
如果用数学公式表达:
积分后的结果表示t时刻,肚子里还剩下多少食物。这里需要注意的是两个函数中的自变量相加只剩下时间t,这其实也算是卷积的一个标志。那么这样一堆变量反映到图像中表示什么含义呢?
总结一下:一个系统,输入不稳定的,输出是不稳定的,这样就能够用卷积求存量。
此外,还有一个问题,卷积?哪里能够体现处“卷”?
其实呢卷积的本质就是翻转,相乘,相加的这么一个过程。
二、第二层理解
对于图像的卷积操作来说,只要能够找到函数f和g。从图像的卷积操作来说,就是去寻找一个卷积核去从图像上找到相关的响应,以下图为例,拿一个3x3大小的窗口在图像上从左到右,从上到下滑动,每次都是逐点相乘,最终相加的过程。
这个可以把图像认为是函数f,卷积核是函数g,因为图像中卷积核是稳定的,就是那9个数,而卷积核每次在图像上滑动过程中,图像对应的窗口时变动的,是不稳定的。
由于第一层理解中的具体问题还是个一维问题,而对于图像的卷积操作是一个二维问题,而且也不再是求系统存量这么回事了。
那么换个角度理解, 在t时刻发生了飓风,而产生的原因就是在此之前时刻,有蝴蝶煽动了翅膀,在x时刻蝴蝶煽动翅膀对t时刻发生飓风产生影响。
但是这个影响是会随着时间的变化而变化的,也就是函数g,它的影响力是随着时间不断衰减的。
其实,这样去看卷积的话也就是说看x时刻对于t时刻产生的影响,然后把t之间时刻都计算一遍再相加,就能计算所有t时刻之前对于当前t时刻的影响有多大了。
也就是说在某一时刻发生了一件事,但是它会受到之前发生的很多事的影响。比如x时刻蝴蝶煽动了翅膀对于t时刻的影响还需要看从x到t经历的时间。
再回头看图像的卷积操作,是不是就可以理解为很多像素点对某一个像素点是如何产生影响的?也就说卷积核其实就是如何对当前像素点产生影响的,卷积核的大小其实就是在控制影响范围的大小,有可能这也是空洞卷积想法的来源。
有关图像的二维卷积的计算公式:
可以发现,这两个图并不是一一对应关系,那么对图像或者卷积核做一个翻转操作,这是不是又回来了,翻转,相乘,相加。
也就是说卷积核旋转180度才是真正的卷积,但是对于图像卷积操作来说就是省去了翻转这一操作,但这并不影响图像操作。
三、第三层理解
如果想要理解上面这两张图是否为同一个东西的时候,对于人眼来说很容易就能认出来,但是对于计算机比较的话,只有0和1的理解确实还挺难的,但是对于一些局部特征来说,很是很像的。
所以,用计算机进行图像识别的关键在于挑出图像的局部特征出来,然后根据局部特征进行对比来识别。那么如何进行局部特征提取呢?
所以就有一大批人来设计各种各样的滤波算子,从而能够得到各种特征提取方法,比如各种边缘检测,角点检测等等。
其实对于滤波算子来说,其实就是对周围像素点的试探,卷积核就是试探的模板,不care的点就设置为0。所以这么理解卷积核就是对周围像素的点的主动试探和选择,通过它把周围有用的特征保留下来。
回到X图像的识别问题上来:Features match pieces of the iamge
通过这些特征匹配的模板去图像上找到相应的特征响应,从而达到图像分类和识别的问题。
但是,人为的设计这些卷积核是很难做到遍历且有效的,那么就有了现在流行的深度学习完成端到端的训练,从而得到这些卷积核。
这样虽然可以省去人为的特征设计,但是也会带来很多问题,比如自动寻找得到的卷积核无法去理解为什么要提取这样的特征响应,比如在优化过程中如何保证最优解等等,都是深度学习需要解决的问题。