Skip to content

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 主线不变,真正变化的是:

  1. Level 8 的 _process(...) 之后进入的底层模型不再是 DLinear.forward(...)
  2. Informer.forward(...) 内部会显式走:
    • DataEmbedding
    • Encoder
    • Decoder
    • ProbAttention

3. 一张总图

这张图和 33 最大的差别只有一处:

  • DLinear 版:Level 8 进入 DLinear.forward(...)
  • Informer 版:Level 8 进入 Informer.forward(...)

4. 抽象索引树

这棵树的意义是:

外层坐标和 DLinear 完全一致,但模型内部索引从“分解 + Linear”切换成了“Embedding + Encoder + Decoder”。

5. 框架不变的部分

run_benchmarkTransformerAdapter._process(...),你已经学过的主线全部不变:

  1. run_benchmark.py
  2. pipeline(...)
  3. eval_model(...)
  4. schedule(strategy.execute, ...)
  5. ForecastingStrategy.execute(...)
  6. RollingForecast._execute(...)
  7. RollingForecast._eval_batch(...)
  8. fit_method(...)
  9. forecast_fit(...) / batch_forecast(...)
  10. 训练循环 / rolling 预测循环
  11. TransformerAdapter._process(...)

所以 Informer 学习的真正边界是:

你不需要重新学外层 benchmark;你只需要从 _process(...) 之后重新建立模型坐标。

6. Level 8 接口在 Informer 上是什么样

TransformerAdapter._process(...) 不会因为模型换成 Informer 而改变接口形式:

  • input
  • target
  • input_mark
  • target_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_enc
  • input_mark -> x_mark_enc
  • dec_input -> x_dec
  • target_mark -> x_mark_dec

7. Informer 内部主链

在当前 forecasting 场景下,Informer.forward(...) 会走:

这里的关键区别是:

  1. 输入先做 embedding
  2. encoder 处理历史窗口
  3. decoder 用 dec_inputenc_out 做生成
  4. 最后只取最后 pred_len 段作为预测结果

8. 当前例子的具体 shape

如果仍然沿用当前最小例子的调试参数:

  • seq_len = 96
  • label_len = 48
  • pred_len = 24
  • batch_size = 4
  • enc_in = dec_in = c_out = 7
  • freq = h
  • embed = 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 机制负责跨时间步建模

所以真正新增的学习对象是:

  1. DataEmbedding
  2. Encoder / EncoderLayer
  3. Decoder / DecoderLayer
  4. AttentionLayer
  5. ProbAttention

10. 和 DLinear 的对照表

维度DLinearInformer
外层 benchmark相同相同
adapter相同相同
_process(...) 接口相同相同
模型输入四元组相同相同
内部主计算分解 + LinearEmbedding + Encoder + Decoder
时间特征 x_mark_*基本不依赖显式参与 embedding
输出形状(B, pred_len, C)(B, pred_len, C)

这张表的作用是:

让你知道换模型时,哪些部分值得重新学,哪些部分根本不用重学。

11. 当前最值得继续细分的节点

如果下一步继续 BFS/DFS,最值得展开的是这三个节点:

  1. Informer.forward(...)
  2. DataEmbedding
  3. Encoder / Decoder

而且顺序应该是:

  1. 先看 Informer.forward(...) 总链
  2. 再看 DataEmbedding
  3. 再看 Encoder
  4. 最后再看 Decoder

12. 最后压成 6 句话

  1. Informer 在完整 benchmark 里的外层坐标,和 DLinear 完全一致。
  2. 变化发生在 TransformerAdapter._process(...) 之后。
  3. Informer 仍然接收同样的四输入接口:x_enc / x_mark_enc / x_dec / x_mark_dec
  4. Informer 的内部主链是:DataEmbedding -> Encoder -> Decoder -> 取最后 pred_len
  5. 对外层训练循环来说,Informer 和 DLinear 最终都返回 (B, pred_len, C)
  6. 所以 Informer 学习的核心,不是重学 benchmark,而是把模型内部坐标补到现有框架树上。

*记录并在线阅读我的笔记*