时间序列扩散模型:从去噪生成到概率预测
1. 为什么在时间序列里用扩散模型
传统点预测方法倾向输出单一均值路径,难表达多峰未来。
扩散模型通过学习逐步去噪过程,天然适合生成分布而非单点。
2. 基本机制
前向扩散:逐步向样本加入高斯噪声。
反向过程:学习从噪声恢复数据分布。
典型训练目标:
$$ \mathcal{L}=\mathbb{E}{t,x_0,\epsilon}\left[|\epsilon-\epsilon\theta(x_t,t,cond)|_2^2\right] $$
其中 cond 可包含历史窗口、日历特征和外生变量。
3. Python 训练骨架
import torch
import torch.nn as nn
# x_hist: [B, T, C], y_future: [B, H, C]
# 简化示意:噪声预测网络
class Denoiser(nn.Module):
def __init__(self, d):
super().__init__()
self.net = nn.Sequential(nn.Linear(d, 256), nn.ReLU(), nn.Linear(256, d))
def forward(self, x):
return self.net(x)
model = Denoiser(d=64)
optim = torch.optim.AdamW(model.parameters(), lr=1e-4)
4. 实务关键点
- 条件设计比模型深度更重要(历史统计量、节假日、事件变量)。
- 采样步数与线上延迟需要权衡。
- 评价应覆盖分布质量:CRPS、Pinball Loss、覆盖率。
5. 常见陷阱
- 只看 MSE,忽略分布校准。
- 数据标准化与逆变换流程不一致。
- 没有做滚动窗口回测,导致过乐观评估。
扩散模型在时间序列中的价值是把“不确定性结构”显式建模,而不仅是提高点预测精度。