Appearance
收束:iTransformer 端到端总览
汇总从 TFB 数据切片到
forecast()输出的完整流程,给出张量变化表和跨模型对比。
§1 端到端流程图
§2 张量变化汇总表
全局 toy 参数:B=3, seq_len=12, pred_len=6, N=5, d_model=8, n_heads=4, d_keys=2, d_ff=16, e_layers=2, time_dims=4, token_count=9
| 步骤 | 操作 | 输入 shape | 输出 shape | 关键说明 |
|---|---|---|---|---|
| TFB 切片 | RollingForecast | — | (3,12,5) (3,12,4) | x_enc, x_mark_enc |
| ① | Instance Norm:mean+std | (3,12,5) | (3,12,5) | means/stdev 各 (3,1,5) 保存备用 |
| ② | permute(0,2,1):时间轴→特征维 | (3,12,5) | (3,5,12) | 变量轴成为 token 计数维 |
| ② | x_mark.permute(0,2,1) | (3,12,4) | (3,4,12) | 时间标记同样翻转 |
| ② | torch.cat(dim=1) | (3,5,12) + (3,4,12) | (3,9,12) | 5 变量 token + 4 时间 token |
| ② | Linear(12→8) = value_embedding | (3,9,12) | (3,9,8) | c_in=seq_len=12,非 enc_in=N=5 |
| ② | Dropout | (3,9,8) | (3,9,8) | enc_out 进入 Encoder |
| ③×2 | EncoderLayer[0,1]:attention+FFN | (3,9,8) | (3,9,8) | 变量间 9×9 注意力矩阵;形状不变 |
| ③ | LayerNorm | (3,9,8) | (3,9,8) | Encoder 最终输出 |
| ④ | projection Linear(8→6) | (3,9,8) | (3,9,6) | 每个变量 token 直接输出 pred_len 步 |
| ④ | permute(0,2,1) | (3,9,6) | (3,6,9) | 轴0=B,轴1=pred_len,轴2=token_count |
| ④ | [:,:,:N=5] | (3,6,9) | (3,6,5) | 裁掉 4 个时间 token 的输出 |
| ⑤ | De-norm × stdev + means | (3,6,5) | (3,6,5) | stdev/means 广播到 (3,6,5) |
| forward() | [:,-pred_len:,:] | (3,6,5) | (3,6,5) | 幂等裁剪;iTransformer 已精确输出 pred_len |
§3 核心设计对比
| 维度 | DLinear | Informer | PatchTST | iTransformer | Autoformer |
|---|---|---|---|---|---|
| token 语义 | 无 token | 时间步 | 时间 patch | 变量(整条时序) | 时间步 |
| 注意力轴 | 无注意力 | 时间轴 | patch 轴 | 变量轴 | 时间轴 |
| 注意力矩阵大小 | — | L×L(稀疏化) | patch_num×patch_num | N×N | L×L(FFT加速) |
| 输入分解 | 移动平均分解 | 无 | 无 | Instance Norm | 多步 trend-seasonal 分解 |
| 时间标记处理 | 无 | 加法嵌入 | 加法嵌入 | concat 成独立 token | 加法嵌入 |
| Decoder | 无 | ✅ ProbSparse | 无 | 无(encoder-only) | ✅ Auto-Correlation Decoder |
| Projection 方向 | Linear(seq_len→pred_len) | Linear(d_model→c_out) | Linear(d_model→c_out) | Linear(d_model→pred_len) | Linear(d_model→c_out) |
| 序列长度变化 | 不变 | distilling 压缩 | 不变(patch 内压缩) | 不变(9 token 贯穿) | 不变 |
| 多变量建模方式 | channel-independent | 时间步中混合 | channel-independent | 变量间注意力 | 时间步中混合 |
§4 iTransformer 设计决策回顾
为什么 token = 变量?
标准 Transformer 每个 token = 一个时间步,attention 捕捉"哪些历史时刻对当前预测重要"。但多变量时序的核心挑战是跨变量依赖(如温度↑→能耗↑)。把 token 定义为变量,attention 自然捕捉变量间的相关结构。
为什么时间特征 concat 而非 add?
PatchTST/Informer/Autoformer 把时间特征加到 token 向量上(add)。iTransformer 把 time_mark 当成额外的"时间变量 token"拼接,使 Encoder 可以学习"时间规律如何影响每个变量"的跨 token 注意力,而不是把时间信息强行混入每个 token 的嵌入向量。
为什么 projection 是 Linear(d_model → pred_len)?
每个变量 token 的 d_model 维向量编码了该变量在整段历史上的特征表示。将 d_model 维直接映射到 pred_len 步,等于"从变量的历史全局特征直接推断其未来走势",无需逐步解码。这是 encoder-only 结构的自然选择。
为什么 c_in = seq_len 而非 enc_in?
DataEmbedding_inverted 的 value_embedding = nn.Linear(c_in, d_model),其 c_in = configs.seq_len。原因:permute 后每个 token 的特征维是 seq_len(时间步数),而非 enc_in(变量数)。这是 "inverted" 名字的直接来源:c_in 的语义随轴翻转而翻转。
x_dec / x_mark_dec 为什么传入但不用?
TFB 框架对所有 Transformer 模型统一调用 forward(x_enc, x_mark_enc, x_dec, x_mark_dec) 签名,不区分 encoder-only 和 encoder-decoder。iTransformer 接受签名但函数体不引用后两个参数——这是框架通用性与模型 encoder-only 架构之间的"接口冗余"。