时间序列预测一直是工业界和学术界关注的重点问题,特别是在能源、交通、金融等领域,准确的中长期预测能够带来显著的经济效益。传统方法如ARIMA、Prophet等在短期预测中表现尚可,但当预测长度超过24个时间步时,精度会急剧下降。这主要源于两个根本性挑战:
长期依赖捕捉困难:随着预测长度的增加,模型需要记忆和关联更远的历史信息,而普通RNN/LSTM存在梯度消失问题,Transformer的自注意力机制虽然理论上能捕捉任意距离依赖,但实际计算复杂度随序列长度呈平方级增长。
多尺度特征提取不足:真实世界的时间序列往往包含日内周期、周周期、季节周期等多种尺度模式,传统模型通常采用单一尺度的特征提取方式,难以同时捕获这些跨尺度特征。
我们团队在电力负荷预测项目中实测发现,当预测长度达到168小时(7天)时,LSTM模型的MAPE指标会从短期预测时的5%左右恶化到15%以上,这种精度衰减严重影响了预测结果的实用性。
我们在Informer原有架构基础上,创新性地引入了并行多尺度卷积分支。具体实现包含三个关键设计:
python复制class MultiScaleConv(nn.Module):
def __init__(self, d_model):
super().__init__()
self.conv_short = nn.Conv1d(d_model, d_model//3, kernel_size=3, padding=1)
self.conv_mid = nn.Conv1d(d_model, d_model//3, kernel_size=24, padding=11, dilation=2)
self.conv_long = nn.Conv1d(d_model, d_model//3, kernel_size=168, padding=84)
def forward(self, x):
# x shape: [batch, seq_len, d_model]
x = x.transpose(1, 2)
short = self.conv_short(x)
mid = self.conv_mid(x)
long = self.conv_long(x)
out = torch.cat([short, mid, long], dim=1)
return out.transpose(1, 2)
针对原始Informer的Prob稀疏注意力在长序列下的两个痛点进行改进:
查询-键值匹配优化:
内存效率提升:
python复制class ImprovedProbAttention(nn.Module):
def __init__(self, mask_flag=True, factor=5, scale=None):
super().__init__()
self.factor = factor
self.scale = scale
self.mask_flag = mask_flag
def _prob_QK(self, Q, K, sample_k, n_top):
# 改进的稀疏化计算
K_expand = K.unsqueeze(-3).expand(-1, -1, Q.shape[-2], -1)
index_sample = torch.randint(0, K.shape[-2], (sample_k,))
K_sample = K_expand[:, :, :, index_sample]
Q_K_sample = torch.matmul(Q.unsqueeze(-2), K_sample.transpose(-2, -1))
# soft selection替代hard top-k
M = Q_K_sample.max() - Q_K_sample
M = M / M.sum(-1, keepdim=True)
return torch.sum(M * Q_K_sample, -1)
针对中长期预测的特点,我们设计了特殊的数据处理流程:
多周期对齐:
归一化策略:
重要提示:必须保持训练/测试集在相同周期相位上划分,避免出现跨周期切割导致的模式泄露。
课程学习策略:
损失函数设计:
python复制def hybrid_loss(pred, true):
# 时序权重
seq_len = pred.shape[1]
time_weight = torch.linspace(0.5, 1.5, seq_len).to(pred.device)
# 频域转换
pred_fft = torch.fft.rfft(pred, dim=1)
true_fft = torch.fft.rfft(true, dim=1)
# 组合损失
mse_loss = (time_weight * (pred - true)**2).mean()
freq_loss = (pred_fft - true_fft).abs().mean()
return 0.7*mse_loss + 0.3*freq_loss
我们在三个公开数据集上进行了对比测试:
| 模型名称 | Electricity (96点) | Traffic (168点) | COVID-19 (30点) |
|---|---|---|---|
| LSTM | 0.312/0.285 | 0.421/0.398 | 0.198/0.175 |
| Transformer | 0.287/0.263 | 0.385/0.362 | 0.173/0.152 |
| Informer | 0.254/0.231 | 0.342/0.320 | 0.152/0.133 |
| 本模型 | 0.228/0.207 | 0.301/0.282 | 0.138/0.121 |
(表中数据格式为RMSE/MAPE,预测长度分别为各数据集括号内数值)
在某省级电网的实际部署中,我们总结了以下关键经验:
在线更新策略:
计算优化:
业务融合:
现象:损失函数出现周期性震荡
解决方法:
现象:预测序列后半段出现明显偏差
优化措施:
现象:长序列训练时显存不足
处理方案:
python复制# 梯度检查点示例
from torch.utils.checkpoint import checkpoint
class CustomCheckpoint(nn.Module):
def __init__(self, model):
super().__init__()
self.model = model
def forward(self, x):
return checkpoint(self.model, x)
当前架构还可应用于以下场景:
金融领域:
工业设备:
气象预测:
在实际部署风电功率预测系统时,我们发现将风速预测(气象领域)与功率转换(物理模型)结合本方法,能够将预测误差再降低12-15%。这提示我们,跨领域的特征融合可能是下一步改进的重要方向。