论文解读 ——TimesNet 模型

部署运行你感兴趣的模型镜像

论文解读 ——TimesNet 模型

论文一:TEMPORAL 2D-VARIATION MODELING
FOR GENERAL TIME SERIES ANALYSIS
论文:

https://openreview.net/pdf?id=ju_Uqw384Oqtu

文章解读

本文是2023年2月ICLR发表出来的一篇关于深度学习的预测模型,该模型围绕时序变化建模展开,设计提出了时序基础模型TimesNet,在长时、短时预测、缺失值填补、异常检测、分类五大任务上实现了全面领先。(这点就比较夸张了,看图)
在里插入图片描述
粉色部分代表TimesNet模型在5大领域均处于领先水平。

理论部分

先看图
FFT
这张图表示 利用傅里叶变换(FFT)求时序序列周期,然后按照求得的不同周期进行分解(下面简单讲解一下)
在这里插入图片描述
这张图中可以看出,一个线性序列可以转换成两个正弦函数,然后分别求这俩正弦函数的周期和幅度,一个2Hz,一个3Hz。
对于任意一个序列,利用FFT将其转换为多组三角函数的组合,然后求出所有三角函数的周期的最小共倍数。
在这里插入图片描述
如上图所示,将其按照不同的频率进行切割,这样就将一维时序序列边成了多张二维张量。
在这里插入图片描述
这里呢,有一个比较巧妙的设计,就是整个模型的运算过程中,其实是一维变成二维,再又二维又变成一维的过程,但是中间保留了周期内及周期间的特征。如下图为整体模型部分:
在这里插入图片描述
整个模型和nbeats 长得很像。该模型也是有一个一个的timesblock 模块构成。

公式推导

在这里插入图片描述
公式(1)FFT(.)代表求对应序列的频率f (f的取值范围由1到2/T), Amp (.) 表示求频率对应的周期幅度p,Avg(.)文中表示说是(which is averaged from C dimensions by Avg(·) )我理解的意思是说,首先对应C组(多组时序序列),每组时序序列都可用FFT求出一组对应的pi(周期幅度)出来。这里的平均值,不是说所有的相加求平均,而是求多组序列里面的共同周期幅度(均有的)(也包括最小公倍数的形式)
在这里插入图片描述
公式二表示确定的频率和对应的周期长度
在这里插入图片描述
公式三中 pi fi 表示二维张量的行数和列数
在这里插入图片描述
如上图所示,TimesNet由堆叠的TimesBlock组成。输入序列首先经过嵌入层得到深度特征。
在这里插入图片描述
(1)一维变换至二维:首先对输入的一维时序特征提取周期,并将之转换成为二维张量来表示二维时序变化。
(2)提取二维时序变化表征:对于二维张量,由于其具有二维局部性,因此,我们可以使用2D卷积提取信息。在这里,我们选取了经典的Inception模型。

https://arxiv.org/pdf/1512.00567v3.pdf
在这里插入图片描述
inception v1网络
(3)二维变换至一维:对于提取的时序特征,我们将其转化回一维空间以便进行信息聚合。这里选择的是Adaptive aggregation,我们将得到的一维表征以其对应频率的强度进行加权求和,得到最终输出。
https://arxiv.org/pdf/2106.13008.pdf
在这里插入图片描述

实验部分

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

TimesNet 是一种专门用于时间序列预测的深度学习模型,其设计目标是通过高效的卷积操作来捕捉时间序列中的局部趋势和周期性特征。该模型在多个时间序列预测任务中表现优异,尤其是在处理长期依赖和多尺度特征方面具有显著优势。 ### 技术原理 TimesNet 的核心思想是通过多尺度卷积操作来提取时间序列的不同周期性特征。它采用了一种称为 **Inception 模块** 的结构,类似于 Google 的 Inception 网络,但在时间维度上进行了优化。具体来说,TimesNet 使用多个不同大小的卷积核(如 1×3, 1×5, 1×7)并行地对输入的时间序列进行卷积操作,从而提取不同尺度的局部特征。这些特征随后被拼接在一起,并通过一个 1×1 的卷积层进行降维,以减少计算复杂度并增强模型的表达能力。 #### 模型结构 TimesNet 的基本模块包括以下几个关键组件: 1. **多尺度卷积(Multi-scale Convolution)** - 使用多个不同大小的卷积核对输入序列进行卷积操作,捕捉不同时间尺度下的局部趋势。 - 例如,3 个不同大小的卷积核可以分别提取短期、中期和长期的时间模式。 2. **Inception 模块** - 将多个卷积核的输出拼接在一起,形成一个包含多尺度信息的特征向量。 - 然后通过一个 1×1 的卷积层进行通道间的特征融合,降低特征维度。 3. **时间序列嵌入(Temporal Embedding)** - 为了保留时间序列的顺序信息,TimesNet 引入了时间位置编码(Positional Encoding),确保模型能够感知时间的先后顺序。 4. **堆叠式结构(Stacked Architecture)** - 多个 Inception 模块可以堆叠在一起,形成更深的网络结构,从而逐步提取更复杂的特征。 #### 输入输出 - **输入**:形状为 `[batch_size, sequence_length, num_features]` 的三维张量,其中 `sequence_length` 是时间步长,`num_features` 是每个时间步的特征数量。 - **输出**:预测的未来时间步的数值,通常是一个形状为 `[batch_size, prediction_length]` 的二维张量。 ### 技术实现 在 PyTorch 中,TimesNet 的核心模块可以如下实现: ```python import torch import torch.nn as nn class InceptionBlock(nn.Module): def __init__(self, in_channels, out_channels, kernel_sizes=[3, 5, 7]): super(InceptionBlock, self).__init__() self.conv1 = nn.Conv1d(in_channels, out_channels, kernel_size=kernel_sizes[0], padding=kernel_sizes[0]//2) self.conv2 = nn.Conv1d(in_channels, out_channels, kernel_size=kernel_sizes[1], padding=kernel_sizes[1]//2) self.conv3 = nn.Conv1d(in_channels, out_channels, kernel_size=kernel_sizes[2], padding=kernel_sizes[2]//2) self.conv1x1 = nn.Conv1d(out_channels * 3, out_channels, kernel_size=1) def forward(self, x): # x shape: [batch_size, in_channels, sequence_length] branch1 = self.conv1(x) branch2 = self.conv2(x) branch3 = self.conv3(x) concat_branches = torch.cat([branch1, branch2, branch3], dim=1) out = self.conv1x1(concat_branches) return out class TimesNet(nn.Module): def __init__(self, num_features, hidden_size, num_layers, prediction_length): super(TimesNet, self).__init__() self.embedding = nn.Linear(num_features, hidden_size) self.inception_blocks = nn.ModuleList([ InceptionBlock(hidden_size, hidden_size) for _ in range(num_layers) ]) self.final_layer = nn.Linear(hidden_size * prediction_length, prediction_length) def forward(self, x): # x shape: [batch_size, sequence_length, num_features] batch_size, seq_len, num_features = x.shape x = self.embedding(x) # [batch_size, seq_len, hidden_size] x = x.permute(0, 2, 1) # [batch_size, hidden_size, seq_len] for block in self.inception_blocks: x = block(x) x = x.view(batch_size, -1) out = self.final_layer(x) # [batch_size, prediction_length] return out ``` ### 模型优势 - **高效性**:由于采用了轻量级的卷积操作,TimesNet 在处理长序列时比传统的 Transformer 模型更高效。 - **多尺度建模**:通过不同大小的卷积核,模型能够同时捕捉短期和长期的时间依赖关系。 - **可扩展性**:模型结构简单,易于扩展和调整,适合不同的时间序列预测任务。 - **应用场景**: - 金融时间序列预测(如股票价格) - 气象预测 - 能源消耗预测 - 智能制造中的设备状态预测 ### 总结 TimesNet 通过多尺度卷积和 Inception 模块的设计,有效地捕捉了时间序列中的局部趋势和周期性特征。其轻量级的结构和高效的性能使其成为时间序列预测任务中的一个强大工具。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值