Appearance
Informer 在完整 benchmark 中的全链坐标总图
Abstract
这篇是 [[33-DLinear在完整benchmark中的全链坐标总图]] 的模型分支对照版。
它只回答一个问题:
把模型从
DLinear换成Informer后,完整 benchmark 主线哪些不变,哪些开始变化。
1. 这篇在整个文档树里的位置
这篇是收束文档,不是新的 BFS 层级。
它建立在这些文档之上:
- [[10-run_benchmark与pipeline-总图]]
- [[23-Level3-执行评测总顺序]]
- [[24-Level4-rolling任务主体]]
- [[25-Level5-_eval_batch四段总览]]
- [[26-Level6-5B-训练子块-fit_method与forecast_fit]]
- [[27-Level6-5C-预测子块]]
- [[29-Level7-forecast_fit训练循环]]
- [[30-Level8-_process到DLinear.forward]]
- [[31-Level7-batch_forecast主链]]
- [[32-Level8-_perform_rolling_predictions]]
- [[33-DLinear在完整benchmark中的全链坐标总图]]
2. 第一性
从第一性讲,这条链只是在回答:
一条命令怎样最终让 Informer 在
ETTh1.csv上完成训练、rolling 预测、打分和日志落盘。
和 DLinear 相比,外层 benchmark 主线不变,真正变化的是:
- Level 8 的
_process(...)之后进入的底层模型不再是DLinear.forward(...) Informer.forward(...)内部会显式走:DataEmbeddingEncoderDecoderProbAttention
3. 一张总图
这张图和 33 最大的差别只有一处:
- DLinear 版:Level 8 进入
DLinear.forward(...) - Informer 版:Level 8 进入
Informer.forward(...)
4. 抽象索引树
这棵树的意义是:
外层坐标和 DLinear 完全一致,但模型内部索引从“分解 + Linear”切换成了“Embedding + Encoder + Decoder”。
5. 框架不变的部分
从 run_benchmark 到 TransformerAdapter._process(...),你已经学过的主线全部不变:
run_benchmark.pypipeline(...)eval_model(...)schedule(strategy.execute, ...)ForecastingStrategy.execute(...)RollingForecast._execute(...)RollingForecast._eval_batch(...)fit_method(...)forecast_fit(...) / batch_forecast(...)- 训练循环 / rolling 预测循环
TransformerAdapter._process(...)
所以 Informer 学习的真正边界是:
你不需要重新学外层 benchmark;你只需要从
_process(...)之后重新建立模型坐标。
6. Level 8 接口在 Informer 上是什么样
TransformerAdapter._process(...) 不会因为模型换成 Informer 而改变接口形式:
inputtargetinput_marktarget_mark
它仍然会构造:
dec_input = target[:label_len] + zeros[horizon]
然后调用:
python
self.model(input, input_mark, dec_input, target_mark)当前模型是 Informer 时,这句就变成:
python
Informer.forward(
x_enc=input,
x_mark_enc=input_mark,
x_dec=dec_input,
x_mark_dec=target_mark,
)所以接口映射仍然是:
input -> x_encinput_mark -> x_mark_encdec_input -> x_dectarget_mark -> x_mark_dec
7. Informer 内部主链
在当前 forecasting 场景下,Informer.forward(...) 会走:
这里的关键区别是:
- 输入先做 embedding
- encoder 处理历史窗口
- decoder 用
dec_input和enc_out做生成 - 最后只取最后
pred_len段作为预测结果
8. 当前例子的具体 shape
如果仍然沿用当前最小例子的调试参数:
seq_len = 96label_len = 48pred_len = 24batch_size = 4enc_in = dec_in = c_out = 7freq = hembed = timeF
那么进入 Informer 前的输入 shape 仍然是:
x_enc.shape = (4, 96, 7)x_mark_enc.shape = (4, 96, 4)x_dec.shape = (4, 72, 7)x_mark_dec.shape = (4, 72, 4)
经过 DataEmbedding 后:
enc_out.shape = (4, 96, d_model)dec_out.shape = (4, 72, d_model)
经过 encoder / decoder 后:
decoder output.shape = (4, 72, 7)
最后 forward(...) 返回:
output.shape = (4, 24, 7)
所以从外层训练循环视角看:
Informer 和 DLinear 都会回到同样的监督接口:输出
(B, pred_len, C)。
9. Informer 相对 DLinear 真正新增的语义
9.1 DLinear
模型语义更接近:
- 输入历史数值
- 做序列分解
- 用线性层把
seq_len映射到pred_len
9.2 Informer
模型语义更接近:
- 历史数值 + 时间特征先做 embedding
- encoder 抽历史表示
- decoder 用历史尾部 + 零占位生成未来
- attention 机制负责跨时间步建模
所以真正新增的学习对象是:
DataEmbeddingEncoder / EncoderLayerDecoder / DecoderLayerAttentionLayerProbAttention
10. 和 DLinear 的对照表
| 维度 | DLinear | Informer |
|---|---|---|
| 外层 benchmark | 相同 | 相同 |
| adapter | 相同 | 相同 |
_process(...) 接口 | 相同 | 相同 |
| 模型输入四元组 | 相同 | 相同 |
| 内部主计算 | 分解 + Linear | Embedding + Encoder + Decoder |
时间特征 x_mark_* | 基本不依赖 | 显式参与 embedding |
| 输出形状 | (B, pred_len, C) | (B, pred_len, C) |
这张表的作用是:
让你知道换模型时,哪些部分值得重新学,哪些部分根本不用重学。
11. 当前最值得继续细分的节点
如果下一步继续 BFS/DFS,最值得展开的是这三个节点:
Informer.forward(...)DataEmbeddingEncoder / Decoder
而且顺序应该是:
- 先看
Informer.forward(...)总链 - 再看
DataEmbedding - 再看
Encoder - 最后再看
Decoder
12. 最后压成 6 句话
- Informer 在完整 benchmark 里的外层坐标,和 DLinear 完全一致。
- 变化发生在
TransformerAdapter._process(...)之后。 - Informer 仍然接收同样的四输入接口:
x_enc / x_mark_enc / x_dec / x_mark_dec。 - Informer 的内部主链是:
DataEmbedding -> Encoder -> Decoder -> 取最后 pred_len。 - 对外层训练循环来说,Informer 和 DLinear 最终都返回
(B, pred_len, C)。 - 所以 Informer 学习的核心,不是重学 benchmark,而是把模型内部坐标补到现有框架树上。