Appearance
收束 — 端到端流程汇总
1. 端到端流程图(含 subgraph)
2. Tensor 变化汇总表
| 步骤 | 操作 | 输入 shape | 输出 shape | 关键参数 |
|---|---|---|---|---|
| ①② 归一化 | mean/std detach | (2,12,4) | (2,12,4) | dim=1, keepdim=True |
| ③ permute | (0,2,1) | (2,12,4) | (2,4,12) | 变量轴提前 |
| ④-1 padding | ReplicationPad1d(0,2) | (2,4,12) | (2,4,14) | 右端复制2步 |
| ④-2 unfold | dim=-1, size=4, step=2 | (2,4,14) | (2,4,6,4) | patch_num=6 |
| ④-3 reshape | B×C合并 | (2,4,6,4) | (8,6,4) | B*C=8 |
| ④-4 embedding | Linear(4→16)+pos | (8,6,4) | (8,6,16) | d_model=16 |
| ⑤ Encoder | EncoderLayer×1 | (8,6,16) | (8,6,16) | patch级注意力 |
| ⑥ reshape | B*C还原 | (8,6,16) | (2,4,6,16) | n_vars=4 |
| ⑦ permute | (0,1,3,2) | (2,4,6,16) | (2,4,16,6) | d_model/patch互换 |
| ⑧-1 Flatten | start_dim=-2 | (2,4,16,6) | (2,4,96) | head_nf=96 |
| ⑧-2 Linear | head_nf→pred_len | (2,4,96) | (2,4,3) | FlattenHead |
| ⑧-3 permute | (0,2,1) | (2,4,3) | (2,3,4) | 还原(B,pred,C) |
| ⑨ 反归一化 | ×stdev+means | (2,3,4) | (2,3,4) | 广播 |
3. 文档覆盖范围 × tensor 变化
| 文档 | 层级 | 覆盖的 tensor 阶段 | 核心内容 |
|---|---|---|---|
| 01-Layer0-接入界面 | Layer 0 | config→init;batch I/O | CONFIG映射、padding=stride、head_nf计算 |
| 02-Layer1-forecast主链 | Layer 1 | (2,12,4) 到 (2,3,4) 的9步概览 | 归一化+channel-ind+反归一化 |
| 03-Layer2A-PatchEmbedding | Layer 2A | (2,4,12) → (8,6,16) | ReplicationPad+unfold+reshape+embedding |
| 04-Layer2B-Encoder | Layer 2B | (8,6,16) → (8,6,16) | QKV投影+einsum注意力+Conv1d FFN |
| 04D-Layer4-例子-AttentionLayer到return | Attention 叶子例子 | (1,2,4) → (1,2,2,2) → (1,2,4) | 用具体 Q/K/V 矩阵手算 scores、softmax、AV、out_projection |
4. 核心设计决策
| 决策 | 实现方式 | 效果 |
|---|---|---|
| Patch tokenization | ReplicationPad + unfold 滑窗 | 每个 token 包含局部上下文,比单步 token 语义更丰富 |
| Channel-Independent | reshape(B*C,...) 合并变量到 batch | 注意力只在同变量 patch 间,消除变量互干扰 |
| 实例归一化 | detach mean/std,归一化+反归一化 | 消除分布偏移,detach 防止模型"逆向工程"统计量 |
| FlattenHead | Flatten(d_model×patch_num) + Linear | 简单线性映射,不引入额外归纳偏置 |
| FullAttention(不是 ProbAttention) | 标准 scaled dot-product | patch_num 较小(6个token),O(n²) 可接受 |
5. 与同类模型的结构对比
| 特性 | DLinear | PatchTST | Informer |
|---|---|---|---|
| token 单位 | 整个序列(seq_len 是 Linear 输入维度) | patch(局部子序列) | 单个时间步 |
| 变量处理 | 每个变量独立 Linear(individual=False 时共享) | Channel-Independent(reshape B*C) | 多变量混合 |
| 注意力 | 无 | FullAttention on patch_num tokens | ProbSparse Attention on seq_len tokens |
| 归一化 | 无 | 实例归一化(RevIN 风格) | 无 |
| 时序分解 | 移动平均(seasonal+trend) | 无 | 无 |
| 输出映射 | Linear(seq_len→pred_len) | FlattenHead(head_nf→pred_len) | Linear(d_model→c_out) |
| 计算复杂度 | O(seq_len) | O(patch_num²) ≪ O(seq_len²) | O(seq_len × log seq_len) |
6. 下一步读什么
- 想理解 channel-independent 的直觉:重读 03-Layer2A §5.4(reshape 的语义)和 §5.3(unfold toy 数值)
- 想理解注意力计算细节:先读 04D-Layer4-例子-AttentionLayer到return,再读 04C-Layer5-FullAttention
- 想对比 PatchTST 和 Informer 的 Encoder 差异:Informer Encoder 有 ConvLayer distilling(逐层缩短 seq_len),PatchTST 无此机制
- 想在 TFB 里跑 PatchTST:关注 01-Layer0 §5.1(patch_len/stride 是关键超参,通过 MODEL_HYPER_PARAMS 设置)