别怕,“卷积”其实很简单

以前的文章没法用推荐卡,这是我2017年写的,所以重新发表一次,大家温习温习~

我的机器学习教程「美团」算法工程师带你入门机器学习   已经开始更新了,欢迎大家订阅。

任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~

 

前言

相信很多时候,当我们在看到“卷积”时,总是处于一脸懵逼的状态,不但因为它的本身概念比较难理解,还因为它在不同的应用中发挥出的变幻莫测的作用也时常让人迷糊。

但这些应用,其实本质上都是同一种东西,理解了卷积的来源,就可以举一反三。其实我个人对于卷积的理解,很长时间都处于似懂非懂的状态,就像傅里叶变换的一些tricky points,只求在应用中不出差错,不求甚解。但是如果想要真正做好机器学习的研究,我认为在真正的学习理论基础前,必须将概念的本质搞清楚。

因此这篇文章就是为工科,理科以及其他领域对此感兴趣的同学而整理,除了自己的理解,也感谢知乎、豆瓣上其他答主的解答(已授权),内容简易通俗,便于理解。此外,本篇文章虽然收录进我的机器学习专栏,但因为引用了很多例子,因此仅作为免费分享,不列入订阅内容。


前言

那么,到底什么是卷积呢?

怎么卷?

卷了有什么用?

卷积的内核(涉及推导过程,可以跳过)

卷积的应用

2维卷积

参考材料


卷积,很多时候都是我们在各种工程领域,信号领域所看到的常用名词,比如系统

通俗易懂的说,就是

输出 = 输入 * 系统

虽然它看起来只是个简单的数学公式,但是却有着重要的物理意义,因为自然界这样的系统无处不在,计算一个系统的输出最好的方法就是运用卷积。更一般的,我们还有很多其他领域的应用:

  • 统计学中,加权的滑动平均是一种卷积。

  • 概率论中,两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积。

  • 声学中,回声可以用源声与一个反映各种反射效应的函数的卷积表示。

  • 电子工程与信号处理中,任一个线性系统的输出都可以通过将输入信号与系统函数(系统的冲激响应)做卷积获得。

  • 物理学中,任何一个线性系统(符合叠加原理)都存在卷积。

  • 计算机科学中,卷积神经网络(CNN)是深度学习算法中的一种,近年来被广泛用到模式识别、图像处理等领域中。

这6个领域中,卷积起到了至关重要的作用。在面对一些复杂情况时,作为一种强有力的处理方法,卷积给出了简单却有效的输出。对于机器学习领域,尤其是深度学习,最著名的CNN卷积神经网络(Convolutional Neural Network, CNN),在图像领域取得了非常好的实际效果,始一出现便横扫各类算法。关于CNN的具体内容和理解,将在之后的文章中解释,这里先留一个悬念。

那么,到底什么是卷积呢?

首先给大家讲一个关于卷积的小故事:

小明是杭州某互联网大厂的员工,每天996十分辛苦,但小明最近爱上了打台球,经常不在工位。

这天,小明的主管让小明改一个需求,小明却到楼下找产品部小丽打台球去了,被主管发现,他非常气愤,扇了小明一巴掌(注意,这就是输入信号,脉冲)。

于是小明脸上会渐渐地(贱贱地)鼓起来一个包,小明的脸就是一个系统,而鼓起来的包就是小明的脸对巴掌的响应。好,这样就和信号系统建立起来意义对应的联系。

下面还需要一些假设来保证论证的严谨:假定小明的脸是线性时不变系统,也就是说,无论什么时候主管打一巴掌,打在小明脸的同一位置(这似乎要求小明的脸足够光滑,如果小明长了很多青春痘,甚至整个脸皮处处连续处处不可导,那难度太大了,我就无话可说了哈哈),小明的脸上总是会在相同的时间间隔内鼓起来一个相同高度的包来,并且假定以鼓起来的包的大小作为系统输出。

好了,那么,下面可以进入核心内容——卷积了! 

如果小明每天都到公司楼下去打台球,那么主管每天都要扇小明一巴掌,不过当主管打小明一巴掌后,小明5分钟就消肿了,所以时间长了,他甚至就适应这种生活了……如果有一天,主管忍无可忍,叫上公司的251个保安,站成一个圈围住小明,以0.5秒的间隔开始不间断的扇小明的过程,这样问题就来了,第一次扇小明鼓起来的包还没消肿,第二个巴掌就来了,小明脸上的包就可能鼓起来两倍高,大家不断扇小明,脉冲不断作用在小明脸上,效果不断叠加了,这样这些效果就可以求和了,结果就是小明脸上的包的高度随时间变化的一个函数了(注意理解)


如果主管再狠一点,频率越来越高,以至于小明都辨别不清时间间隔了,那么,求和就变成积分了。可以这样理解,在这个过程中的某一固定的时刻,小明的脸上的包的鼓起程度和什么有关呢?和之前每次打小明都有关!但是各次的贡献是不一样的,越早打的巴掌,贡献越小,所以这就是说,某一时刻的输出是之前很多次输入乘以各自的衰减系数之后的叠加而形成某一点的输出,然后再把不同时刻的输出点放在一起,形成一个函数,这就是卷积,卷积之后的函数就是小明脸上的包的大小随时间变化的函数。
​本来小明的包几分钟就可以消肿,可是如果连续打,几个小时也消不了肿了,这难道不是一种平滑过程么?反映到剑桥大学的公式上,f(a)就是第a个巴掌,g(x-a)就是第a个巴掌在x时刻的作用程度,乘起来再叠加就ok了
 

又比如,小明因为被主管虐待,所以一怒之下还手,结果被保安驾出了公司,还没有拿到N+1赔偿。他只好通过理财的方式来达到财务自由,希望出任CEO赢取白富美走上人生巅峰,于是他把所有存款100元钱存入了XXP2P理财,年利率是5%,按复利计算(即将每一年所获利息加入本金,以计算下一年的利息),那么在五年之后他能拿到的钱数是

如下表所示


将这笔钱存入银行的一年之后,小明又往银行中存入了100元钱,年利率仍为5%,那么这笔钱按复利计算,到了第五年,将收回的钱数是

我们将这一结果作为新的一行加入上面的表格中:

以此类推,如果小明每年都往银行中存入新的100元钱,那么这个收益表格将是这样的:
可见,最终小明拿到的钱将等于他各年存入的钱分别计算复利之后得到的钱数的总和,即:

用求和符号来简化这个公式,可以得到:


在上式中f(i)为小明的存钱函数,g(i)为存入银行的每一笔钱的复利计算函数。在这里,小明最终得到的钱就是他的存钱函数和复利计算函数的卷积。

为了更清晰地看到这一点,我们将这个公式推广到连续的情况,也就是说,小明在从0t的这一段时间内,每时每刻都往银行里存钱,他的存钱函数为

而银行也对他存入的每一笔钱按复利公式计算收益:

则小明到时间t将得到的总钱数为:

这也就是卷积的表达式了,上式可以记为

相信通过上面这个例子,大家应该能够很清晰地记住卷积公式了。下面我们再展开说两句:
如果我们将小明的存款函数视为一个信号发生(也就是激励)的过程,而将复利函数

视为一个系统对信号的响应函数(也就是响应),那么二者的卷积

就可以看做是在t时刻对系统进行观察,得到的观察结果(也就是输出)将是过去产生的所有信号经过系统的「处理/响应」后得到的结果的叠加,这也就是卷积的物理意义了。

通过这个通俗化的例子我们从基本概念上了解了卷积,那么更严格的定义是怎样的呢?

从数学上讲,卷积只不过是一种运算,对于很多没有学过信号处理,自动控制的同学来说各种专业的名词可以不做了解,我们接着继续。本质上卷积是将二元函数卷成一元函数 ,俗称降维打击。

怎么卷?

考虑到函数 f 和 g 应该地位平等,或者说变量 x 和 y 应该地位平等,一种可取的办法就是沿直线

卷起来

卷了有什么用?

可以用来做多位数乘法,比如:

注意第二个等号右边每个括号里的系数构成的序列 (14,34,14,4),实际上就是序列 (2,4) 和 (7,3,1) 的卷积。在乘数不大时这么干显得有点蛋疼,不过要计算很长很长的两个数乘积的话,这种处理方法就能派上用场了,因为你可以用快速傅立叶变换 FFT 来得到卷积,比示例里的硬乘要快多啦
 

有一个不太严格的理解:


其中,X是“基”,a是在这个基上的展开系数。两个多项式乘积的在基上展开的系数就是两个多项式各自在基上展开系数的卷积。
a对应着频率不同的exp(ikt),系数对应着其傅里叶变换。自然就是乘积的傅里叶变换等于傅里叶变换的卷积了。

 

卷积的内核(涉及推导过程,可以跳过)

首先我们要理解这样一个概念:内积、积分、投影这三者其实从某个角度上讲是一个意思

定义一组向量另一组向量

那么内积可以表达为:

瞧,这即是内积,也是累加(积分)。投影的概念则可以理解为向量a在基向量b上的一组投影,坐标为

这和一个点在3D欧几里得空间的三轴投影坐标是一个道理。

这样,我们可以顺便先来看看Fourier变换在做什么:

再引入一个完美的式子,欧拉公式:

从Fourier的定义式可以看出是对f(t)和exp(-jwt)相乘后在无穷域上对其进行积分,那么其实就是将f(t)投影在exp(-jwt)上,如果不理解是什么鬼就变换为两个正交的三角函数(欧拉公式就在这里起作用啦~)。所以这就明朗了:Fourier把f(t)投影到了两个为正交关系的正弦和余弦空间中。也可以从周期信号的Fourier级数分解表达式更容易看出这个投影关系。

看完Fourier再看来控制论领域的Laplace变换在做什么:

首先,控制领域里面经常用到阶跃信号,不幸的是它不满足狄利克雷第三条件,因此它对Fourier变换魔法免疫(劳资就要跳变,你咋地!),所以聪明的Laplace用了一个衰减因子将其进行衰减后再做Fourier变换(很暴力有木有)。But,到了负无穷的区域这衰减因子可就成了递增因子,所以Laplace变换仅限于大于0的区域,对于小于0的区域用系统初始状态表达就好了。从这点角度上讲,Laplace变换相当于做了一个单边Fourier变换。

然后,分析方法同上,可以看到Laplace把f(t)投影到了exp(-st)空间,这就是s平面啦。它比Fourier更厉害的地方是不仅可以看到虚轴上的成分,还可以在实轴上看到Fourier看不到的衰减因子成分,这是Fourier做不到的。所以Laplace在Fourier的基础上把信号拓展到了衰减因子实轴上,这个衰减因子和系统的阻尼,自然震荡角频率密切相关,直接影响了系统的调节时间。

学过自控原理的同学应该知道在频域章节,我们得到系统的频域响应曲线都是通过传递函数来直接转化的,公式就是s=jw。这也就是说Fourier活在一维虚轴空间,Laplace活在二维平面空间,想要得到一维空间上关于w的表达形式,只需要在s平面上做降维处理即可。

回过头来再来看看卷积投影:

这个投影有点奇怪,它在投影之前先把g(T)做了一个反对称,然后再投影。对应到前面推导的系统卷积表达式:

相当于在投影之前,先把输入信号r(t)在时间轴上翻转了180°,然后与系统f(t)进行投影。投影的概念我们可以很好理解,无论是向量内积运算相当于线投影,或者空间的一个多面体在三维空间平面上的投影面,这种投影运算就相当于一种重合面积。如果从这个角度去看输入、系统和输出三者之间的关系,那么就可以从图形角度去理解为什么一个一阶系统在阶跃响应输出下是一条单调上升的曲线了。这里用一张wikipedia里关于卷积的一张图形化解释,想要了解更多的同学可以自行跳转:Convolution

(感谢知乎学霸王尼莫和马同学的帮助)

卷积的应用

用一个模板和一幅图像进行卷积,对于图像上的一个点,让模板的原点和该点重合,然后模板上的点和图像上对应的点相乘,然后各点的积相加,就得到该点的卷积值。对图像上的每个点都这样处理。

由于多数模板都对称,所以模板不旋转。卷积是一种积分运算,用来求两个曲线重叠区域面积。可以看作加权求和,可以用来消除噪声、特征增强。把一个点的像素值用它周围的点的像素值的加权平均代替。

卷积也可以理解为一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图像滤波。 卷积关系最重要的一种情况,就是在信号与线性系统或数字信号处理中的卷积定理。

利用该定理,可以将时间域或空间域中的卷积运算等价为频率域的相乘运算,从而利用FFT等快速算法,实现有效的计算,节省运算代价。

下面是来自sselssbh博客的一个例子,非常形象的解释了卷积在图像领域的作用

有这么一副图像,可以看到,图像上有很多噪点: 

高频信号,就好像平地耸立的山峰: 

看起来很显眼。平滑这座山峰的办法之一就是,把山峰刨掉一些土,填到山峰周围去。用数学的话来说,就是把山峰周围的高度平均一下。

平滑后得到

卷积可以帮助实现这个平滑算法。

有噪点的原图,可以把它转为一个矩阵: 

然后用下面这个平均矩阵(说明下,原图的处理实际上用的是正态分布矩阵,这里为了简单,就用了算术平均矩阵)来平滑图像:

记得刚才说过的算法,把高频信号与周围的数值平均一下就可以平滑山峰。比如我要平滑a1,1 点,就在矩阵中,取出a1,1点附近的点组成矩阵 f ,和 g 进行卷积计算后,再填回去 

要注意一点,为了运用卷积, g虽然和f同维度,但下标有点不一样: 

写成卷积公式就是:

要求的话,一样可以套用上面的卷积公式。这样相当于实现了 g 这个矩阵在原来图像上的划动(准确来说,下面这个二维卷积的例子把 g 矩阵旋转了180∘ )

2维卷积

2 维卷积是一个相当简单的操作:从卷积核开始,这是一个小的权值矩阵。这个卷积核在 2 维输入数据上「滑动」,对当前输入的部分元素进行矩阵乘法,然后将结果汇为单个输出像素。

立体的角度来看,二维层面的卷积就是移动和映射(自上而下)

而从平面展开则是如下的过程,每一个蓝色9宫格的数字都对应了一个绿色各自的数字,这个对应过程就是卷积的具体计算。

再比如做馒头

楼下早点铺子生意太好了,供不应求,就买了一台机器,不断的生产馒头。 

假设馒头的生产速度是 f(t) ,那么一天后生产出来的馒头总量为: 

馒头生产出来之后,就会慢慢腐败,假设腐败函数为 g(t) ,比如,10个馒头,24小时会腐败:

想想就知道,第一个小时生产出来的馒头,一天后会经历24小时的腐败,第二个小时生产出来的馒头,一天后会经历23小时的腐败。 如此,我们可以知道,一天后,馒头总共腐败了: 

参考材料

1. CSDN:最容易理解的对卷积(convolution)的解释http://blog.csdn.net/bitcarmanlee/article/details/54729807

2. 知乎:如何通俗易懂的解释卷积?https://www.zhihu.com/question/22298352

3. 卷积为什么叫卷子?https://www.zhihu.com/question/54677157

4. 果壳:关于卷积的一个血腥讲解 https://www.guokr.com/post/342476/

5. 小木虫:https://zh.wikipedia.org/wiki/%E5%8D%B7%E7%A7%AF%E5%AE%9A%E7%90%86 

>>>关于作者

CSDN 博客专家,2019-CSDN百大博主,计算机(机器学习方向)博士在读,业余Kaggle选手,有过美团、腾讯算法工程师经历,目前就职于Amazon AI lab。喜爱分享和知识整合。

关注微信公众号,点击“学习资料”菜单即可获取算法、编程资源以及教学视频,还有免费SSR节点相送哦。其他平台(微信/知乎/B站),欢迎关注同名公众号「图灵的猫」~

发布了319 篇原创文章 · 获赞 1554 · 访问量 192万+

猜你喜欢

转载自blog.csdn.net/qq_39521554/article/details/103801861