连续卷积、导数、二维卷积和图卷积

chaos 2026-09-17 四 00:53
TODO 

1. 核心概览

本文是对 一维离散卷积、循环位移矩阵和 FFT 文中离散卷积、傅里叶变换在连续空间、二维离散空间和图上的扩展。

首先离散傅里叶变换是矩阵对角化分解的一种特殊情况的应用,给定任意方阵 A, 如果它能够对角化为 \( A=X \Sigma X^{-1} \), 那么 Ax 就能写成先进行基变换 \( X^{-1}x \) 进入到 X 空间,在其中进行 \( \Sigma \) 缩放,再重新变换回到原始空间。

卷积(尤其循环卷积)的特殊之处在于它对应的 A 矩阵能写成循环右移(或左移)矩阵的多项式形式,于是所有 nxn 的循环卷积共享特征矩阵 \( F_n \) ,而 \( F_n \) 的性质又及其优越,单位正交、对称、共轭就是逆、循环,因此最终 A 的对角化效率是 nlog(n), 基变换效率也是 nlog(n), 从而将 \( n^2 \) 的矩阵变换复杂度变成了 nlog(n) 。

然而,当输入向量非常长,即便是 Nlog(N) 的复杂度,当 N 接近无穷,人类也是无法接受的(或者存储上也无法接受)。

但如果这 n 个点又被解释为某个空间或某段时间里的采样点时,那么人类可以通过另一种高度压缩的机制来描述这些点 – 连续函数,比如 f(t)=1 ,在 0 到 1 区间里的 1 万亿个在 x 和 y 轴角平分线上的点也只需要用 1 这一个数来编码。

此时我们进入了纯粹符号操作的世界,从数值计算进入到符号计算,这是一种次级系统,就像二手书或者人类的官僚系统一样。

在该符号系统中,我们看到导数就是一种卷积,而且利用符号递归算法,对任意压缩表达成符号的函数,利用求导规则(比如其中链式法则),卷积效率非常之高,我们根本不需要把导数对角分解,用类似 FFT 的方式去处理。

但在连续函数的另外一些卷积上,比如更高阶的导数、概率分布之间卷积(对应随机变量加法复合),用傅里叶变换的思路又高效了起来,这种高效并非是针对机器时间或空间上的 \( O(n^2) \) 到 \( O(n\log(n)) \) 的优化,而是针对人的认知复杂度的优化。

在介绍完这种符号压缩智能之后,我们再回到离散的数值世界,将一维卷积扩展到二维,并解释其中二维的频率是什么?

而二维图可以看作更一般的 (G,E) 图结构的特例,图上的频率、谱的概念开始出现,并需要有新的解释。

最后我们会对比两种方式,一种目的由谱空间(或者频域)驱动,但执行是在表象层的算法和设计,比如机器学习中的正则 ,图像卷积、图卷积等

另一种是我们能够直接进入本质(频域)去操作的场景,但这往往需要借助 FFT 或许相关变体,比如滤波,深度学习优化中的 MuOn。

2. 从离散向量到连续函数

2.1. 连续周期特征函数和频谱

假设长度为 n 的输入向量 x 被解释为是均匀地分布在长度为 T 的时间(或空间)段上的。

那么我们可以用时间来替代整数索引,比如 \( t_j=\frac{jT}{n} \), j 是向量的索引,范围在 0 到 n-1,比如 x[j], 而 tj 则在 0 到 T.

用 \( x(t_j) \) 索引具体元素可以理解为先把 \( t_j \) 转成 j : \( j = \frac{nt_j}{T} \) 并取整然后取值 x[j]。

或者说 x() 是 0 到 T 的函数,而非 0 到 n-1 ,x[j] 就等于 \( x(\frac{jT}{n}) \) ,

对这些数据进行循环卷积,会对应一个 nxn 的循环卷积矩阵,其特征矩阵是 \( F_n \) ,该矩阵有 n 个不同的特征向量,每个向量有 n 个元素。

归一化后特征矩阵中第 j 行第 k 列为: \( F_n[j,k]=\frac{1}{\sqrt{n}} e^{2\pi i kj/n} \)

当 n 不断增大时,特征向量的数量在不断增多,其长度也在增长。

为了保持卷积结果尺度的一致,卷积核必须总体除以 n, 比如原本是是 [1,1] 去卷积信号 [1,1] ,结果是 2, 现在信号扩展到了 [1,1,1,1], 卷积核扩充到 [1,1,1,1] 结果就 4 了,因此为了在细节不断增多的情况下仍然保持卷积功能一致性,需要除以 n 来保持尺度。

将 1/n 分配到对角化分解 \( F_n D F_n^* \) 中的 \( F_n \) 和 \( F_n^* \) 上,得到 \( F_n[j,k]=\frac{1}{n} e^{2\pi i kj/n} \)

虽然 \(F_n\) 在代数上是对称的,即 \( F_n[j, k]=F_n[k, j] \) ,但两个索引的意义并不相同。

比如,离散傅里叶正向变换形式为 \( F_n^*x \) , 其结果的第 k 个元素是 \( F_n \) 的第列共轭转置后和 x 的每个元素相乘。

因此 \( F_n[j,k] \) 中的 j 和 x[j] 中 j 意义相同,是对数据的采样,而 k 是特征向量的编号。

离散傅里叶变换原本是:

\[ c[k]=\frac{1}{n} \sum_{j=0}^{n-1} x[j]e^{-2\pi i kj/n} \]

把 x[j] 写成 [0,T] 上函数形式 x(t) :

\[ c[k]= \frac{1}{n} \sum_{j=0}^{n-1} x(\frac{jT}{n})e^{-2\pi i kj/n} \]

这个过程完全是等价变换,并没有任何近似或者极限加入。

现在考虑 n 趋于无穷大,我们想得到 X[k] 的极限。

首先从这种无限求和中又有某种无限细分的式子中联想到定积分的定义, [0,1] 区间上定义为:

\[ \int_0^1 f(x) dx = \lim_{n\to \infty} \frac{1}{n} \sum_{i=0}^{n-1} f(\frac{i}{n}) \]

[0,T] 上则是

\[ \int_0^T f(x) dx = \lim_{n\to \infty} \frac{T}{n} \sum_{i=0}^{n-1} f(\frac{iT}{n}) \]

按照这个模板把 c[k] 写成

\[ c[k]= \frac{1}{T} \frac{T}{n} \sum_{j=0}^{n-1} x(\frac{jT}{n})e^{-2\pi i k jT/n \frac{1}{T}} \]

在 n 趋于无穷的极限下:

\[ c[k] = \frac{1}{T} \int_0^T x(t) e^{-2\pi i k \frac{t}{T}} dt \]

这里向量内积对应了连续情况下的区间积分,数据矩阵从 x[j] 变成 x(t) 函数,而特征向量变成了特征函数:

\( \varphi_k(t)= e^{2\pi i k t/T}. \)

\( \varphi_k(t) \) 是一个周期为 T 的函数:

\[ \varphi_k(t+T) = e^{2\pi i k (t+T)/T} =e^{2\pi i k t/T}e^{2\pi i k} =\varphi_k(t) \]

而 T/k 也是它的周期:

\[ \varphi_k(t+\frac{T}{k})=e^{2\pi i k (t+\frac{T}{k})/T} =e^{2\pi i k t/T}e^{2\pi i} =\varphi_k(t) \]

因此,对于每一列特征向量,或者如今的特征函数,它们共享一个公共周期 T, 但各自又有周期 T/k

\( c[k] \) 是傅里叶级数的系数,从离散情况上看,它表示的是数据 x 和某个特征向量的共轭(或转置)的内积,而由于特征向量是单位向量,所以这个内积结果可以解释为 x 在该特征向量方向的投影系数 ,如果数据 x 和特征根向量方向相同那么达到最大,如果垂直结果就是 0.

推广到连续情况,傅里叶系数是函数 x(t) 在特定正交基上的投影系数,即我们从向量投影类比到了函数投影。

对于每个 k ,或者说每个频率 \( f_k = \frac{k}{T} \) 都对应了一个这样的值。

当要把它重新转换回到 x 数据的时候,则是用这个系数直接去对特征向量(函数)加权:

\[ x(t) = \sum_{k=0}^{n-1} c_k e^{2\pi i f_k t } \]

极限情况下变成: \( \sum_{k=0}^{\infty} c_k e^{2\pi i f_k t} \)

因此这里展示的是,一个区间在 [0,T] 的函数,将其不断复制扩展成周期函数后(循环卷积就是把它看作无限循环的周期函数) 可以将其写成无数个频率从 0 到无穷的复指数周期函数的叠加。

这个高层的思路是对的,但在数学或者逻辑上,会有一个错误,修正方法是把 k 的范围从非负整数变成整个整数

2.1.1. 负频率

前面我们是基于这种直觉: 在 n 有限的时候,k 取 0 到 n,于是 n 趋于无穷时,k 就是 0 到正无穷

但由于 n 趋于无穷的时候有特征矩阵的行和列同时在趋向无穷,而当前我们是固定某个列 k, 然后只关注单边无穷, 比如对于 k=0 :

  • n=1 时,特征向量为 [1]
  • n=2 时,特征向量为 [1,1]
  • n=3 时,特征向量为 [1,1,1]
  • n 趋向无穷时,我们可以用 [0,T] 上的 x(t)=1 函数直接符号压缩

而 k=1 ,要从 n=2 开始:

  • n=2 时,向量是 [1, \( e^{2\pi i/2} \)] = [1,-1]。
  • n=3 时,向量是 [1, \( e^{2\pi i/3} \), \( e^{4\pi i/3} \)]。
  • n=3 时,向量是 [1, \( e^{2\pi i/4} \), \( e^{4\pi i/4}, e^{6\pi i/4} \)]。

这些点越来越密地落在单位圆上,而且它们采样的是同一个函数 \(e^{2\pi i t}\),其中 \(t=j/n\)。所以 k=1 的列收敛到 \( e^{2\pi i t} \)。

而 \(k=n-1\):

  • \(n=2\) 时 \(k=1\),向量 \([1,-1]\)。
  • \(n=3\) 时 \(k=2\),向量 \([1, e^{2\pi i \frac{2}{3}}, e^{2\pi i \frac{4}{3}}] = [1, e^{-2\pi i \frac{1}{3}}, e^{-2\pi i \frac{2}{3}}]\)。
  • \(n=4\) 时 \(k=3\),向量 \([1, e^{2\pi i \frac{3}{4}}, e^{2\pi i \frac{6}{4}}, e^{2\pi i \frac{9}{4}}] = [1, e^{-2\pi i \frac{1}{4}}, e^{-2\pi i \frac{2}{4}}, e^{-2\pi i \frac{3}{4}}]\)。

所以它一直在采样 \(e^{-2\pi i t}\)。因此 \(k=n-1\) 的列收敛到 \(e^{-2\pi i t}\)。也就是负频率周期上。

这是因为 \( e^{2\pi i \frac{n-1}{n}} = e^{-2\pi i \frac{1}{n}} \) 。

同样, k=n-m ,这里 m 是任何有限整数,在 n 趋于无穷时,都应该写成 k=-m, 因为我们无法在 n 趋于无穷时固定 "n-m" 。

比如,假设 n 为偶数,且 \(k=n/2\) ,它对应的是:

\[ e^{\pi i n t} = e^{2\pi i (n/2) t}. \]

频率 n/2 随 \(n\) 趋于无穷。所以它不是采样某个固定的连续函数 \(e^{2\pi i k t}\),而是频率不断增大,振荡越来越快。因此它不收敛到有限频率的复指数。

所以,有些列可以说是不收敛的,在从离散到连续的过程中,保留下来的频率标签是所有固定整数 k,包括负整数、零和正整数。

因此傅里叶逆级数写法应该是:

\[ \sum_{k= -\infty}^{\infty} c_k e^{2\pi i f_k t} \]

如果保持 0 到正无穷的写法,我们会漏掉那些在有限情况下的第 n-1 、n-2 、n-3… 个频率分量(因为它们全都在无穷远处)

另一方面,根据欧拉公式,

\[ e^{2\pi i f_k t}=\cos(2\pi f_k t)+i\sin(2\pi f_k t). \] 对应负频率一项是

\[ e^{-2\pi i f_k t}=\cos(2\pi f_k t)-i\sin(2\pi f_k t). \]

两者互为共轭。对于实信号,傅里叶系数满足 \(c_{-k}=\overline{c_k}\)。正负频率成对出现时,虚部相互抵消,最后才能得到实数 x(t)。如果没有负频率,无论 \( c_k \) 取什么值,求和一般都会留下非零虚部,无法保证回到实数的 x(t)。所以负频率不是额外修正,而是复指数基完整表示实周期函数所必需的另一半。

2.2. 傅里叶变换:周期函数到非周期函数

当数据在某个有限范围 T 中越来越“稠密”时,我们固定特征向量的每一列(即频率),把存储数据的向量用符号函数压缩了,求和也变成了积分:

\[ c_k=\frac{1}{T}\int_0^T x(t)e^{-2\pi i \frac{k}{T} t}dt, \]

在复指数函数中,k 仍然是整数,因为我们是在做循环卷积,要求这个复指数以 T 为周期。也就是

\[ e^{2\pi i k(t+T)/T}=e^{2\pi i k t/T} \]

这等价于

\[ e^{2\pi i k}=1. \]

所以 k 必须是整数,这个条件和 n 没有关系,n 只是控制时间采样有多密,它不影响周期边界条件。

只要 T 还是有限的,并且我们仍然要求函数以 T 为周期,频率就只能取

\[ f_k=\frac{k}{T},\qquad k\in\mathbb Z. \]

相邻频率的间隔是

\[ \Delta f=\frac{1}{T}. \]

所以频率轴仍然是离散的,这不是采样造成的,而是有限周期造成的。

当 T 不断增大趋于无穷时,周期条件逐渐消失,函数不再被要求重复自己。此时频率间隔

\[ \Delta f=\frac{1}{T}\to 0. \]

原本离散的频率点

\[ \cdots,-\frac{2}{T},-\frac{1}{T},0,\frac{1}{T},\frac{2}{T},\cdots \]

越来越密,最终可以看成连续的频率变量 s, 也就是用 s 取代 k/T

于是定义连续的频率变量

\[ s=\frac{k}{T}. \]

原来离散的频率点 \(k/T\) 就变成了 s。相邻频率点的间隔是

\[ \Delta s=\frac{1}{T}. \]

当 T 不断增大,\(\Delta s\) 越来越小,最终趋于 0,离散频率点越来越密,铺满整个实数轴。

这时候正变换可以写成

\[ c_k=\frac{1}{T}\int_0^T x(t)e^{-2\pi i \frac{k}{T} t}dt =\Delta s \int_0^T x(t)e^{-2\pi i s t}dt. \]

定义有限区间上的频率系数

\[ X_T(s)=\int_0^T x(t)e^{-2\pi i s t}dt, \]

那么

\[ c_k=X_T(s_k)\Delta s. \]

代回逆变换:

\[ x(t)=\sum_{k=-\infty}^{\infty} c_k e^{2\pi i k t/T} =\sum_{k=-\infty}^{\infty} X_T(s_k)e^{2\pi i s_k t}\Delta s. \]

现在右边已经是一个黎曼和。当 T 趋于无穷时,\(\Delta s\to 0\),离散的 \(s_k\) 变成连续变量 s,求和变成积分:

\[ x(t)=\int_{-\infty}^{\infty} X(s)e^{2\pi i s t}ds, \]

其中

\[ X(s)=\int_{-\infty}^{\infty} x(t)e^{-2\pi i s t}dt. \]

这就是傅里叶变换对。

这里要强调,不能把正变换和逆变换拆开,各自单独取极限。

正变换里的 \(1/T\) 和逆变换里的求和间隔 \(\Delta s=1/T\) 是同一个东西。正是这个 \(1/T\) 提供了逆变换求和变成积分时所需的 \(\Delta s\)。如果只单独对正变换取极限,未归一化的系数不会收敛到一个有限函数;如果只把逆变换的求和换成积分,却没有正变换提供的尺度,整个变换对的归一化就会对不上。

这其实和前文离散傅里叶变换过渡到傅里叶级数类似,需要整体来看待极限的过程。比如离散情况下,归一化之后的特征向量第 j 行是: \[ v_k[j] = \frac{1}{n}e^{2\pi i k \frac{j}{n} } \]

如果直接对 n 取极限,它不会收敛成特征函数 \( e^{2\pi i k \frac{t}{T} } \), 因为 1/n 会让它变成 0 ,此时我们考虑的是未归一化的 \( e^{2 \pi i k \frac{j}{n}} \) 的极限,然后保证逆变换能正确得到原信号。

或者说在离散傅里叶变换、连续傅里叶级数和连续傅里叶变换中,单方向变换的尺度是不一样的

2.3. 求导作为一种卷积

对于离散卷积,可以把卷积核写成循环矩阵 C ,然后用 Cx 来表示卷积操作,但现在问题是,当 x 的长度 n 趋于无穷的时候 C 是一个什么矩阵?

连续情况下卷积操作是什么?

我们可以从特征向量的意义入手,离散中,特征向量是使得在矩阵 C 变化下方向保持不变的对象。

连续世界中,我们无法找到对应矩阵来表示卷积,但“变换”这种更抽象的性质仍然存在,且特征函数也存在,于是我们问题的是,什么变换作用在复指数函数上,得到的还是复指数函数?

由于指数函数求导后还是指数函数,因此看上求导操作对应了卷积。

而所有 nxn 离散循环卷积都共享相同的傅里叶基,那么连续情况下,求导应该只是一种连续循环卷积,它和其他循环卷积有相同的基,它的特征根是 \( 2\pi i f_k \) ,将 \( 2\pi i f_k = \omega_k \) 有无穷个。

那么对某个函数求导本身还可以进行某种频域的解释,即先把信号写成傅里叶级数,然后对各个复指数分量上乘以 \( i\omega_k \) 再重新逆级数转换回去。

而根据循环卷积组合之后还是循环卷积可以推测,求导后再求导也是一种循环卷积,也就是二阶导数和一阶导数本质一样,都是共享了复指数基的线性变换,而二阶导数的“频率分量”是 \( -\omega_k^2 \), 它和一阶导数都表明频率越高,该频率分量更加放大,实际是一种高通性质。

如何理解求导就是卷积?

从离散层面看,求导就是差分,根据对邻居求差值后除以一个时间常数,本身就和求邻居均值这种平滑的卷积操作是同一种对象。

二阶导数也只是求邻居差值的差值,结果是 x3-2x2+x1 然后除以 T^2, 这也是典型的卷积。

离散情况下所有循环卷积是各个不同右移操作上的缩放,而求导算是无穷小范围下右移缩放,而且它只在最近的无穷小右移下有一个脉冲加权,其他位置都是 0 。

2.4. 连续变换的效率

连续函数是一种符号表示,它所指代的对象可以说是虚构的,我们无法直接像向量那样直接实例化成物理对象(比如 numpy 数组,当然这也是某种物理抽象后软件结果,但最终它是能 grounding 的),连续函数的操作都是符号层面的,其算法是在操作指代的虚构对象的符号。

在符号变换层面,我们也会遇到复杂度的问题,比如有些表达式的展开化简会非常复杂,但傅里叶变换这种操作本身是很快的,或者说认知上并不复杂,然而求导的符号规则更加直观,比如求导规则是递归性质的,所以对函数求导(一种卷积)时,我们往往不会先对它进行符号上的傅里叶分解,然后在所有分量乘以 iw 再求逆级数,这在认知上反而是复杂的。(我们面对的是符号复杂度,或者人的认知复杂度)

3. 二维离散卷积

现在我们回到离散情况,但此时是二维信号,比如图片。信号是一个矩阵 x[m,n],其中 m=0,…,M-1,n=0,…,N-1。循环卷积意味着两个方向都周期延拓。二维循环卷积写成

\[ y[m,n]=\sum_{p=0}^{M-1}\sum_{q=0}^{N-1} h[p,q]x[m-p,n-q]. \]

直观上,单个二维基不是扔石头到水里扩散出的圆形水波。水波有中心,有扩散,平移后中心变了,图案就变了。

二维傅里叶基没有中心,它是无限大平面上的一组平行条纹。等相位线是直线,条纹方向由频率向量决定,条纹间距由这个向量的长度决定。频率向量水平时是竖条纹,竖直时是横条纹,斜的时候是斜条纹。竖纹和横纹只是两个特殊情况,一般情况是斜纹。单个基可以看成一维波沿垂直方向拉出来的平面波:沿条纹方向不变,沿垂直条纹方向振荡。

对两边做二维 DFT,卷积就变成逐点乘法:

\[ Y[k,l]=H[k,l]X[k,l]. \]

所以二维 FFT 的作用和一维一样:把循环卷积矩阵对角化,只是现在每个频率是一个二维索引 (k,l)。

离散二维基频是

\[ \varphi_{k,l}[m,n]=e^{2\pi i(km/M+ln/N)}. \]

它有 M×N 个独立基,对应频率向量

\[ \left(\frac{k}{M},\frac{l}{N}\right). \]

这里 k 模 M 等价,l 模 N 等价,所以超过一半的索引其实是负频率的别名,和一维完全一样。

二维 FFT 之所以快,是因为核可以分离:

\[ e^{2\pi i(km/M+ln/N)}=e^{2\pi i km/M}e^{2\pi i ln/N}. \]

因此可以先对每一行做一维 FFT,再对每一列做一维 FFT,或者先列后行,结果一样。矩阵形式是

\[ X_{\text{DFT}}=F_M X F_N^*, \]

逆变换是

\[ x=\frac{1}{MN}F_M^* X_{\text{DFT}} F_N. \]

归一化后,正反变换各带 \(1/\sqrt{MN}\)。二维卷积矩阵被 \(F_M\otimes F_N\) 对角化,特征值就是 H[k,l]。

一句话,二维离散基频是平面波,不是水纹波;它是无限大平面上不同方向、不同间距的平行条纹。所有方向和频率合起来,才构成完整的二维基。竖纹只是其中方向水平的一种,不代表二维退化成一维。

4. 图卷积

4.3. 图的拉普拉斯矩阵

所有卷积共享一个特征矩阵,那么对 L 做特征分解其实得到是所有对图进行卷积的特征向量

也就是我们从一个卷积得到了一种泛化的卷积共享的对象,最后我们又不是真正对图求二阶导数,而是求任意卷积,而通过这种分解展示出卷积是可以这样设计的

radioLinkPopups

如对本文有任何疑问,欢迎通过 github issue 邮件 metaescape at foxmail dot com 进行反馈