从公式和数据流的角度来剖析《EventTSF: Event-Aware Non-Stationary Time Series Forecasting》的训练和预测逻辑。
1. 数据准备
假设你有时间序列 x 1 , x 2 , ... , x T x_1, x_2, \dots, x_T x1,x2,...,xT 和事件信息 e 1 , e 2 , ... , e T e_1, e_2, \dots, e_T e1,e2,...,eT。
- 历史序列长度: L hist L_{\text{hist}} Lhist
- 预测长度(horizon): H H H
- 模型输出维度: C C C
论文把时间序列拆成 块 (block) ,每个 block 的长度是 H H H(或 block_len),便于 U-shaped Transformer 做下采样/上采样。
训练样本公式:
Input: x t − L hist : t , e t \text{Input: } x_{t-L_{\text{hist}}:t}, \quad e_t Input: xt−Lhist:t,et
Target: v t : t + H = x t + 1 : t + H − x t : t + H − 1 \text{Target: } v_{t:t+H} = x_{t+1:t+H} - x_{t:t+H-1} Target: vt:t+H=xt+1:t+H−xt:t+H−1
这里 v t v_t vt 是速度 (velocity),即时间序列的增量。
- 公式(1):
v t = x t − x t − 1 v_t = x_{t} - x_{t-1} vt=xt−xt−1
2. 训练阶段逻辑
论文训练的是 velocity denoising:
v ^ t : t + H = f θ ( x t − L hist : t , e t ) \hat{v}{t:t+H} = f\theta(x_{t-L_{\text{hist}}:t}, e_t) v^t:t+H=fθ(xt−Lhist:t,et)
-
输入:
- 历史序列 x t − L hist : t x_{t-L_{\text{hist}}:t} xt−Lhist:t
- 对应事件 embedding e t e_t et
- 时间 embedding t _ e m b t\_emb t_emb(编码位置/时间)
-
输出:
- 预测速度 v ^ t : t + H \hat{v}_{t:t+H} v^t:t+H
-
损失函数:
L = 1 H ∑ i = 1 H ∥ v ^ t + i − v t + i ∥ 2 2 \mathcal{L} = \frac{1}{H} \sum_{i=1}^{H} \| \hat{v}{t+i} - v{t+i} \|_2^2 L=H1i=1∑H∥v^t+i−vt+i∥22
注意:训练是在 velocity 上 MSE,而不是直接预测 x x x。
-
如果论文用 multi-block 自回归(多步训练):
- 先预测 block1,累加得到 x
- 再把 block1 作为历史预测 block,预测 block2
- 保证模型能学习到滞后和非平稳变化
3. 自回归预测阶段
预测阶段核心公式在论文中就是 公式(3) + velocity 累加:
- EventSteps 决定 block 的步长 Δ t \Delta t Δt:
δ T = σ ( Linear ( e ) ) \delta T = \sigma(\text{Linear}(e)) δT=σ(Linear(e))
t step = 1 T + δ T t_\text{step} = \frac{1}{T + \delta T} tstep=T+δT1
- 模型预测 velocity:
v ^ t : t + H = f θ ( x t − L hist : t , e t ) \hat{v}{t:t+H} = f\theta(x_{t-L_{\text{hist}}:t}, e_t) v^t:t+H=fθ(xt−Lhist:t,et)
- 自回归累加得到预测序列:
x ^ t + i = x ^ t + i − 1 + v ^ t + i − 1 , i = 1 , ... , H \hat{x}{t+i} = \hat{x}{t+i-1} + \hat{v}_{t+i-1}, \quad i=1,\dots,H x^t+i=x^t+i−1+v^t+i−1,i=1,...,H
预测阶段直接用 x 递推,不再用真实 velocity。
这个逻辑严格对应论文里 velocity → accumulate → forecast。
4. 数据流总结(训练 vs 预测)
| 阶段 | 输入 | 输出 | 公式/说明 |
|---|---|---|---|
| 训练 | 历史 x, event embedding | 预测 velocity v ^ \hat{v} v^ | v t = x t − x t − 1 v_t = x_t - x_{t-1} vt=xt−xt−1, 训练 MSE( v ^ , v \hat{v}, v v^,v ) |
| 预测 | 历史 x, event embedding | 预测 x | 预测 v ^ \hat{v} v^ 后累加: x ^ t + 1 = x t + v ^ t \hat{x}_{t+1} = x_t + \hat{v}_t x^t+1=xt+v^t |
| block 自回归 | 前一个 block 预测序列 | 后一个 block | 保持历史信息,用累加结果作为新的历史 |
重点理解
-
训练是在 velocity 上做 denoising
- 模型学习的是序列变化趋势,而不是绝对值。
- 这样能更好适应非平稳序列(趋势、波动变化)。
-
预测是自回归累加
- 测试时不会暴露真实 x,只用模型预测的 velocity 累加得到序列。
- 保证和真实应用一致。
-
事件 embedding 直接调节 block 步长和注意力
- EventSteps 模块学习如何根据事件重要性调整 timestep 分配(公式(3))。
如果用 Python 实现:
python
# 训练阶段
v_true = x[:,1:] - x[:,:-1] # velocity
v_hat = model(x_hist, ev_emb)
loss = F.mse_loss(v_hat, v_true)
# 测试阶段
x_pred = x_hist[:,-1:] # last known value
for t in range(H):
v_hat = model(x_hist, ev_emb)
x_new = x_pred + v_hat
x_pred = x_new # 自回归累加