Skip to content

DLinear 收束

1. 端到端流程图

T = seq_len,P = pred_len,C = enc_in


2. tensor 变化汇总表

步骤操作shape 变化toy shape
输入x_enc(2, 6, 3)
series_decompmoving_avg + 残差不变 × 2(2,6,3) × 2
permute(B,T,C)→(B,C,T)轴 1↔2 交换(2,3,6)
Linear_Seasonalseq_len→pred_len最后维 6→2(2,3,2)
Linear_Trendseq_len→pred_len最后维 6→2(2,3,2)
相加element-wise不变(2,3,2)
permute(B,C,P)→(B,P,C)轴 1↔2 交换(2,2,3)
截取[:,-pred_len:,:]不变(已是pred_len)(2,2,3)

3. 各文档覆盖范围

文档覆盖代码关键 tensor
01-Layer0-接入界面Config + __init__ + _process + forward 分支(B,seq_len,C) 进入模型
02-Layer1-encoder主链encoder() 完整流程(B,T,C)→(B,C,T)→(B,C,P)→(B,P,C)
03-Layer2-series_decompmoving_avg + series_decomp(B,T,C)→seasonal+trend (B,T,C)

4. DLinear 核心设计决策

决策做法为什么
序列分解moving_avg + 残差让每路 Linear 只处理单一模式(趋势/季节),降低拟合难度
permute 包裹 Linear(B,T,C)→(B,C,T)→Linear→(B,C,P)nn.Linear 只作用于最后维,需要把时间轴移到最后
individual=False所有变量共享一套线性头参数少,训练快,对多变量数据有正则化效果
权重初始化为 1/seq_lentorch.ones * (1/seq_len)相当于初始化为"对历史均匀加权的均值预测",是合理的起点
丢弃 x_dec / x_markforward 只用 x_encDLinear 不需要 decoder,框架接口统一但模型自由选用

5. 与同类模型对比

维度DLinearInformerPatchTST
核心操作线性层ProbSparse AttentionPatch + Full Attention
序列分解✓ moving_avg✓ Autoformer-style
channel-independent可选✓ 强制
参数量极小(2×seq_len×pred_len)中等
计算复杂度O(T)O(T log T)O(T/P)²

6. 下一步读什么

  • iTransformer:把 DLinear 的"变量独立"思路推进一步,在变量维做注意力
  • TimesNet:把 1D 时序变换为 2D 来做 CNN,与 DLinear 的线性思路形成对比

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