08-Autoformer:Informer 之后的一个大升级方向
1、Autoformer的研究背景和动机
输入过去一段(比如 96 点),预测未来很长一段(比如 336、720 点,几天甚至几周)
现实中的典型场景
- 长期预测必须抓大方向(趋势)
- 又必须抓住周期规律(例如日电负荷、交通早晚高峰)
- 长期未来的细节噪声很大,“逐点依赖”非常不可靠
痛点 A:Self-Attention 是“逐点对齐”,但长预测未来太复杂了
预测未来某一时刻 t,要去历史每个时刻 i 里找相关性(点对点)
形象比喻
- 未来 30 天每天的用电量
你试图用“未来第 17 天上午 11:00 的电量”去匹配“过去 3 个月每一个小时的电量”,找最像的点。
- 未来越远,噪声越大
- “点级别的相似”并不稳定
- dependency 难以可靠学习
痛点 B:Informer 用稀疏注意力提速,但带来“信息利用瓶颈”
- self-attention O(L²) 太慢
- 用 ProbSparse Attention 降复杂度
稀疏注意力虽然快,但本质仍是 point-wise attention,只是“抽点抽得更聪明”。
形象比喻
考试复习你没时间看全书,于是你挑重点章节复习(稀疏取样)
- 这会导致信息利用不足
- 尤其当你预测很长时,“靠少数点”更不稳定
痛点 C:时序预测的结构性知识(趋势/季节)没有被网络“当作第一公民”
时间序列 = 趋势 Trend + 季节 Seasonality + 残差 Noise
- 先对原序列做 decomposition(如 STL)
- 再对分解后的成分做预测
Autoformer 的核心直觉
- 趋势怎么延伸
- 周期怎么重复
- 残差怎么处理
Autoformer 的两个核心创新(动机到设计)
创新 1:Progressive Decomposition(逐层分解)
不再把序列分解当作数据预处理,而是在 encoder/decoder 的每层都做分解,让网络逐步把“趋势”和“季节性”拆出来。
形象化理解
- 每一层都做一次:
- 用 moving average 抽出趋势 trend
- 剩余的当作 seasonal
- 越往深层:季节性越来越干净
- 趋势越来越平滑、可预测
创新 2:Auto-Correlation 机制(替代 Self-Attention)
self-attention:点对点匹配
- 对每个 query 点,都计算与每个 key 点的相似度
auto-correlation:子序列级别匹配(series-wise)
周期性:某些 pattern 会延迟 d 后再次出现
- 找到序列中最强的若干周期/延迟(top-k delays)
- 把相同周期对齐的子序列聚合起来(sub-series aggregation)
形象比喻
我在所有历史点里找相似点。
我先判断“这件事每隔 24 小时会重复”,然后把过去每天 11:00 的点聚合起来预测未来 11:00。
假设你要预测一家店未来 30 天的销量:
- Informer像: 你在历史记录里找“与未来某天最像的若干天”,再参考它们(但毕竟还是按“某一天 vs 某一天”匹配)
- Autoformer像: 你先拆开销量:
- 长期趋势:是否逐月增长?
- 周期规律:周末高、工作日低? 然后分别预测趋势 + 周期,再合成
后者在长期预测上更符合时序规律,也更抗噪声。
2、模型网络结构图
先看右上角:Autoformer 眼中的时间序列是什么?
- Time Series(原始序列):黑色曲线
- Seasonal Part(季节性):橙色曲线(围绕 0 波动)
- Trend-cyclical Part(趋势/周期趋势):蓝色曲线(围绕均值缓慢变化)
原始序列 = 趋势(Trend) + 季节性(Seasonality)
- 季节性:每天/每周重复的波动(高频、上下抖动)
- 趋势:长期上升/下降的形态(低频、平滑)
预测未来 = 预测未来趋势 + 预测未来季节性(最后再相加)
Autoformer Encoder(上半部分)到底在做什么?
✅ Encoder Input:历史序列 + To Predict
Encoder 不仅看过去,还会看到一段“未来占位符”(一般用 0 或均值填充) 让模型提前“知道”输出长度/位置(类似 Informer 的做法)
Encoder 每一层长什么样?
(1) Auto-Correlation(绿色块) + 残差连接
- 日周期
- 周周期
- 季节性重复模式
(2) Series Decomp(蓝色块)
输入一条序列 x 用 moving average(滑动平均)提取趋势 trend 剩下 residual = x - trend 就是 seasonal
- trend = MovingAvg(x)
- seasonal = x - trend
这块为什么重要?
- 趋势:平滑、低频,适合做长期预测
- 季节性:高频波动,适合用自相关去抓周期
(3) Feed Forward(粉色块) + 残差
(4) 再来一次 Series Decomp(蓝色块)
第一遍 decomposition:把 Auto-Correlation 输出的序列先清理一遍 第二遍 decomposition:把 FFN 的输出再清理一遍
越到后面,季节性更“纯”,趋势更“平”
Encoder 输出到底是什么?
encoder eliminates the long-term trend-cyclical part ... and focuses on seasonal patterns modeling
✅ Encoder 的目标不是把所有信息都编码进去
Encoder 通过 decomposition 不断把趋势从隐变量里剥离掉 最后留下的 encoder hidden states 更偏向“季节性信息”
Encoder = 季节性专家(Seasonal Expert)
Decoder(下半部分)到底在干什么?
3.1 Seasonal Init(季节性初始化)
Decoder 对未来的 seasonal 部分,一开始先假设是 0(空白),让模型去生成
3.2 Trend-cyclical Init(趋势初始化)
Decoder 的趋势部分一开始不是 0,而是用历史序列的均值/趋势当作基底
- 趋势预测如果从 0 开始会很难学
- 从均值/趋势开始,相当于预测“增量”,更稳定
Decoder 每层结构:为什么有两个 Auto-Correlation?
- Auto-Correlation(绿色)—— self
- Series Decomp(蓝色)
- Auto-Correlation(绿色)—— cross(中间那块)
- Series Decomp(蓝色)
- Feed Forward(粉色)
- Series Decomp(蓝色)
4.1 第一个 Auto-Correlation:Decoder Self Auto-Corr
在 Decoder 内部,把“已经生成/已知的季节性片段”做周期建模 预测未来 seasonal 怎么延续
4.2 中间这个 Auto-Correlation:Encoder-Decoder Auto-Corr(Cross)
past seasonal information from encoder is utilized by encoder-decoder Auto-Correlation
✅ Decoder cross 连接用的是 encoder 的 seasonal 信息
Decoder 生成未来季节性时,会去参考 Encoder 学到的历史季节性规律
“把历史周期模板拿过来,对齐未来的位置再生成”
Decoder 最核心:趋势是怎么“累加”出来的?
decoder accumulates the trend part ... progressively
Encoder 是“剥离趋势”
Decoder 是“收集趋势”
trend_total = trend_init + trend_layer1 + trend_layer2 + ... + trend_layerM
Decoder 在做长期预测时,趋势这种低频信息最难一次性到位 所以让模型像“画草图”一样层层补全趋势
最后 Prediction 是怎么来的?
- 一条来自 seasonal 输出
- 一条来自 trend 累加总输出
Prediction = Seasonal_Output + Trend_Output