Appearance
iTransformer 总览
ICLR 2024 · Liu et al. · 论文链接
1. 论文动机
标准 Transformer 在多变量时序预测上的两个核心问题:
时间步 token 混合了所有变量
每个 token = 一个时间步,维度内部同时编码了所有变量的值。模型无法区分各变量的独立特征,变量间的语义边界被抹除。 时序注意力建模的是"哪个时刻重要",而非"哪两个变量相关"
时间步之间的注意力擅长捕捉时序依赖,却天然不适合建模多变量互相关(例如:气温与用电量的滞后相关),而后者正是多变量预测的核心难点。
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 = 一个变量的完整历史序列
- 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 注意力矩阵三种多变量建模策略对比:
| 维度 | 标准 Transformer | PatchTST | iTransformer |
|---|---|---|---|
| token 语义 | 时间步(所有变量混合) | 时间 patch(单变量) | 变量(整条时序) |
| 注意力轴 | 时间轴 | patch 轴(时间内) | 变量轴 |
| 多变量建模 | 时间步内混合 N 个变量 | channel-independent(各变量独立建模) | 变量间注意力(跨变量依赖) |
| 注意力复杂度 | |||
| 位置编码 | 时间步位置编码 | patch 位置编码 | ❌ 无(变量无顺序) |
| 时间特征注入 | 加法嵌入 | 加法嵌入 | concat 成独立 token |
| 能否学跨变量相关 | 弱(时间步 token 混合了变量,无法分离) | ❌(强制 channel-independent) | ✅(attention 直接在变量间计算) |
3. 论文架构(原理层)
4. TFB 调用链
5. 文档 BFS 树形索引
6. 论文组件 → 代码对应表
| 论文组件 | 代码实现 | 精读文档 |
|---|---|---|
| Inverted Token(变量作 token) | DataEmbedding_inverted.forward() | [[03A-Layer2A-DataEmbedding_inverted]] |
| Instance Normalization | forecast() 第 1 步:means/stdev | [[02-Layer1-forecast主链]] |
| Encoder 循环(无 distilling) | Encoder.forward() else 分支 | [[03B-Layer2B-Encoder]] |
| 双残差 EncoderLayer | EncoderLayer.forward() | [[03B1-Layer3-EncoderLayer]] |
| Q/K/V 多头投影 | AttentionLayer.forward() | [[04-Layer4-AttentionLayer]] |
| Inter-variable Attention | FullAttention.forward() | [[04A-Layer5-FullAttention]] |
| Variate-specific Projection | nn.Linear(d_model, pred_len) | [[02-Layer1-forecast主链]] |
| De-normalization | forecast() 末段 * stdev + means | [[02-Layer1-forecast主链]] |
7. 全局 Toy 参数
| 参数 | 值 | 含义 |
|---|---|---|
B | 3 | batch size |
seq_len | 12 | encoder 输入时间步数 |
pred_len | 6 | 预测步数 |
N(enc_in) | 5 | 变量数(多变量时序的通道数) |
d_model | 8 | 隐层维度 |
n_heads | 4 | 注意力头数 |
d_keys | 2 | = d_model / n_heads = 8 / 4 |
d_ff | 16 | FFN 隐层维度 |
e_layers | 2 | Encoder 层数 |
time_dims | 4 | 时间特征维度(TFB freq="h" 固定为 4) |
token_count | 9 | = N + time_dims = 5 + 4,embedding 后的 token 数 |
dropout | 0.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-接入界面]] 开始,逐层向下