Skip to content

收束: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
③×2EncoderLayer[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 核心设计对比

维度DLinearInformerPatchTSTiTransformerAutoformer
token 语义无 token时间步时间 patch变量(整条时序)时间步
注意力轴无注意力时间轴patch 轴变量轴时间轴
注意力矩阵大小L×L(稀疏化)patch_num×patch_numN×NL×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_invertedvalue_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 架构之间的"接口冗余"。


§5 文档地图

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