参考:为什么需要卷积?
从纯数学(尤其是代数和几何)的角度来看,卷积(Convolution)其实比物理意义更纯粹。它本质上是一种"受限的混合"或者说是"滑动求和。
代数视角:多项式乘法(最本源的解释)
如果你问一个代数学家卷积是什么,他会告诉你:卷积就是多项式乘法的系数计算规则。
两个多项式:
f ( x ) = a 0 + a 1 x + a 2 x 2 f(x) = a_0 + a_1x + a_2x^2 f(x)=a0+a1x+a2x2
g ( x ) = b 0 + b 1 x + b 2 x 2 g(x) = b_0 + b_1x + b_2x^2 g(x)=b0+b1x+b2x2
现在把它们乘起来: h ( x ) = f ( x ) ⋅ g ( x ) h(x) = f(x) \cdot g(x) h(x)=f(x)⋅g(x)。看看乘积中 x x x 的不同次幂的系数是怎么来的:
x 0 x^0 x0 的系数 :只有 a 0 b 0 a_0 b_0 a0b0。 x 1 x^1 x1 的系数 : a 0 b 1 + a 1 b 0 a_0 b_1 + a_1 b_0 a0b1+a1b0。 x 2 x^2 x2 的系数 : a 0 b 2 + a 1 b 1 + a 2 b 0 a_0 b_2 + a_1 b_1 + a_2 b_0 a0b2+a1b1+a2b0。(注意下标的和!) x k x^k xk 的系数 :所有满足下标 i + j = k i + j = k i+j=k 的 a i b j a_i b_j aibj 之和。
写成公式就是:
c k = ∑ i a i b k − i c_k = \sum_{i} a_i b_{k-i} ck=i∑aibk−i
卷积就是当我们把两个序列( a a a 和 b b b)看作多项式的系数时,它们乘积的新系数。
为什么是 k − i k-i k−i ? :因为指数相加要等于 k k k( x i ⋅ x j = x i + j = x k x^i \cdot x^j = x^{i+j} = x^k xi⋅xj=xi+j=xk),所以如果第一项是 i i i,第二项必然是 k − i k-i k−i。这就是"互补"的数学来源。
几何视角:翻转与滑动(Flip and Drag)
回到连续函数的定义:
( f ∗ g ) ( t ) = ∫ − ∞ ∞ f ( τ ) g ( t − τ ) d τ (f * g)(t) = \int_{-\infty}^{\infty} f(\tau) g(t - \tau) d\tau (f∗g)(t)=∫−∞∞f(τ)g(t−τ)dτ
如果不看物理意义,只看几何操作,这个积分描述了四个步骤:
- 换元(Re-parameterize) :把 f ( x ) f(x) f(x) 和 g ( x ) g(x) g(x) 放到同一个临时坐标轴 τ \tau τ 上,变成 f ( τ ) f(\tau) f(τ) 和 g ( τ ) g(\tau) g(τ)。
- 翻转(Flip/Reflect) : g ( − τ ) g(-\tau) g(−τ)。这就是把函数 g g g 绕着 y 轴做了一个镜像。
- 平移(Shift/Drag) : g ( t − τ ) g(t - \tau) g(t−τ)。其中的 t t t 是一个偏移量。随着 t t t 从 − ∞ -\infty −∞ 变到 + ∞ +\infty +∞,这个翻转后的 g g g 函数就在轴上从左向右滑动。
- 加权求和(Integrate) :在每一个 t t t 的位置,计算 f ( τ ) f(\tau) f(τ) 和移位后的 g g g 重叠部分的面积(乘积的积分)。
为什么要有"翻转"这个动作?
这其实是为了配合"平移"。
- 在 g ( t − τ ) g(t - \tau) g(t−τ) 中,变量是 τ \tau τ。
- τ \tau τ 前面有个负号,意味着相对于 τ \tau τ 轴, g g g 是反向的。
- 如果不翻转,直接平移,那就是在这个轴上做相关性(Correlation)运算,而不是卷积。卷积的数学定义强制要求了这种"反向"的对称性。
再具体说说翻转这个操作:
任何系统对输入的反应并不是瞬间完成的,而是历史作用的积累。也就是说你现在感知到的信息除了当前输入会影响你外,之前的若干输入也还会影响你,只是这个影响会随着时间有衰减。假如现在是t时刻,你所受的影响除了当前的输入f(t)外,还受到前一时刻的输入f(t-1)影响,只不过t-1时刻的影响会衰减。我们假设衰减函数为 g ( t ) = 0.5 t g(t)=0.5^t g(t)=0.5t,那么t-1时刻的信号衰减为0.5*f(t-1)。
想象你对着一个山谷喊话,山谷会产生回声。
- 你的声音是输入信号 x ( t ) x(t) x(t)。
- 山谷的回声特性是系统的冲激响应 h ( t ) h(t) h(t)(比如:第1秒响,第2秒弱,第3秒消失)。
现在是 12:00 (当前时刻 t t t),我们要计算你此时此刻听到的总声音。
- 刚才(11:59:59)喊的声音 :
因为它刚刚发出才 1 秒,所以你听到的是它对应回声的开头部分 ( h ( 1 ) h(1) h(1))。最新的输入 ,对应最新鲜的响应 ( h h h 的头部,即 t t t 小的部分) - 很久前(11:59:00)喊的声音 :
因为它已经发出了 60 秒,所以你听到的是它对应回声的尾巴部分 ( h ( 60 ) h(60) h(60))。最老的输入 ,对应最陈旧的响应 ( h h h 的尾部,即 t t t 大的部分)
如果在时间轴上画图:输入信号 x ( τ ) x(\tau) x(τ) 是按时间顺序排列的(旧 → \rightarrow → 新)。但它们对现在的贡献,是按 h h h 的逆序 排列的(尾巴 → \rightarrow → 头部)。
这就是为什么要反转:
为了把"过去的输入"和"它经过了多久后的响应"对齐,我们必须把响应函数 h ( τ ) h(\tau) h(τ) 在时间轴上翻转过来,变成 h ( − τ ) h(-\tau) h(−τ),然后平移到当前时刻 t t t,变成 h ( t − τ ) h(t-\tau) h(t−τ)。
卷积是一种运算,将一个函数与另一个函数进行翻转滑动相乘做积分。实际上就是对每个局部进行特征提取,最终形成一个新的有意义的表示。任何现象不是孤立存在的,而是与周围环境持续交互的结果,当下的状态也都受到历史的影响。万物互相关联,过去塑造现在。卷积大量应用在人工智能、信号处理、物理学等很多领域。