Convolution 卷积
公式及其性质
卷积的“卷”,指的的函数的翻转,从 g(t) 变成 g(-t) 的这个过程;同时,“卷”还有滑动的意味在里面(吸取了网友李文清的建议)。如果把卷积翻译为“褶积”,那么这个“褶”字就只有翻转的含义了。
卷积的“积”,指的是积分(连续)/加权求和(离散)。
所谓两个函数的卷积,本质上就是先将一个函数翻转,然后进行滑动叠加。是一种组合数组或函数(而不是数字)的方法
连续卷积:对于连续函数 f(t)和g(t)它们的卷积定义为:
离散卷积:对于离散函数f[n] 和 g[n],他们的卷积定义为:
性质
卷积计算过程中相乘又相加的计算属性可以让我们用矩阵表示。未对齐的元素用0补齐。
角标理解角度:
从案例入手:抛两个骰子,计算两个骰子的各个点数和的出现的概率。
将结果表示在表格中可以发现相同点数和的组合都排在同一对角线上,所以只需要计算对角线上有多少个元素即可就能告诉出现某个点数和的概率
现在思考另一种方式展示这个问题,把两枚骰子的所有可能分别放到一行,然后把第二行翻转,这样所有点数和为7的组合就会纵向对齐(这里很好的解释了卷积的式子里为什么函数g里面是t-x)
这个案例中隐含假设就没每个骰子向上的概率是相同的,可如果不同呢?就需要分别计算每组出现的概率再相加
两个数组的卷积将A和B数组的值交汇,两组数的卷积生成了新的这组数,新的数列包含11个值,每个值都是两数组中若干数对之积的加和
另一种思考卷积的方式是列一个表格,计算各个组合的乘积,然后沿着各个对角线相加,就把两个数组混合起来了,得到了一个包含11种数的数组
总结:卷积的结果是一个列表,它的第n项定义为把下标ij之和为n的所有元素的乘积累加起来
应用:
滑动均值滤波,模糊
求和得出概率分布
每次迭代相当于将数据中的每个元素都乘以1/5,然后将它们加起来 - 求这个小窗口数据的平均值,总的来说,这个过程给了你一个原数据的平滑版本(滑动均值滤波)
可以用其他和为1的数组进行滑动平均,在这个例子中滑动平均会给中间的值更大的权重
如果你在二维上进行类似的操作,就能得到一个把图片变模糊的方法卧槽这不是抗锯齿的算法的模糊化。用一个3×3的网格沿着原图像移动
这些数值乘以它底下对应的像素值,当然在计算机科学中,我们把颜色当作三维向量。
把每个向量都乘以1/9然后求和就得到每个颜色通道的平均值,就得到每个颜色通道的平均值。对每个像素都如此计算,相当于每个像素都混杂了一部分到相邻的像素,这就得到了一个比原图更模糊的版本,用术语来说:右图就是原图和旋转180°小网络的卷积(本例中是否旋转无区别)
运用不同网络能得到不同效果的模糊,比如高斯模糊(模拟镜头失焦)
这些值都从一个钟形曲线(高斯分布 / 正态分布)中采样得来,将更多的权重赋予中间的像素
边界检测
黑的向量是0向量,白的向量是1,将图中像素与网络卷积的结果为负数,负数填充为红色,正数填充为蓝色。也可知当所有像素颜色相同时,结果为0。这个过程是在检测从左到右像素是否有变化,所以它可判别出图像中的所有竖向边界
用同样的逻辑,如果我们旋转这个网络,用来检测从上到下像素是个否变化就能判断横向边界
这个小网络称之为“核” Kernal
选择不同的核就可以产生不同的图像处理效果,不只是模糊化边缘检测,图像的锐化也可以,卷积神经网络,他的思路就是用数据算出应该选取什么样的核这取决于想用神经网络来检测的目标
纯数学上的卷积产生的数组总是比两个初始数组更长,在计算机中需要刻意裁掉一些输出值。且计算中fftconvolve 快速傅里叶卷积会让输出过程加快很多(其实巧妙的点就是每个点前一半的结果和后一半一样,省了)
在两个多项式相乘时,之前提到的表格计算组合乘积,再沿着每条对角线求和,就对应着每一个输出结果。此时沿着对角线求和就相当于合并同类项,扩展多项式然后合并同类项其实和卷积的过程是一样的
卷积与傅里叶函数的联系
我看到傅里叶变换可以用在多项式,复平面单位圆,三角函数,信号上,总觉得杂而乱所以梳理一下之间的关系:
频率时域 和 多项式能联系全靠三角函数
1.由于任何函数都可以用基本的正弦函数表示,而sin和cos是正交的,这也
快速卷积算法 Fast Convolution algorithm
使用卷积的地方都能看到FFT
一句话记住fft本质:单位圆上的等角复根可以通过自乘来旋转到下个解
将时间复杂度降到nlogn是程序员的基本素质
当需要将两个数组进行卷积时,将他们视为两个多项式的系数(点表示),N阶多项式就采样至少N+1个点,对这些样本逐点相乘,然后求解并恢复出系数。
应用FFT,我们现在采样的点替换为特定的复数来求解,这些复数便是单位圆上均匀分布的单位根。找到一个取幂时输出总在单位圆上循环的数就行,于是我们在计算不同项时会出现很多冗余
(不必计算就能知道值的项),从而降低计算的时间复杂度。这个输出集合被称为系数的离散傅里叶变换。多亏这些冗余项,我们才能快速地把系数转换到这些输出点,原来需要复杂度为O(n^2)的操作现在只需要O(NlogN),输入数组越大这个方法的优势就越明显。
你也可以利用IFFT将输出对应成系数
时域的卷积=频域的乘积
两函数的傅里叶变换的乘积等于他们乘积后的傅里叶变换
数学证明:
本质证明:我们知道通过傅里叶变换可以将信号从时域表示转换为频域表示为0是因为正交(详情见傅里叶级数)
Reference
(4 条消息) 如何通俗易懂地解释卷积? - 知乎
为什么卷积的底层是傅立叶变换?_哔哩哔哩_bilibili
【官方双语】那么……什么是卷积?_哔哩哔哩_bilibili
[信号与系统]傅里叶变换、卷积定理、和为什么时域的卷积等于频域相乘。_时域卷积等于频域相乘公式-CSDN博客