TimesNet代码阅读
TimesNet模型相对简单,其核心思想有两点:
- Inception模块的使用
- 采用FFT对于时间序列进行Reshape
要点速递
- Inception Module: 具有多个卷积核的模块,主要用于提取特征
- 初始化未来预测:在输入backbone之前,先使用MLP预测一个初步的结果,然后根据预测结果与原数据再使用backbone进行预测。作者仓库中就是使用了一个线性层,将seq_len的序列转化为seq_len + pred_len 长度的序列。
Inception Module
简要介绍
Inception模块是对于卷积层的组合与提升,相较于传统卷积神经网络每层仅使用一种卷积核,Inception选择使用多种卷积核同时引出 $1\times 1$大小的卷积核。该模块具有以下作用:
- Inception模块相较于单个卷积层,其内部具有多个大小的卷积核,可以提取更多非冗余的特征,其感知能力更强;
- $1\times 1$卷积核大大减少计算量的同时依旧保持特征捕捉能力,其本质为不同通道间的线性组合。
Inception由Google团队提出,具有多个版本(v1, v2, v3, v4)。于Going deeper with convolutions论文在2014年首次提出,并在ILSVRC-2014的图像分类竞赛中获得了top-5误差6.7%的冠军成绩。这里作者选用该模块就是为了验证图像处理模块在其提出的方法下是否有效。
模型架构
作者在该文章中使用Inception v1,但是其架构并非完全照搬,而是在一定程度上进行了改写:
6个卷积核,大小为 1, 3, 5, 7, 9, 11, 每个卷积核均进行padding操作以保证输入与输出张量长与宽大小相同,卷积核采用kaiming初始化方法,并将每个卷积核输出结果创建一个新的维度进行堆叠并对该维度求均值(mean pooling)。
模型主干
分类模型
数据嵌入
作者在本文章中使用了2种嵌入方法:数值嵌入(value_embedding), 位置嵌入(position_embedding)。数值嵌入:1D卷积操作;位置嵌入:旋转位置编码。计算出嵌入后加起来得到嵌入。
TimesBlock
输入$x\in \mathbb{R}^{B\times T\times N}$ , 首先经过FFT_for_Period获得每个通道的频谱图,返回前 k 个周期与选中频率在不同频道的强度均值。
然后根据选择的周期进行padding操作,并reshape为$\mathbb{R}^{B, T/P, P, N}$,其中P代表周期长度。
输出经过 Inception - GELU - Inception并将最终的结果裁剪回原长度
按照不同频率的强度进行加权求和得到 res 并与原输入 x 相加进行残差连接得到输出。
分类头
最终采用relu激活后,使用x_mark_enc进行遮掩(x_mark_enc用于确认哪些数据真实,哪些数据仅仅是填补)并输出到线性层得出最终分类结果。
预测模型
数据嵌入
相较于分类模型,数据嵌入加入了时间嵌入(Temporal_embedding),其时间嵌入为一个线性层,输入为每个时间节点所对应的年月日小时分,可以选择可训练或者不可训练。
初始化未来预测
在预测模型中,由于预测模型训练相对困难,所以常常使用MLP根据训练数据预测一个结果,然后根据预测结果与训练数据对TimesBlock进行训练。
归一化与逆归一化
序列数据为了避免数据漂移,所以需要进行归一化与逆归一化的操作。
异常检测与插值模型
这两个模型没有新概念,仅仅将之前的概念重复组合。
异常检测模型
相较于预测模型去掉了时间嵌入模块与初始化未来预测的部分
插值模型
相较于分类模型最后使用x_mark_enc进行遮掩,其遮掩发生在输入TimesNet之前(如果依旧采用分类模型的方法,最后插值的结果肯定为0)。且最后一层网络为映射头,将输出转化为与输入相同。
