某位资深调音师接了一场大型演唱会。面对一整晚的现场录音,他不需要逐毫秒去听每一个采样点——他先打开频谱分析仪,一眼就看出能量几乎都集中在低音区,高音区只剩微弱的镲片声和环境噪声。于是他把主要工夫花在几个关键频段上,其余轻轻带过。最终混音不仅没变差,反而更干净有力。 这个故事正是 FEDformer 的设计哲学。传统 Transformer 在时域里让每个时间点与其他所有时间点两两比较,序列一长,计算量就像平方爆炸;FEDformer 却先把时间序列“送进频谱仪”(傅里叶变换),只保留最重要的少数频率成分,再在这些精华模式上完成注意力与预测。靠着频域天然的稀疏性,它把计算复杂度从平方级拉到近似线性,长序列预测因此又快又准。 这篇文章将从“为什么要去频域”一步步讲到“傅里叶块怎么搭”。你会发现,调音台上的每一根推子,在 FEDformer 里都有一一对应的数学开关。
学完频域注意力设计,你在长序列时序预测项目中就多了一件“低频高效”的利器,面试时能讲清复杂度与精度的双赢逻辑,实战中也能为海量传感器数据选对模型架构。
可视化演示
展示傅里叶变换时频域转换、频域稀疏化低频截断与FEDformer线性复杂度优势,交互理解频域注意力设计原理。
本节配有交互动效(进入视口后自动加载,约 3KB)。
'+modeData.fft.caption+'
时域频域转换
演出后台有一块巨大的示波器屏幕,它逐毫秒地描出声音波形,每一处微小的抖动都看得一清二楚;旁边还有一块频谱仪,用一根根柱条展示当前各个音高的能量分布。调音师扫一眼频谱仪,就能说出“现在低音太闷、中频有点空”,而对着波形图可能盯半天也没头绪。这就是“换个视角看问题”的力量。
Transformer 的注意力机制就像盯住波形图工作:把序列里的每个时间点当作一个“音符”,让每个音符和序列里所有其他音符比较相似度。N 个时间点要做 N×N 次比较——这在短文本上还凑合,可时序预测动辄几千上万个时间步,N² 次的配对立刻让计算量爆炸。FEDformer 团队提出一个反直觉的问题:能不能像调音师一样,先看看频谱,只挑重要的频段来比较?
答案藏在傅里叶变换这座桥梁里——它把长度为 N 的时域序列分解成 N 个频率分量,其中 X₀ 是平均值(直流分量),X₁、X₂……对应越来越高的频率。公式如下:
1. 输入时域序列:x_n 表示序列在第 n 个时刻的采样值,n 从 0 取到 N-1,共 N 个时刻
2. 旋转因子:e^{-i 2π k n / N} 是单位圆上旋转的复数,相当于频率 k 的“节拍器”
3. 累加求和:把每个时刻的采样值乘以对应相位后全部相加,完成“匹配检测”
4. 频域分量:X_k 是复数,模长表示该频率的能量大小,辐角表示相位偏移
就像频谱仪把现场声音拆成一根根能量柱,傅里叶变换把时序拆成一个个“频率通道”。调音师从此可以不用盯着波形逐帧看,而是直接在这些通道上做文章——这正是 FEDformer 一切设计的起点。
傅里叶变换基础
调音台上有许多推子,每个推子控制一个频段:最左边是 20Hz 的超低音,中间是人声频段,最右边是 16kHz 以上的空气感。把推子一个个拉下来,再一个个推回去,就能精确塑造声音。傅里叶变换就是这套推子系统的底座。
DFT 把 N 个时域采样变成 N 个频域系数,就像把波形“分发”到 N 个推子上;而逆变换(IDFT)则是把这些推子的信号重新混音回波形。两者互逆,信息没有任何丢失——只要保留全部频率分量,就能无误差还原原始序列。
逆傅里叶变换的公式如下,注意指数符号由负变正,前面多了 1/N 的归一化因子:
工程上直接算 DFT 是 O(N²),但快速傅里叶变换(FFT)利用旋转因子的对称性把复杂度降到 O(N log N),这也是 FEDformer 敢把序列“送进频域逛一圈”的底气。
1. 频域加权求和:每个频率分量 X_k 乘以“反向旋转因子”后相加
2. 归一化因子:1/N 保证 IDFT 与 DFT 互为逆运算,信息无损
3. 还原采样值:等式左边 x_n 是第 n 个时刻的原始数值,属于实数
4. FFT 加速:利用旋转因子的周期对称性,把 O(N²) 降至 O(N log N)
推子全部推满,波形原封不动;把一些推子压下去,声音就开始“变形”。FEDformer 想做的,恰恰是主动压掉那些不重要推子的音量——因为它知道哪些推子几乎没人听得到。
频域稀疏性
一首摇滚乐,贝斯和底鼓扛着整个低音区,人声和吉他集中在中频,而最高频的镲片声虽然刺耳但能量微弱。调音师可以大胆地把 12kHz 以上的推子全部压掉,观众几乎察觉不到区别。
真实世界的时间序列——无论是电网负荷、天气温度还是高速公路车流量——都呈现高度的“频域稀疏性”:绝大多数能量集中在少数低频分量上,高频段主要是噪声和微小波动。这意味着频谱上的大量柱条几乎为零,把它们全部保留纯属浪费。
用数学语言说,保留前 M 个低频分量,就能抓住几乎全部能量:
这里 ε 是一个非常小的量。FEDformer 的“模式”(mode)概念由此而生:在频域里选出的 M 个重要分量,就是这条序列的 M 个“主模式”,它们足以代表整条序列的核心形态。
1. 分子——保留模式能量:前 M 个频率分量模长的平方和
2. 分母——全部频域能量:所有 N 个分量的平方和(帕塞瓦尔定理下等于时域能量)
3. 能量覆盖率:比值接近 1,说明低频几乎携带全部信息,ε 是损失掉的极小部分
4. 稀疏条件:M 远小于 N,后续所有计算都发生在 M 这个“瘦身”后的维度上
调音师把十几个推子里真正用得上的三四个推子照顾好,整首歌的骨架就立住了。FEDformer 同样只关心少数主模式,把计算资源留给真正重要的频段。
频域注意力
指挥家不会在每拍都盯着每个乐手的每个动作,而是把注意力放在几个关键声部上——低音提琴的律动、铜管的高潮、打击乐的节奏。只要这几条主线配合默契,整支乐队的表现八九不离十。
标准 Transformer 的注意力矩阵是 N×N 的稠密矩阵,每个位置都参与打分。FEDformer 的思路是:把 Q、K、V 变换到频域后,注意力矩阵在频域天然稀疏,只需在确定的 M 个模式上计算打分,其余位置直接忽略。
频域增强注意力(FEA)的数学表达如下:
其中 S 是只保留 M 个模式的稀疏掩码。值得强调的是,FEDformer 采用“随机模式选择”:每个注意力头、每一层都随机挑选一组模式,不同的头覆盖不同的频率子集,这样既保证全局信息互补,又让每个头的计算量都压在 M 上。随机性还带来额外好处——隐式正则化,缓解过拟合。
1. 频域投影:Q、K、V 分别做傅里叶变换,得到频域表示
2. 模式掩码:S 与打分矩阵做逐元素乘法,只在 M 个选定频率上保留数值
3. 缩放点积打分:除以 \sqrt{d_k} 防止内积过大导致梯度消失
4. Softmax 归一化:把打分变成和为 1 的注意力权重
5. 聚合与还原:权重作用于 V 的频域表示,再逆变换回时域
指挥家只听三条主线,就能调度整个乐队;FEDformer 每个头只听几个频率通道,多个头合在一起却听全了整个频谱。用很少的“耳朵”达成全局的“听见”。
复杂度优化
逐字读完整本 500 页的书来写摘要,要花 25 万个字的阅读量;但先看目录、只精读几个重点章节,工作量骤减,摘要质量却差别不大。复杂度优化的本质就是“少读几章,读对章节”。
标准自注意力的复杂度是 O(N²):序列长度 N 翻一倍,计算量翻四倍。对 10,000 步的长序列来说,1 亿次配对几乎让训练无法进行。FEDformer 把注意力从 N×N 的稠密空间压缩到 M 个模式上的稀疏空间,复杂度随之改变。
复杂度的变化可以写成:
由于 M 是固定超参数(FEDformer 默认取 64 左右),不随输入长度增长,所以总体复杂度近似线性。N=10,000 时,标准注意力是 10⁸ 量级运算,FEDformer 只有 10⁵ 量级——三个数量级的差距,正是长序列预测能否落地的分水岭。同时,截断掉的往往是噪声成分,模型在效率提升的同时往往还能轻微提升精度,实现“效率-精度”双赢。
1. 标准复杂度:每个位置都要与其他 N-1 个位置计算注意力
2. 截断后复杂度:M 个模式各与 N 个位置交互
3. 常数模式数:M 固定不随 N 增长,复杂度近似线性
4. 稀疏条件:M 远小于 N,保证线性近似成立
读书有“关键章节”,调音有关键频段,注意力有关键模式——聪明的工程师永远先找到那 20% 的输入,收获 80% 的效果。FEDformer 把这句经验法则变成了数学公式。
傅里叶块设计
调音师的工作台上有两条信号链路:一条直接输出“整体氛围”(趋势),另一条经过效果器处理“细节纹理”(季节波动)。两条链路最终在混音总线上汇合。FEDformer 的模块结构就是这条双链路调音台。
FEDformer 全称 Frequency Enhanced Decomposed Transformer,核心是“分解 + 频域增强”。每个编码器层先用移动平均把输入拆成趋势项和季节项:趋势项是缓慢变化的基调,季节项是围绕基调的周期性波动。季节项再送入频域增强块(FEB)处理。
FEB 的操作可以概括为三步:先傅里叶变换到频域,用可学习的复数权重 W_f 对每个频率分量做“音量调节”,再逆变换回时域:
配合模式选择,FEB 只对选中的 M 个模式做加权,其余频率直接置零,把计算量限制在 O(N)。整个架构由“模式发现”(在频域中选择重要模式)和“模式恢复”(逆变换还原到原始时空形状)两步组成,像极了录音中的“频谱编辑—导出”流水线。
1. 频域变换:季节项 x 先经 FFT 得到频谱
2. 可学习加权:逐元素乘以 W_f,等价于为每个频率分配一个音量推子
3. 稀疏置零:未选中的模式被掩码清零,只保留 M 个主模式参与计算
4. 逆变换还原:IFFT 把处理后的频谱合成为时域输出
调音师在频谱编辑器里框选要处理的频段、拖动增益曲线、再导出成品——FEB 的“模式发现→加权→模式恢复”就是这条流水线的自动化版本,只不过推子变成了神经网络学出来的 W_f。
预测实践应用
调音师再懂原理,演出前也要逐一确认推子位置、压限阈值和返听音量。机器学习模型同样如此——架构对了,超参数和工程细节决定现场效果。
FEDformer 在长序列预测上的实践可以拆成三个层面:超参数选择、训练策略和工程加速。其中最重要的超参数就是保留的模式数 M——它直接决定复杂度与精度的权衡点。
FEDformer 的默认配置通常取 M=64,配合 2-3 层编码器解码器。训练时随机模式选择扮演“数据增强”角色,让模型见过多种频率组合;损失函数采用归一化的 L1 误差,对序列的绝对尺度不敏感,方便跨数据集比较:
工程上,FFT 在 GPU 上有高度优化的 torch.fft.rfft 实现,实际运行几乎不成为瓶颈。在 ETTh(电力变压器温度)、Electricity(用电量)、Traffic(交通流量)等长序列基准上,FEDformer 以线性复杂度达到了超越 Informer 等前期模型的预测精度,成为长序列预测的重要基线。
1. 分子——绝对误差和:预测与真实值逐点差的绝对值求和
2. 分母——真实值尺度:真实序列的绝对值之和,作为归一化因子
3. 相对误差:消除量纲影响,不同数据集之间可以直接比较
一切调校最终是为了演出效果——FEDformer 的一切设计最终落在长序列预测的精度与速度上。掌握了这些“调音参数”,你就能在真实项目中把谱子演奏出来。
AI 应用场景
智能电网电力负荷预测
阶段:长序列时序预测 / 模型选型
解决的问题:电网每 15 分钟采样一次,一天就是 96 个点,一周 672 个点。传统 LSTM / Transformer 的时域注意力是 O(N²),序列一旦拉长到数月级别就难以训练。FEDformer 用频域截断把复杂度降到线性,同时保留负荷的日周期与周周期低频成分,快速给出高精度预测。
具体案例:某省电力调度中心需要预测未来 7 天每 15 分钟的用电负荷。工程师将历史 4 周数据(2688 个时间步)作为输入,FEDformer 在单张 GPU 上几十分钟完成训练,预测误差相比 Informer 下降约 15%,推理时延小于 10ms,满足调度系统的实时刷新要求。
金融波动率预测
阶段:特征工程与模型推理
解决的问题:金融 tick 级数据噪声极大,时域注意力容易被瞬时尖刺带偏;频域注意力天然滤除高频噪声,聚焦市场波动的低频趋势,正好发挥“调音师压掉镲片声”的降噪能力。
具体案例:量化团队用 30 天分钟级价格数据预测下一天波动率,FEDformer 在频域保留的 M 个模式恰好对应“宏观趋势 + 日内周期”,比传统 GARCH 类模型更快捕捉市场状态切换。
工业传感器健康监测
阶段:时间序列异常检测与预测
解决的问题:工厂数千台设备每秒上报振动与温度信号,长序列预测需要同时应对海量吞吐和预测精度。FEDformer 的线性复杂度支持流式滚动预测,频域截断顺带完成信号降噪,一石二鸟。
具体案例:轴承振动监测中,高频段的磨损特征与低频段的正常运行基线被 FEDformer 分别处理,提前 48 小时预警设备故障,误报率较传统方法显著下降。
Python 演示
import numpy as npimport time def fft_truncate(x, M): N = len(x) X = np.fft.fft(x) X[M:N - M + 1] = 0 return np.fft.ifft(X).real def freq_attention(Q, K, V, M): N, d = Q.shape Qf = np.fft.fft(Q, axis=0) Kf = np.fft.fft(K, axis=0) Vf = np.fft.fft(V, axis=0) Qm, Km, Vm = Qf[:M], Kf[:M], Vf[:M] scores = (Qm @ Km.conj().T).real / np.sqrt(d) scores = scores - scores.max(axis=-1, keepdims=True) attn = np.exp(scores) attn = attn / attn.sum(axis=-1, keepdims=True) Yf = np.zeros_like(Qf) Yf[:M] = attn @ Vm return np.fft.ifft(Yf, axis=0).real def std_attention(Q, K, V): d = Q.shape[1] scores = Q @ K.T / np.sqrt(d) scores = scores - scores.max(axis=-1, keepdims=True) attn = np.exp(scores) attn = attn / attn.sum(axis=-1, keepdims=True) return attn @ V if __name__ == "__main__": N, d = 2048, 16 t = np.arange(N) base = np.sin(2 * np.pi * 5 * t / N) + 0.6 * np.sin(2 * np.pi * 17 * t / N) X = np.stack([base] * d, axis=1) + 0.05 * np.random.randn(N, d) rec = fft_truncate(base, 32) ratio = np.linalg.norm(rec) / np.linalg.norm(base) print("保留32个低频模式,能量保持率: %.3f" % ratio) start = time.time() std_attention(X, X, X) t_std = time.time() - start start = time.time() freq_attention(X, X, X, 32) t_fed = time.time() - start print("标准注意力 %.4fs,频域注意力 %.4fs,加速 %.1f 倍" % (t_std, t_fed, t_std / t_fed))
X[M:N - M + 1] = 0一次性把高频段全部清零,这就是“截断”Qf = np.fft.fft(Q, axis=0)沿时间维度做 FFT,把序列搬进频域Qm, Km, Vm = Qf[:M], Kf[:M], Vf[:M]模式选择,只取前 M 个频域分量scores = (Qm @ Km.conj().T).real / np.sqrt(d)在低维频域做缩放点积打分,取实部scores = scores - scores.max(axis=-1, keepdims=True)softmax 前的数值稳定技巧attn = attn / attn.sum(axis=-1, keepdims=True)注意力权重归一化,使和为 1Yf[:M] = attn @ Vm只在 M 个保留模式上聚合信息return np.fft.ifft(Yf, axis=0).real逆变换回时域,取实部还原真实序列std_attention(X, X, X)标准注意力作为对照组,用于计时对比
常见误区
误区我以为输入数据一进模型就被变成频谱,最后输出也是一堆频率,整个模型是“活在频域的生物”。
正解FEDformer 只有注意力模块(FEA)和增强块(FEB)在频域里“打了个来回”:输入和输出仍然是时域序列。傅里叶变换 + 逆变换像调音师插拔一根频谱分析线——分析完拔掉,观众听到的声音还是从时域音箱里出来的。
为何常见:论文标题和核心示意图都强调频域,容易让人误以为整个网络都在频域运行,忽略了逆变换这一步“回到时域”的动作。
误区把高频分量全扔掉,信息不就丢了吗?精度肯定会下降吧?
正解真实时序的高频段主要是噪声与微波动,截断它们等于免费做了一次降噪滤波;同时多头随机模式选择保证不同频率子集都能被覆盖,信息互补。实践中 FEDformer 在多个长序列基准上不仅没降精度,反而常常超过全频段保留的模型。
为何常见:人类直觉认为“信息越多越好”,忽略了噪声挤占模型容量的事实——就像把所有推子推满反而让声音发闷、失去层次。
误区复杂度是线性的?那一定是傅里叶变换的功劳,FFT 肯定特别快。
正解FFT 的复杂度是 O(N log N),并不是线性。FEDformer 的线性复杂度来自“只保留 M 个模式”的稀疏化:注意力在 M×M 的低维空间计算,M 固定不随 N 增长,总复杂度才近似 O(N)。效率来自“少算”,不只是“算得快”。
为何常见:把“频域”和“快速”划等号,忽略了模式截断这个真正的主角;FFT 只是帮我们拿到了频谱,真正省时间的是后面的稀疏化。
误区低频主导嘛,那我把频率最低的几个分量固定留下,其他全扔,最省事。
正解FEDformer 用的是“随机模式选择”而非固定低通。固定低通会错过某些重要周期成分(例如周期接近序列长度的中频成分),且逐层固定容易过拟合;随机选取让不同层、不同头覆盖不同频率,既保证任何模式都有机会被处理,又天然充当正则化。
为何常见:对“低频主导”的理解过于绝对化,忽略了 FEDformer 在模式选择上的随机性设计——随机才是它兼顾效率与泛化的关键。
面试题
Q1. FEDformer 降低注意力复杂度的核心手段是什么?
- A.增大训练批量来摊薄计算
- B.频域截断只保留 M 个模式← 正确答案
- C.用卷积神经网络取代注意力
- D.对输入序列做随机下采样
答案:B。时域注意力要两两配对所以是 O(N²);FEDformer 像调音师只用关键频段,频域截断保留 M 个模式后复杂度降到 O(N)。增大批量只是摊薄而非降低复杂度,CNN 替换和时序下采样都不是 FEDformer 的做法。
Q2. 离散傅里叶变换(DFT)把什么转换为什么?
- A.频域信号转换成时域信号
- B.时域 N 个点转换为 N 个频域分量← 正确答案
- C.模拟信号放大为数字信号
- D.高维数据压缩为低维向量
答案:B。DFT 把时域 N 个采样点变成 N 个频域分量,是“时域→频域”的桥梁;逆变换才是频域→时域。DFT 复杂度是 O(N²),FFT 才是 O(NlogN),且它能处理复数信号,不只是模拟放大。
Q3. 真实世界时间序列在频域上的典型特征是什么?
- A.高频成分占据主导地位
- B.能量在所有频段均匀分布
- C.低频主导且频谱稀疏← 正确答案
- D.频谱完全平坦没有规律
答案:C。真实时序(电量、天气、流量)能量集中于低频,频谱稀疏,就像一首歌的主旋律集中在少数频段。高频主导、均匀分布、完全平坦都是违背实测规律的描述。
Q4. FEDformer 中“模式”(mode)指的是什么?
- A.输入序列中的某个时间步
- B.频域中被选中的频率成分← 正确答案
- C.隐藏层中的某一维神经元
- D.训练数据集里的一个样本
答案:B。频域中“模式”就是被选中的频率成分,FEDformer 在频域里挑选 M 个模式参与计算。时间步是时域概念,神经元是隐藏层概念,样本是数据概念,都不是 mode。
Q5. FEDformer 的模式选择策略是?
- A.固定保留最低频的若干模式
- B.每个头每层随机选取 M 个模式← 正确答案
- C.保留幅值最大的 M 个模式
- D.保留全部模式不进行选择
答案:B。FEDformer 的每个注意力头和每一层都随机选取 M 个模式(数量固定、位置随机)。固定最低频会漏掉重要周期成分,固定最大幅值缺乏随机正则化效果,全保留则复杂度必然上升。
Q6. 关于逆傅里叶变换(IDFT)的说法正确的是?
- A.把频谱还原为时域信号← 正确答案
- B.与 DFT 在指数符号上互逆← 正确答案
- C.必然会丢失部分原始信息
- D.是 FEDformer 模式恢复的关键步骤← 正确答案
答案:ABD。IDFT 用归一化因子与正指数旋转因子把频谱合回时域,是 FEDformer 模式恢复的关键步骤;DFT 与 IDFT 互逆、信息无损。逆变换本身不会丢信息,丢信息的是频域截断那一步。
Q7. 标准自注意力的计算复杂度是?
- A.与N线性相关 O(N)
- B.与N对数相关 O(logN)
- C.与N平方相关 O(N²)← 正确答案
- D.与N线性对数 O(NlogN)
答案:C。标准自注意力让每个位置与所有其他位置计算相似度,N 个位置共约 N² 对。这就是长序列训练昂贵的根本原因,FEDformer 通过频域截断把这个平方项消掉了。
Q8. FEDformer 频域截断带来的好处包括哪些?
- A.复杂度从平方级降至近似线性← 正确答案
- B.天然过滤掉高频段噪声← 正确答案
- C.所有任务精度必然提升
- D.模式随机选择起到正则化作用← 正确答案
答案:ABD。截断丢掉的多是噪声段,相当于免费降噪;M 固定使复杂度近似 O(N);随机选模式有正则化效果。但“所有任务精度必然提升”过于绝对——不同数据集的收益并不相同。
Q9. FEB(频域增强块)中可学习权重 W_f 的作用是?
- A.对每个频率分量做幅度调节← 正确答案
- B.计算注意力得分矩阵
- C.对输入做非线性激活
- D.生成最终的预测标签
答案:A。W_f 是频域的可学习复数权重,等价于给每个频率分量一个音量推子;注意力打分由 FEA 的 Softmax 完成,非线性激活和标签生成都不是 W_f 的职责。
Q10. 以下哪些说法正确描述了 FEDformer?
- A.核心思想源自时域注意力过密← 正确答案
- B.由季节趋势分解与频域块组成← 正确答案
- C.保留全部频率分量以确保无损
- D.线性复杂度下实现高精度预测← 正确答案
答案:ABD。FEDformer 的设计起点正是时域注意力矩阵太稠密;它由季节趋势分解 + 频域增强块组成,以线性复杂度在长序列预测中取得高精度。它保留的是 M 个模式,而非全部频率分量。