Skip to content

iTransformer 总览

ICLR 2024 · Liu et al. · 论文链接


1. 论文动机

标准 Transformer 在多变量时序预测上的两个核心问题:

  1. 时间步 token 混合了所有变量
    每个 token = 一个时间步,维度内部同时编码了所有变量 v1,v2,,vN 的值。模型无法区分各变量的独立特征,变量间的语义边界被抹除。

  2. 时序注意力建模的是"哪个时刻重要",而非"哪两个变量相关"
    时间步之间的注意力擅长捕捉时序依赖,却天然不适合建模多变量互相关(例如:气温与用电量的滞后相关),而后者正是多变量预测的核心难点。

ASCII 对比:时间步 token vs 变量 token

Standard Transformer(时间步 token):
  token_1 = [t1: v1, v2, v3, v4, v5]   ← 所有变量混合在一个 token
  token_2 = [t2: v1, v2, v3, v4, v5]
  ...
  token_12= [t12:v1, v2, v3, v4, v5]
  注意力:token_i ↔ token_j  →  哪个时刻最重要?

iTransformer(变量 token):
  token_v1 = [v1: t1, t2, t3, ..., t12]  ← 一个变量的完整历史
  token_v2 = [v2: t1, t2, t3, ..., t12]
  ...
  token_v5 = [v5: t1, t2, t3, ..., t12]
  注意力:token_vi ↔ token_vj  →  哪两个变量相关?

2. 核心创新:Inversion(翻转)

核心思想:把 Transformer 的 token 维度从"时间步"翻转为"变量"。

  • 每个 token = 一个变量的完整历史序列 (t1,t2,,tseq_len)
  • token 之间的注意力 = 变量间注意力(inter-variable attention)
  • FFN 在 token 内部作用 = 对单个变量历史做非线性变换

两种 token 化方式的 shape 对比(toy 参数:B=3, seq_len=12, N=5, d_model=8):

Standard Transformer:
  输入 x: (B, seq_len, N) = (3, 12, 5)
  Embedding 后: (B, seq_len, d_model) = (3, 12, 8)
  attention Q/K/V: (3, 12, 8)  →  12 × 12 注意力矩阵

iTransformer(inverted):
  输入 x: (B, seq_len, N) = (3, 12, 5)
  permute → (B, N, seq_len) = (3, 5, 12)
  concat 时间标记 → (B, N+time_dims, seq_len) = (3, 9, 12)
  Linear(seq_len→d_model) → (3, 9, 8)
  attention Q/K/V: (3, 9, 8)  →  9 × 9 注意力矩阵

三种多变量建模策略对比:

维度标准 TransformerPatchTSTiTransformer
token 语义时间步(所有变量混合)时间 patch(单变量)变量(整条时序)
注意力轴时间轴patch 轴(时间内)变量轴
多变量建模时间步内混合 N 个变量channel-independent(各变量独立建模)变量间注意力(跨变量依赖)
注意力复杂度O(L2)L=12144O(P2)P=patch\_numO(N2)N=981
位置编码时间步位置编码patch 位置编码❌ 无(变量无顺序)
时间特征注入加法嵌入加法嵌入concat 成独立 token
能否学跨变量相关弱(时间步 token 混合了变量,无法分离)❌(强制 channel-independent)✅(attention 直接在变量间计算)

3. 论文架构(原理层)


4. TFB 调用链


5. 文档 BFS 树形索引


6. 论文组件 → 代码对应表

论文组件代码实现精读文档
Inverted Token(变量作 token)DataEmbedding_inverted.forward()[[03A-Layer2A-DataEmbedding_inverted]]
Instance Normalizationforecast() 第 1 步:means/stdev[[02-Layer1-forecast主链]]
Encoder 循环(无 distilling)Encoder.forward() else 分支[[03B-Layer2B-Encoder]]
双残差 EncoderLayerEncoderLayer.forward()[[03B1-Layer3-EncoderLayer]]
Q/K/V 多头投影AttentionLayer.forward()[[04-Layer4-AttentionLayer]]
Inter-variable AttentionFullAttention.forward()[[04A-Layer5-FullAttention]]
Variate-specific Projectionnn.Linear(d_model, pred_len)[[02-Layer1-forecast主链]]
De-normalizationforecast() 末段 * stdev + means[[02-Layer1-forecast主链]]

7. 全局 Toy 参数

参数含义
B3batch size
seq_len12encoder 输入时间步数
pred_len6预测步数
Nenc_in5变量数(多变量时序的通道数)
d_model8隐层维度
n_heads4注意力头数
d_keys2= d_model / n_heads = 8 / 4
d_ff16FFN 隐层维度
e_layers2Encoder 层数
time_dims4时间特征维度(TFB freq="h" 固定为 4)
token_count9= N + time_dims = 5 + 4,embedding 后的 token 数
dropout0.1
n_heads = time_dims = 4 的说明

两者数值相同是纯粹的巧合,语义完全不同:n_heads=4 是注意力多头数,time_dims=4 是时间特征的维度数(hour-of-day、day-of-week、day-of-month、month-of-year)。两者不会在同一 tensor 维度上同时出现。


8. 推荐阅读路径

快速了解直觉:[[00-总览]] → §1 论文动机 → §2 核心创新(ASCII 对比图)→ [[02-Layer1-forecast主链]]

完整代码精读:按 BFS 树顺序,从 [[01-Layer0-接入界面]] 开始,逐层向下

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