快速傅里叶变换(FFT)
快速傅里叶变换(Fast Fourier Transform,FFT)是一种用于计算离散傅里叶变换(Discrete Fourier Transform,DFT)的高效算法。傅里叶变换将时间域或空间域的信号转换到频域,从而可以更方便地分析信号的频率成分。
傅里叶变换的基础
傅里叶变换的基本思想是将一个复杂的时间序列分解为不同频率的正弦波和余弦波的组合。对于一个长度为 N N N的离散时间序列 x [ n ] x[n] x[n],其离散傅里叶变换定义为:
X [ k ] = ∑ n = 0 N − 1 x [ n ] e − j 2 π N k n X[k] = \sum_{n=0}^{N-1} x[n] e^{-j \frac{2\pi}{N} kn} X[k]=n=0∑N−1x[n]e−jN2πkn
其中:
-
X
[
k
]
X[k]
X[k]是频域信号的第
k
k
k个频率分量。
-
x
[
n
]
x[n]
x[n]是时间域信号的第
n
n
n个时间点。
-
e
−
j
2
π
N
k
n
e^{-j \frac{2\pi}{N} kn}
e−jN2πkn是复指数函数,表示不同频率的正弦波和余弦波。
快速傅里叶变换(FFT)
直接计算 DFT 的时间复杂度为 O ( N 2 ) O(N^2) O(N2),因为每个频率分量 X [ k ] X[k] X[k]需要对 N N N个时间点进行累加运算。快速傅里叶变换(FFT)通过分而治之的策略,将计算复杂度降低到 O ( N log N ) O(N \log N) O(NlogN)。
FFT 的主要步骤如下:
-
分解:
- 将长度为 N N N的信号序列分成两个长度为 N / 2 N/2 N/2的子序列,分别是奇数索引和偶数索引的部分。
-
递归计算:
- 对两个长度为 N / 2 N/2 N/2的子序列分别计算其 DFT。
-
合并:
- 将子序列的结果合并,得到原始序列的 DFT。
这种分而治之的方法使得 FFT 能够高效地计算傅里叶变换,特别适用于大规模数据的频域分析。
在 Autoformer 中的应用
在 Autoformer 模型中,FFT 被用于查询(Q)和键(K)向量的频域变换。其主要目的是利用卷积在频域中的特性,简化相关性的计算过程。
具体步骤如下:
-
线性变换:
- 将输入的时间序列数据通过线性变换,得到查询(Q)、键(K)和值(V)向量。
-
应用 FFT:
- 对查询和键向量应用快速傅里叶变换(FFT),将它们从时间域转换到频域。
- 例如,对于查询向量
Q
Q
Q,我们计算其 FFT:
FFT ( Q ) \text{FFT}(Q) FFT(Q)
-
共轭乘法:
- 将查询向量的 FFT 结果与键向量的 FFT 结果的共轭进行乘法运算:
FFT ( Q ) × FFT ( K ) ‾ \text{FFT}(Q) \times \overline{\text{FFT}(K)} FFT(Q)×FFT(K) - 这一操作在频域中完成,等价于时域中的卷积运算。
- 将查询向量的 FFT 结果与键向量的 FFT 结果的共轭进行乘法运算:
-
逆 FFT:
- 对乘法结果应用逆快速傅里叶变换(IFFT),将结果转换回时间域,得到自相关函数
R
(
τ
)
R(\tau)
R(τ):
R ( τ ) = IFFT ( FFT ( Q ) × FFT ( K ) ‾ ) R(\tau) = \text{IFFT}(\text{FFT}(Q) \times \overline{\text{FFT}(K)}) R(τ)=IFFT(FFT(Q)×FFT(K))
- 对乘法结果应用逆快速傅里叶变换(IFFT),将结果转换回时间域,得到自相关函数
R
(
τ
)
R(\tau)
R(τ):
通过上述过程,Autoformer 利用 FFT 高效地计算时间序列数据的自相关函数,从而捕捉时间延迟相似性,提升模型对周期性依赖关系的捕捉能力。这种方法不仅提高了计算效率,还增强了模型对复杂时间序列模式的识别能力。