Skip to content

自检复习卡片与下一步

Abstract

这篇是复习版,不是分析版。

用法只有一个:

  1. 先自己回答
  2. 再展开折叠答案核对

当前最小例子统一指:

  • debug_tfb_framework.py
  • run_benchmark.py + ETTh1 + DLinear + rolling_forecast
Info

如果你要先补框架主图,再回来做自检,先看:

  • [[10-run_benchmark与pipeline-总图]]
  • [[33-DLinear在完整benchmark中的全链坐标总图]]
  • [[34-学习缺口与自检Checkpoints]]

1. 使用方式

Tip

正确用法:

  • 不看答案,先口头回答
  • 回答完再展开 参考答案
  • 答不出来时,不要立刻跳代码,先回对应主线文档
Warning

不要把这篇当成“浏览型文档”。

它是给你复述、自测、查漏补缺用的。


2. 高层主链卡片

A1. pipeline(...) 的第一性是什么?

Question

问题:

python
log_filenames = pipeline(
    data_config,
    model_config,
    evaluation_config,
)

这句的第一性是什么?

- 参考答案

pipeline(...) 的第一性是:

把已经组装好的 data_config + model_config + evaluation_config,变成最终落盘的日志文件路径列表 log_filenames

A2. pipeline(...) 的四大块是什么?

Question

问题:

pipeline(...) 在最高层顺序上分成哪四大块?

- 参考答案
  1. 准备数据
  2. 准备模型工厂
  3. 执行评测
  4. 收集结果并写日志

A3. eval_model(...) 的第一性是什么?

Question

问题:

eval_model(...) 这一层到底在做什么转换?

- 参考答案

eval_model(...) 的第一性是:

把模型工厂 + 序列列表 + 评测配置,变成已提交的评测任务,以及后续可收集结果的 EvalResult

A4. RollingForecast._eval_batch(...) 的四段是什么?

Question

问题:

_eval_batch(...) 内部应该先按哪四个逻辑分块理解?

- 参考答案
  1. 配置与切数
  2. 训练
  3. 预测
  4. 打分与收尾

3. 训练线卡片

B1. 为什么训练入口是 fit_method(...)

Question

问题:

_eval_batch(...) 里为什么先写:

python
fit_method = model.forecast_fit if hasattr(model, "forecast_fit") else model.fit
- 参考答案

因为 fit_method 是统一训练入口变量,用来兼容两种接口:

  • forecast_fit(...)
  • fit(...)

这样策略层不用关心当前模型具体暴露的是哪一个名字。

B2. 为什么当前例子里实际走的是 forecast_fit(...)

Question

问题:

当前 DLinear + adapter 例子里,为什么最后实际走的是 forecast_fit(...)

- 参考答案

因为当前模型对象提供了 forecast_fit(...),所以:

python
fit_method = model.forecast_fit

B3. forecast_fit(...) 到训练循环入口前做了什么?

Question

问题:

forecast_fit(...) 在正式进入 for epoch / for batch 之前,按顺序做了哪些关键事?

- 参考答案
  1. 合并 covariates
  2. 补齐数据依赖参数
  3. _init_model()
  4. train_val_split
  5. forecasting_data_provider
  6. criterion / optimizer / early_stopping

B4. 训练循环每个 batch 的核心步骤是什么?

Question

问题:

训练循环里,一个 batch 的最小主链是什么?

- 参考答案
text
取 batch
-> _process(...)
-> output 与 target 对齐
-> loss
-> backward
-> optimizer.step

B5. 为什么 target(4,72,7) 变成 (4,24,7)

Question

问题:

当前训练例子里,为什么监督时最后只比较 (4,24,7)

- 参考答案

因为训练监督时只取未来 horizon=24 步:

python
target = target[:, -config.horizon :, :series_dim]

原始 target 包含:

  • label_len=48 的历史尾部
  • horizon=24 的未来窗口

但真正监督的只有最后 24 步。


4. 预测线卡片

C1. 预测子块为什么不是“一次性预测 test_data”?

Question

问题:

_eval_batch(...) 的预测子块,本质上到底在做什么?

- 参考答案

它不是拿整个 test_data 一次性预测。

它在做:

  1. 生成 rolling 起点 index_list
  2. 用 batch maker 把这些位置组织成预测请求
  3. 批量送进 batch_forecast(...)

C2. batch_forecast(...) 的第一性是什么?

Question

问题:

batch_forecast(...) 在预测线里的职责是什么?

- 参考答案

batch_forecast(...) 的第一性是:

从 batch maker 拿一批 rolling 请求,做预处理、时间标记补齐,再进入 _perform_rolling_predictions(...)

C3. _perform_rolling_predictions(...) 的第一性是什么?

Question

问题:

_perform_rolling_predictions(...) 到底在内部重复做什么?

- 参考答案

它通过重复调用 _process(...)

  • 生成一段新的预测
  • 把这段预测拼回输入
  • 再继续滚动

直到累计的预测长度达到目标 horizon

C4. 为什么当前 DLinear 例子里通常一轮就够?

Question

问题:

当前 DLinear 例子里,为什么 _perform_rolling_predictions(...) 很多时候只跑一轮?

- 参考答案

因为:

  • 目标 horizon = 24
  • 单轮前向本身就输出 24

所以一轮输出就已经满足目标长度。


5. adapter 与模型卡片

D1. adapter 的第一性是什么?

Question

问题:

adapter 这一层存在的根本原因是什么?

- 参考答案

adapter 的第一性是:

把框架统一接口翻译成具体模型的 forward 接口。

D2. TransformerAdapter._process(...) 做了什么?

Question

问题:

TransformerAdapter._process(...) 最核心的三步是什么?

- 参考答案
  1. target 构造 dec_input
  2. 调:
    python
    self.model(input, input_mark, dec_input, target_mark)
  3. 返回:
    python
    {"output": output}

D3. dec_input 的 shape 和语义是什么?

Question

问题:

当前例子里 dec_input 是怎么来的?shape 是什么?语义是什么?

- 参考答案

shape:

  • (4, 72, 7)

语义:

  • label_len=48 步:历史尾部
  • horizon=24 步:零填充

也就是:

text
历史尾部(label_len) + 未来零占位(horizon)

D4. DLinear 真正主要依赖哪个输入?

Question

问题:

在统一四输入接口里,DLinear 真正主要依赖哪个输入?

- 参考答案

DLinear 真正主要依赖:

  • x_enc

D5. DLinear 的真实计算主干是什么?

Question

问题:

DLinear 在当前 benchmark 里,真实的计算主干应该怎么压缩讲?

- 参考答案
text
forward
-> forecast(x_enc)
-> encoder(x_enc)
-> series_decomp
-> Linear_Seasonal / Linear_Trend

6. 关键数字卡片

E1. 为什么 series.shape = (17420, 7)

Question

问题:

当前 ETTh1 例子里,这个 shape 表示什么?

- 参考答案

表示:

  • 一共 17420 个时间点
  • 每个时间点有 7 个变量

E2. 为什么 train_length = 13936test_length = 3484

Question

问题:

这两个长度从哪来?

- 参考答案

因为:

  • tv_ratio = 0.8
  • 17420 * 0.8 = 13936

所以:

  • train_length = 13936
  • test_length = 17420 - 13936 = 3484

E3. 为什么 label_len = 48

Question

问题:

当前多变量 forecast 例子里,为什么 label_len = 48

- 参考答案

因为在 multi_forecasting_hyper_param_tune(...) 里:

python
label_len = seq_len // 2

当前:

  • seq_len = 96

所以:

  • label_len = 48

E4. 为什么训练 batch 是 (4,96,7)(4,72,7)

Question

问题:

当前训练 batch 的两个核心 shape 为什么是:

  • input = (4, 96, 7)
  • target = (4, 72, 7)
- 参考答案

因为:

  • batch_size = 4
  • seq_len = 96
  • target 长度 = label_len + horizon = 48 + 24 = 72
  • 变量数 = 7

E5. 为什么 DLinear 输出是 (4,24,7)

Question

问题:

当前例子里,为什么 output.shape = (4,24,7)

- 参考答案

因为:

  • batch size = 4
  • pred_len = horizon = 24
  • 输出变量数 = 7

E6. 为什么 rolling 评测里只取 num_rollings = 48

Question

问题:

当前例子里,为什么预测子块只保留前 48 个 rolling 位置?

- 参考答案

因为 strategy 配置显式指定了:

  • num_rollings = 48

所以 _eval_batch(...) 里会做:

python
index_list = index_list[:num_rollings]

7. 三步自检法

Example

每次复习不要全看。只做这三步。

第一步:空白复述主链

Todo

不看文档,手写:

text
run_benchmark
-> pipeline
-> eval_model
-> strategy.execute
-> _eval_batch
-> 训练 / 预测 / 打分

第二步:补关键变量

Todo

手写下面 8 个量的来源:

  • series.shape
  • train_length
  • test_length
  • seq_len
  • label_len
  • horizon
  • dec_input.shape
  • output.shape

第三步:分别讲训练线和预测线

Todo

不看文档,分别讲:

  • 训练线
  • 预测线
Warning

如果你只能讲训练线,讲不出预测线,说明 _eval_batch(...) 还没真正闭环。


8. 你接下来怎么走

Important

下一步不是继续深挖一个局部函数。

下一步是:分支树扩展。

8.1 第一组扩展:模型分支树

从:

  • DLinear

扩到:

  • Informer

目标:

  • 框架不变的部分是什么
  • 模型接口变化的部分是什么
  • adapter 如何把 Informer 接进来

8.2 第二组扩展:策略分支树

从:

  • rolling_forecast

扩到:

  • fixed_forecast

目标:

  • 同一个模型在不同策略下,评测协议怎么变化

8.3 第三组扩展:adapter 分支树

从:

  • transformer_adapter

扩到:

  • 其他模型家族 adapter

目标:

  • 理解“框架统一接口”和“不同模型家族接口”的翻译差异

9. 下一阶段真正需要的图谱

Note

你判断得对:下一阶段依然需要架构图谱。

但图谱不再只是“一条主线”,而是要开始长成 分支树

这就是你下一阶段真正该补的“架构理解”。


10. 一句收束

Success

你现在不是继续把 1x1 挖深,而是把已经打通的 1x1 作为根节点,开始扩成 m x n 的分支树。

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