Appearance
自检复习卡片与下一步
Abstract
这篇是复习版,不是分析版。
用法只有一个:
- 先自己回答
- 再展开折叠答案核对
当前最小例子统一指:
debug_tfb_framework.pyrun_benchmark.py + ETTh1 + DLinear + rolling_forecast
Info
如果你要先补框架主图,再回来做自检,先看:
- [[10-run_benchmark与pipeline-总图]]
- [[33-DLinear在完整benchmark中的全链坐标总图]]
- [[34-学习缺口与自检Checkpoints]]
1. 使用方式
Tip
正确用法:
- 不看答案,先口头回答
- 回答完再展开
参考答案- 答不出来时,不要立刻跳代码,先回对应主线文档
Warning
不要把这篇当成“浏览型文档”。
它是给你复述、自测、查漏补缺用的。
2. 高层主链卡片
A1. pipeline(...) 的第一性是什么?
Question
问题:
pythonlog_filenames = pipeline( data_config, model_config, evaluation_config, )这句的第一性是什么?
- 参考答案
pipeline(...)的第一性是:把已经组装好的
data_config + model_config + evaluation_config,变成最终落盘的日志文件路径列表log_filenames。
A2. pipeline(...) 的四大块是什么?
Question
问题:
pipeline(...)在最高层顺序上分成哪四大块?
- 参考答案
- 准备数据
- 准备模型工厂
- 执行评测
- 收集结果并写日志
A3. eval_model(...) 的第一性是什么?
Question
问题:
eval_model(...)这一层到底在做什么转换?
- 参考答案
eval_model(...)的第一性是:把模型工厂 + 序列列表 + 评测配置,变成已提交的评测任务,以及后续可收集结果的
EvalResult。
A4. RollingForecast._eval_batch(...) 的四段是什么?
Question
问题:
_eval_batch(...)内部应该先按哪四个逻辑分块理解?
- 参考答案
- 配置与切数
- 训练
- 预测
- 打分与收尾
3. 训练线卡片
B1. 为什么训练入口是 fit_method(...)?
Question
问题:
_eval_batch(...)里为什么先写:pythonfit_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(...),所以:pythonfit_method = model.forecast_fit
B3. forecast_fit(...) 到训练循环入口前做了什么?
Question
问题:
forecast_fit(...)在正式进入for epoch / for batch之前,按顺序做了哪些关键事?
- 参考答案
- 合并
covariates- 补齐数据依赖参数
_init_model()train_val_splitforecasting_data_providercriterion / 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步:pythontarget = target[:, -config.horizon :, :series_dim]原始
target包含:
label_len=48的历史尾部horizon=24的未来窗口但真正监督的只有最后 24 步。
4. 预测线卡片
C1. 预测子块为什么不是“一次性预测 test_data”?
Question
问题:
_eval_batch(...)的预测子块,本质上到底在做什么?
- 参考答案
它不是拿整个
test_data一次性预测。它在做:
- 生成 rolling 起点
index_list- 用 batch maker 把这些位置组织成预测请求
- 批量送进
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(...)最核心的三步是什么?
- 参考答案
- 从
target构造dec_input- 调:
pythonself.model(input, input_mark, dec_input, target_mark)- 返回:
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 里,真实的计算主干应该怎么压缩讲?
- 参考答案
textforward -> 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 = 13936,test_length = 3484?
Question
问题:
这两个长度从哪来?
- 参考答案
因为:
tv_ratio = 0.817420 * 0.8 = 13936所以:
train_length = 13936test_length = 17420 - 13936 = 3484
E3. 为什么 label_len = 48?
Question
问题:
当前多变量 forecast 例子里,为什么
label_len = 48?
- 参考答案
因为在
multi_forecasting_hyper_param_tune(...)里:pythonlabel_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 = 4seq_len = 96target 长度 = label_len + horizon = 48 + 24 = 72- 变量数 =
7
E5. 为什么 DLinear 输出是 (4,24,7)?
Question
问题:
当前例子里,为什么
output.shape = (4,24,7)?
- 参考答案
因为:
- batch size =
4pred_len = horizon = 24- 输出变量数 =
7
E6. 为什么 rolling 评测里只取 num_rollings = 48?
Question
问题:
当前例子里,为什么预测子块只保留前 48 个 rolling 位置?
- 参考答案
因为 strategy 配置显式指定了:
num_rollings = 48所以
_eval_batch(...)里会做:pythonindex_list = index_list[:num_rollings]
7. 三步自检法
Example
每次复习不要全看。只做这三步。
第一步:空白复述主链
Todo
不看文档,手写:
textrun_benchmark -> pipeline -> eval_model -> strategy.execute -> _eval_batch -> 训练 / 预测 / 打分
第二步:补关键变量
Todo
手写下面 8 个量的来源:
series.shapetrain_lengthtest_lengthseq_lenlabel_lenhorizondec_input.shapeoutput.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的分支树。