目录标题
-
-
- 一、卷积的数学定义公式是:
- 二、公式是怎么来的?(核心推导过程)
- [三、为什么公式里是 g ( n − i ) g(n - i) g(n−i) 而不是 g ( i ) g(i) g(i)?(最让人困惑的点)](#三、为什么公式里是 g ( n − i ) g(n - i) g(n−i) 而不是 g ( i ) g(i) g(i)?(最让人困惑的点))
- 四、图解步骤(用最简单的数字代进去)
- 五、总结一下离散卷积
- 六、卷积种类
-
- [1. 连续卷积 (Continuous Convolution)](#1. 连续卷积 (Continuous Convolution))
- [2. 循环卷积 / 圆周卷积 (Circular Convolution)](#2. 循环卷积 / 圆周卷积 (Circular Convolution))
- [3. 二维卷积 (2D Convolution)](#3. 二维卷积 (2D Convolution))
- [4. 图卷积 (Graph Convolution)](#4. 图卷积 (Graph Convolution))
- [5. 互相关 (Cross-Correlation) ------ 卷积的"双胞胎兄弟"](#5. 互相关 (Cross-Correlation) —— 卷积的“双胞胎兄弟”)
- 总结一张表
-
一、卷积的数学定义公式是:
( f ∗ g ) ( n ) = ∑ i = − ∞ ∞ f ( i ) ⋅ g ( n − i ) (f * g)(n) = \sum_{i=-\infty}^{\infty} f(i) \cdot g(n-i) (f∗g)(n)=i=−∞∑∞f(i)⋅g(n−i)
- f f f 和 g g g:代表两个离散序列(可以理解为两排数字)。
- ∗ * ∗:代表卷积操作(不是乘号)。
- n n n:代表当前我们要计算结果的第 n n n 个位置(时间点)。
- i i i:是一个临时变量,代表从 − ∞ -\infty −∞ 到 + ∞ +\infty +∞ 遍历的索引。
- ∑ \sum ∑:求和符号,把所有情况加起来。
二、公式是怎么来的?(核心推导过程)
我们要明白,卷积的本质是:一个函数(信号)对另一个函数(系统)的"累积影响"。
为了让你秒懂,我们不讲抽象的 f f f 和 g g g,我们讲一个"打拳击"的例子。
1. 设定场景(定义 f f f 和 g g g)
假设你在打拳击,有一个"出拳序列" f f f,和一个"身体恢复序列" g g g。
- f ( i ) f(i) f(i):代表你在第 i i i 秒打出了多少力量的一拳。
- 比如:第1秒打了一拳力量为 f ( 1 ) = 2 f(1) = 2 f(1)=2;第2秒没打 f ( 2 ) = 0 f(2) = 0 f(2)=0;第3秒打了一拳力量为 f ( 3 ) = 5 f(3) = 5 f(3)=5。
- g ( k ) g(k) g(k):代表一拳打完后,过了 k k k 秒,你身体还能感到的"疼痛残留度"(或者叫系统的衰减响应)。
- 比如:刚打完那秒( k = 0 k = 0 k=0),疼感是 g ( 0 ) = 1 g(0) = 1 g(0)=1;过1秒( k = 1 k = 1 k=1),疼感剩一半 g ( 1 ) = 0.5 g(1) = 0.5 g(1)=0.5;过2秒 g ( 2 ) = 0.2 g(2) = 0.2 g(2)=0.2。
2. 现在的问题:求第 n n n 秒时,你总共承受了多少"疼痛值"?
这就是我们要算的 ( f ∗ g ) ( n ) (f * g)(n) (f∗g)(n)。
我们来推导一下第 n n n 秒的疼痛是怎么来的:
- 情况 A: 第 n n n 秒刚刚打出的那一拳,贡献的疼痛。
- 出拳力量是: f ( n ) f(n) f(n)。
- 因为是刚打完,时间差 k = 0 k = 0 k=0,对应的残留系数是 g ( 0 ) g(0) g(0)。
- 这一拳的贡献 = f ( n ) ⋅ g ( 0 ) f(n) \cdot g(0) f(n)⋅g(0)。
- 情况 B: 第 n − 1 n - 1 n−1 秒打出的那一拳,到了第 n n n 秒,已经过了1秒了。
- 出拳力量是: f ( n − 1 ) f(n - 1) f(n−1)。
- 时间差 k = 1 k = 1 k=1,残留系数是 g ( 1 ) g(1) g(1)。
- 这一拳的贡献 = f ( n − 1 ) ⋅ g ( 1 ) f(n - 1) \cdot g(1) f(n−1)⋅g(1)。
- 情况 C: 第 n − 2 n - 2 n−2 秒打出的那一拳,到了第 n n n 秒,已经过了2秒了。
- 贡献 = f ( n − 2 ) ⋅ g ( 2 ) f(n - 2) \cdot g(2) f(n−2)⋅g(2)。
- ... 以此类推。
- 情况 D: 第 i i i 秒打出的那一拳,到了第 n n n 秒,过了 ( n − i ) (n - i) (n−i) 秒。
- 出拳力量是: f ( i ) f(i) f(i)。
- 时间差 k = n − i k = n - i k=n−i,残留系数是 g ( n − i ) g(n - i) g(n−i)。
- 这一拳的贡献 = f ( i ) ⋅ g ( n − i ) f(i) \cdot g(n - i) f(i)⋅g(n−i)。
3. 把所有情况加起来(得出公式)
第 n n n 秒的总疼痛,就是历史上每一秒打出的拳,在第 n n n 秒残留的疼痛的总和。
- 可能第 n n n 秒之前的所有出拳都会影响现在。
- 在遥远的过去(比如 i = − ∞ i = -\infty i=−∞),或者未来的出拳(虽然一般物理上不存在,但数学上写全),把所有可能的 i i i 对应的贡献加起来。
把上面的情况 D 写成数学求和式,就是:
总疼痛 ( n ) = ∑ 所有的 i f ( i ) ⋅ g ( n − i ) \text{总疼痛}(n) = \sum_{\text{所有的 } i} f(i) \cdot g(n - i) 总疼痛(n)=所有的 i∑f(i)⋅g(n−i)
f ( i ) f(i) f(i) 是"过去某时刻的输入", g ( n − i ) g(n - i) g(n−i) 是"这个输入经过 n − i n - i n−i 时间后的影响"。
三、为什么公式里是 g ( n − i ) g(n - i) g(n−i) 而不是 g ( i ) g(i) g(i)?(最让人困惑的点)
很多人不明白,为什么第二个函数要写成 g ( n − i ) g(n - i) g(n−i),还要把 g g g 翻折一下?
我们用刚才的例子想一下:
- g ( k ) g(k) g(k) 的定义是:过了 k k k 秒的疼痛残留。
- 对于第 n n n 秒来看,第 i i i 秒发生的事,已经过去了 n − i n - i n−i 秒。
- 所以我们要找的是"过了 n − i n - i n−i 秒"的残留系数,所以必须带入 g ( n − i ) g(n - i) g(n−i)。
- 如果你写成 f ( i ) ⋅ g ( i ) f(i) \cdot g(i) f(i)⋅g(i),那就变成了"出拳力量乘以出拳时间本身的残留",这在逻辑上是不通的。
四、图解步骤(用最简单的数字代进去)
假设:
- 出拳序列 f = 2 , 3 f = 2, 3 f=2,3 (第0秒打2,第1秒打3)
- 衰减序列 g = 1 , 0.5 g = 1, 0.5 g=1,0.5 (刚打疼痛1,过一秒疼痛0.5)
求第1秒的总疼痛 ( f ∗ g ) ( 1 ) (f * g)(1) (f∗g)(1):
根据公式: n = 1 n = 1 n=1。
( f ∗ g ) ( 1 ) = ∑ i f ( i ) ⋅ g ( 1 − i ) (f * g)(1) = \sum_{i} f(i) \cdot g(1 - i) (f∗g)(1)=i∑f(i)⋅g(1−i)
我们要遍历 i i i:
- 当 i = 0 i = 0 i=0(第0秒的拳): f ( 0 ) ⋅ g ( 1 − 0 ) = 2 ⋅ g ( 1 ) = 2 ⋅ 0.5 = 1 f(0) \cdot g(1 - 0) = 2 \cdot g(1) = 2 \cdot 0.5 = 1 f(0)⋅g(1−0)=2⋅g(1)=2⋅0.5=1
- 当 i = 1 i = 1 i=1(第1秒的拳): f ( 1 ) ⋅ g ( 1 − 1 ) = 3 ⋅ g ( 0 ) = 3 ⋅ 1 = 3 f(1) \cdot g(1 - 1) = 3 \cdot g(0) = 3 \cdot 1 = 3 f(1)⋅g(1−1)=3⋅g(0)=3⋅1=3
- 其他 i i i 都是0。
- 求和: 1 + 3 = 4 1 + 3 = 4 1+3=4。
- 所以第1秒总疼痛是4。(逻辑:0秒的拳衰减了一半剩1,1秒的拳刚打全疼3,加起来是4)。
五、总结一下离散卷积
- 这是啥公式: 离散卷积的通用定义式,计算某个时刻 n n n 的累积效果。
- 怎么来的: 拆解历史发生的每一个事件 f ( i ) f(i) f(i),算出它对当前时刻 n n n 的剩余影响 g ( n − i ) g(n - i) g(n−i),然后全部加起来。
- 核心记忆法: "历史输入 × \times × 时间差响应,全部求和"。公式里那个 n − i n - i n−i 就是时间差,它自然导致了函数 g g g 看起来像是被翻转和滑动了。
如果你能理解"打拳的疼痛残留",你就已经懂了这个公式的核心。
六、卷积种类
"卷积"本质上是一种数学运算规则(就像加减乘除一样),它的核心思想永远是:"一个东西对另一个东西的累积影响"。根据应用场景和数据形态的不同,卷积主要分为以下几种类型。
1. 连续卷积 (Continuous Convolution)
- 公式: ( f ∗ g ) ( t ) = ∫ − ∞ ∞ f ( τ ) ⋅ g ( t − τ ) d τ (f * g)(t) = \int_{-\infty}^{\infty} f(\tau) \cdot g(t - \tau) d\tau (f∗g)(t)=∫−∞∞f(τ)⋅g(t−τ)dτ
- 区别在哪: 你把离散卷积里的"求和符号 ∑ \sum ∑"变成了"积分符号 ∫ \int ∫"。
- 通俗解释: 离散卷积是"一秒一秒"打拳(离散的、断开的点);而连续卷积是"水龙头一直在流水",时间是连续不断的。
- 生活例子: 假设 f ( t ) f(t) f(t) 是你往杯子里倒水的速度(每秒钟倒多少毫升), g ( t ) g(t) g(t) 是杯子漏水或者水温散失的规律。那么任意时刻 t t t 杯子里总共有多少水(或热量),就是用连续卷积算出来的。你要把过去每一个"无穷小"的时间片段 d τ d\tau dτ 里倒进去的水,算上它经过 t − τ t - \tau t−τ 时间后的流失,全部积分累加起来。
2. 循环卷积 / 圆周卷积 (Circular Convolution)
- 公式: ( f ⊛ g ) ( n ) = ∑ i = 0 N − 1 f ( i ) ⋅ g ( ( n − i ) m o d N ) (f \circledast g)(n) = \sum_{i=0}^{N-1} f(i) \cdot g((n - i) \bmod N) (f⊛g)(n)=∑i=0N−1f(i)⋅g((n−i)modN)
- 区别在哪: 公式里多了一个 m o d N \bmod N modN(取余数)。
- 通俗解释: 刚才的离散卷积,时间轴是从 − ∞ -\infty −∞ 到 + ∞ +\infty +∞ 一直往前走的直线。但在循环卷积里,时间轴是一个"圆圈"。
- 生活例子: 想象一个钟表(只有12个小时)。现在是3点,过了10个小时是几点?是1点(因为 3 + 10 = 13 3 + 10 = 13 3+10=13, 13 m o d 12 = 1 13 \bmod 12 = 1 13mod12=1)。在计算机处理数字信号(比如处理一段循环播放的音频)时,因为内存是有限的,数据首尾相连,所以必须用循环卷积。
- 怎么来的: 当你把离散卷积的 f f f 和 g g g 序列看作是首尾相接的环,滑动的时候,滑出右边的部分会立刻从左边"转"回来,这就是取余数的由来。
3. 二维卷积 (2D Convolution)
- 公式: ( f ∗ g ) ( m , n ) = ∑ i ∑ j f ( i , j ) ⋅ g ( m − i , n − j ) (f * g)(m, n) = \sum_i \sum_j f(i, j) \cdot g(m - i, n - j) (f∗g)(m,n)=∑i∑jf(i,j)⋅g(m−i,n−j)
- 区别在哪: 从一维(一条线)变成了二维(一个面),出现了两个求和符号。
- 通俗解释: 现在的输入不再是一维数组,而是一张图片(矩阵)。
- 生活例子(最著名的应用):图像处理与人工智能(CNN 卷积神经网络)。
- 这里 f f f 是一张图片(比如 100 × 100 100 \times 100 100×100 像素的矩阵)。
- g g g 叫做"卷积核"或"滤波器"(通常是一个 3 × 3 3 \times 3 3×3 的小矩阵)。
- 计算过程:把这个 3 × 3 3 \times 3 3×3 的小窗口放在图片左上角,对应位置相乘再相加,得出一个数字;然后把窗口往右滑动一格,再算一次......就像拿着一个放大镜在图片上滑来滑去。
- 作用:如果 g g g 是一个"边缘检测核",算出来的结果就能把图片里的轮廓提取出来;如果 g g g 是模糊核,图片就会变模糊。AI 就是通过几百万次这样的二维卷积,来"看懂"图片的。
4. 图卷积 (Graph Convolution)
- 区别在哪: 前几种卷积都在"规则网格"上(一条线,或者整齐的像素方块)。但如果你的数据是不规则的怎么办?
- 生活例子: 社交网络。你、你朋友、你朋友的朋友,关系网像蜘蛛网一样,不是整齐排列的。每个人的朋友数量(节点度数)都不一样。
- 怎么算: 图卷积的逻辑依然是"收集邻居的信息"。对于网络中的某个节点 n n n,它的当前状态,就是它自己过去的状态,加上它所有邻居节点状态的加权求和。这在药物发现、交通流量预测、推荐系统中非常常用。
5. 互相关 (Cross-Correlation) ------ 卷积的"双胞胎兄弟"
- 公式: ( f ⋆ g ) ( n ) = ∑ i = − ∞ ∞ f ( i ) ⋅ g ( n + i ) (f \star g)(n) = \sum_{i=-\infty}^{\infty} f(i) \cdot g(n + i) (f⋆g)(n)=∑i=−∞∞f(i)⋅g(n+i) (注意这里是加号)
- 区别在哪: 它和离散卷积几乎一模一样,唯一区别是不翻转(不取负号)。
- 为什么提它: 在数学理论上,卷积要翻转一下( g ( n − i ) g(n - i) g(n−i));但在深度学习(比如 CNN)和工程实践中,我们通常只关心"滑动匹配",不关心翻不翻转(因为滤波器的权重是学出来的,翻不翻转无所谓)。很多程序员写的"卷积",底层其实是"互相关"。但在信号处理里,翻转是为了严格保证因果性(未来的事情不能影响过去)。
总结一张表
| 卷积类型 | 数据形态 | 核心应用领域 | 一句话理解 |
|---|---|---|---|
| 离散卷积 | 离散的一维数列 | 数字信号处理、算法 | 一秒钟一秒钟地累加影响(打拳痛感) |
| 连续卷积 | 连续的一维函数 | 物理、电子工程、控制论 | 积分起来,无时无刻不在累加(水流) |
| 循环卷积 | 首尾相连的离散列 | 计算机、通信(如 FFT) | 像钟表一样转圈圈,滑出尾部从头部回来 |
| 二维卷积 | 矩阵(图片) | 图像处理、计算机视觉(CNN) | 拿着小放大镜(卷积核)在图片上滑动扫视 |
| 图卷积 (GCN) | 不规则的图数据 | 社交网络、化学分子分析 | 收集邻居节点的信息来更新自己 |
终极奥义: 无论名字叫什么,形态怎么变,它们都在干同一件事:遍历所有的时间/空间点,把"输入"和"衰减/权重"相乘,最后加起来。这就是卷积家族的灵魂。