Transformer时间序列预测
Transformer时间序列预测输出调整指南
预测任务类型
单步预测直接输出下一个时间步的值,输出维度等于预测变量数量。多步预测需要输出多个未来时间步的值,输出维度为预测步长乘以预测变量数。
单变量预测输出1维,多变量预测输出N维。根据任务类型组合形成四种预测模式:单步单变量、多步单变量、单步多变量、多步多变量。
基础结构修改
原始Transformer的Seq2Seq结构需要调整输出层:
- 将Softmax输出层改为线性层
- 输出维度匹配预测变量数量
- 移除离散化处理,保留连续值输出
# 输出层调整示例(PyTorch)
output_layer = nn.Linear(d_model, num_prediction_variables)
单步预测实现
单步预测可直接移除解码器结构,使用全连接网络作为解码器:
- 单变量:输出1维数值
- 多变量:输出N维向量
# 单步预测头示例
class SingleStepHead(nn.Module):def __init__(self, input_dim, output_dim):super().__init__()self.linear = nn.Linear(input_dim, output_dim)def forward(self, x):return self.linear(x[:, -1, :]) # 取最后时间步
多步预测实现
多步预测需保留解码器结构,注意两种实现方式:
自回归解码:
- 计算复杂度O(T)
- 严格保持因果性
- 逐步生成预测结果
# 自回归预测示例
for t in range(pred_steps):output = model(history)next_step = output[:, -1:, :]history = torch.cat([history, next_step], dim=1)
并行解码:
- 计算复杂度O(1)
- 需要完整掩码机制
- 一次性输出所有预测
# 并行解码掩码示例
mask = torch.tril(torch.ones(seq_len, seq_len))
attention = (Q @ K.transpose(-2, -1)) * mask
损失函数选择
回归任务推荐使用:
- 均方误差(MSE)
- 平均绝对误差(MAE)
- 对多步预测可时间加权
# 多步加权损失示例
weights = torch.linspace(1, 0.1, steps=pred_steps)
loss = (weights * (preds - targets)**2).mean()
关键设计建议
- 变量级掩码确保多变量预测时各变量独立处理
- 历史值填充技术提升训练稳定性
- 位置编码需适配时间序列特性
- 层归一化配置影响收敛速度