机器学习论文浅读:TimesNet

TimesNet是一种新提出的时间序列模型,通过傅里叶变换将一维时间序列转化为二维数据,利用二维卷积和InceptionBlock进行特征提取。该模型在短期预测、长期预测、分类、异常检测和缺失值处理等任务上表现优越,有望成为时间序列任务的基础模型。

这是清华大学今年(2023年)刚出的一篇关于时间序列的论文TimesNet:https://openreview.net/pdf?id=ju_Uqw384Oq

 GitHub地址:GitHub - thuml/Time-Series-Library: A Library for Advanced Deep Time Series Models.

在论文的实验部分中,TimesNet在短期、长期预测、分类、异常检测以及缺失值处理这5个任务上都展现出了超越其他模型的效果,能够作为一个时间序列任务的通用基础模型(Foundation Model)。【Youth PhD Talk】ICLR 预讲会(三)_哔哩哔哩_bilibili 在B站上有论文一作的讲解,在差不多2:02:48那里。底下那个指路的评论就是我了。

接下来就从论文理解以及代码的角度来解释一下TimesNet。

一、时间序列的二维变化

和其他深度学习任务(图像以及自然语言处理)不同,尽管时间序列是连续记录的,然而每个时间点只记录了一些标量,语义信息不足,所以研究都集中在数据的时间变化上(temporal variation)。然而现实的时间序列数据,通常都是由各个有着不同周期的不同因素耦合在一起的,增加了建模难度。并且,时间点本身不仅受到本身缩在周期影响,相邻周期也会对这一周期的时间点产生影响。文中将这2种影响时间序列的变化分别称之为“期内变化”(intraperiod-variation)和“期间变化”(interperiod-variation)。为了将这2种变化区分开来,文中将一维的时间序列数据转换为了二维空间数据:

 其中,蓝色轴方向的店代表期间变化,可以看作是“不同周期,同一相位上时间点的数值”,而红色轴代表期内变化,即“统一周期上的不同时间点”。

这样做不仅将期间与期内变化分离了开来,同时二维数据还具有局部性(locality,如下图所示),使得一些用以作图像处理的方法也可以在这上面使用。

 

具体在实操时,使用傅里叶变换将时序转换到频域,观察前k个振幅的点,使用它们(频率)的倒数获得周期,以此确定不同周期用以作二维分解。

def FFT_for_Period(x, k=2):
    # [B, T, C]
    xf = torch.fft.rfft(x, dim=1)
    # find period by amplitudes
    frequency_list = abs(xf).mean(0).mean(-1) #展平
    frequency_list[0] = 0 #第0项代表周期正无穷,舍去
    _, top_list = torch.topk(frequency_list, k)#前k个振幅(能量)的点
    top_list = top_list.detach().cpu().numpy()
    period = x.shape[1] // top_list #周期
    return period, abs(xf).mean(-1)[:, top_list]#返回周期与振幅(权重)

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 模块的设计,有效地捕捉了时间序列中的局部趋势和周期性特征。其轻量级的结构和高效的性能使其成为时间序列预测任务中的一个强大工具。 ---
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值