前言:结合论文和代码介绍时间序列预测Autoformer模型
目录
文章信息
- 模型: Autoformer(Decomposition Transformers with Auto-Correlation )
- 关键词: 序列分解;自相关机制
- 作者:Haixu Wu, Jiehui Xu, Jianmin Wang, Mingsheng Long
- 机构:清华大学
- 发表情况:NeurIPS 2021
- 网址:Autoformer: Decomposition Transformers with Auto-Correlation for Long-Term Series Forecasting
一、针对的问题
Autoformer主要针对两个长时间序列预测问题来建模:
- 时域依赖关系的提取涉及复杂纠缠的各种时间模式
如果不做任何处理而,直接从长时间序列本身提取时域依赖是不可靠的,因为时间序列由复杂纠缠的各种时间模式组合而成。
时间模式是指随着时间推移而重复发生的一系列事件或行为,比如序列多种变化趋势(如上升、下降、波动等)
- 信息利用率和计算复杂度的平衡问题
自注意力机制过高的复杂度并不适合处理长时序,即便使用各种稀疏设计,也是逐点的注意力,难以在信息利用率和计算复杂度上平衡。
本文给出的解决方式是:时间序列分解技术+Auto-Correlation机制
使用时间序列分解技术,将时间序列不同的模式解纠缠,以获取更清晰、具备代表意义的序列;使用Auto-Correlation代替原有的Self-Attention(全局注意力机制、稀疏注意力机制等),利用FFT降低计算的复杂度,同时实现子序列之间时间依赖关系的提取。
二、网络结构
在介绍具体实现前,让我们先看一下Autoformer的整体网络结构。
从上图可以看到本文和Transformer一样是编码解码架构同时由Auto-Correlation、Series Decomp、Feed Forward三个模块组成每一层,同时使用残差结构。其中encoder层通过序列分解块(series decomposition block)消除长期趋势周期性部分,专注于周期性模式建模。decoder同样专注于周期性模式建模,最后输出是周期项和趋势项的和。
1. Decomposition Architecture
在预测过程中,模型逐步从隐变量中分离趋势项与周期项,实现渐进式分解。
Series decomposition block
- AvgPool是滑动平均
- Padding的作用是滑动平均之后,时间序列长度不变
- 总的计算过程记为 :
代码实现
class moving_avg(nn.Module):
"""
Moving average block to highlight the trend of time series
"""
def __init__(self, kernel_size, stride):
super(moving_avg, self).__init__()
self.kernel_size = kernel_size
self.avg = nn.AvgPool1d(kernel_size=kernel_size, stride=stride, padding=0) # 一维滑动平均
def forward(self, x):
# padding on the both ends of time series
front = x[:, 0:1, :].repeat(1, (self.kernel_size - 1) // 2, 1)
end = x[:, -1:, :].repeat(1, (self.kernel_size - 1) // 2, 1)
x = torch.cat([front, x, end], dim=1)
x = self.avg