Skip to content

DLinear 总览

1. 论文问题与动机

2021-2022 年,时间序列预测领域陷入一种奇怪的军备竞赛:每篇新论文都比前一篇更复杂——Informer 改注意力机制,Autoformer 加自相关,FEDformer 进频域……每篇都声称刷了 SOTA。

但没人回答一个基础问题:这些复杂结构到底有没有在起作用?还是说复杂模型赢,只是因为它们顺手做了序列分解或归一化?

ICLR 2023,Zeng et al. 做了一个「破坏性实验」:把所有复杂结构全拿掉,只留一个线性层加一点分解,结果打平甚至超过了 Informer 等模型。这就是 LTSF-Linear,其中 DLinear 是最核心的变体。

2. 核心创新

两个动作,缺一不可:

① 序列分解(series decomp)
   x_enc  ──→  moving_avg(x)  = trend
          └──→  x - trend      = seasonal

② 独立线性外推
   seasonal ──→ Linear_Seasonal ──→ seasonal_pred
   trend    ──→ Linear_Trend    ──→ trend_pred

                          seasonal_pred + trend_pred = output

为什么分解有用:线性层只擅长学单调关系。把慢变化(trend)和快变化(seasonal)分开,每路只需学各自规律,比混在一起更容易。

为什么用线性层而不是 Transformer:直接 seq_len → pred_len 的映射,不需要 attention 建立 token 间关系。

3. 论文架构图(原理层)

4. TFB 完整调用链

5. 文档 BFS 树形索引

文件层级覆盖内容关键 tensor
01-Layer0-接入界面Layer 0config映射 + batch I/O + forward分支(B,seq_len,C)(B,pred_len,C)
02-Layer1-encoder主链Layer 1encoder()全链 + permute原理 + Linear双路(B,T,C)→(B,C,T)→(B,C,pred_len)→(B,pred_len,C)
03-Layer2-series_decompLayer 2moving_avg的填充+池化,seasonal/trend拆解(B,T,C)→seasonal(B,T,C)+trend(B,T,C)
04-收束收束端到端流程图 + tensor汇总全链

6. 全局 toy 参数

参数toy 值真实值(ETTh1)
B24
seq_len696
pred_len224
enc_in37
moving_avg325

各维度互不相等:防止 permute/reshape 后 shape 看起来没变化而掩盖轴语义错误。

toy 输入示例(x_enc,shape (2, 6, 3)):

python
x_enc[0] = [
    [1.0,  10.0, 100.0],  # t=0
    [2.0,  11.0, 101.0],  # t=1
    [3.0,  12.0, 102.0],  # t=2
    [4.0,  13.0, 103.0],  # t=3
    [5.0,  14.0, 104.0],  # t=4
    [6.0,  15.0, 105.0],  # t=5
]

最终输出 shape:(2, 2, 3),即 (B, pred_len, enc_in)

7. 推荐阅读路径

快速了解直觉(不深入代码)
总览 §1-§3 → 01-Layer0 §3-§4(顺序图) → 02-Layer1 §3-§4(顺序图)

完整代码精读
总览 → 01-Layer0 → 02-Layer1 → 03-Layer2 → 09-收束


旧版文档(Level1/2/3/4 结构)已归档至 DLinear_v1_archive/

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