TimeDART:基于扩散自回归Transformer 的自监督时间序列预测方法

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 近年来,深度神经网络成为时间序列预测的主流方法。自监督学习通过从未标记数据中学习,能够捕获时间序列的长期依赖和局部特征。TimeDART结合扩散模型和自回归建模,创新性地解决了时间序列预测中的关键挑战,在多个数据集上取得了最优性能,展示了强大的泛化能力。

近年来,随着机器学习技术的进步,深度神经网络已经成为解决时间序列预测问题的主流方法。这反映了学术界和工业界在利用先进技术处理序列数据复杂性方面的持续努力。

自监督学习概述

基本定义

自监督学习是一种创新的学习范式,其特点是模型能够从未标记数据中通过内部生成的监督信号进行学习,通常这种学习通过预文任务来实现。与传统的监督学习不同,自监督学习不需要外部标签,而是利用数据本身的内在结构来创建必要的学习信号。

在时间序列领域的应用

在时间序列分析领域,自监督学习展现出独特的优势。它使得模型能够:

  1. 未标记数据中学习通用表示
  2. 同时捕获数据中的长期依赖关系局部细节特征

然而,这种学习方式仍面临着显著的挑战,这也是为什么需要像TimeDART这样的创新方法。通过集成扩散和自回归建模,TimeDART旨在解决这些根本性的挑战。

现有方法的问题

时间序列预测面临两个主要挑战:

全局依赖关系捕获

需要有效理解和建模长期时间依赖;传统方法难以准确捕获序列中的全局模式

局部特征提取

需要精确捕获时间序列中的局部细节特征;现有方法在同时处理这两个任务时表现不佳

这些挑战严重影响了模型学习全面和富有表现力的时间序列数据表示的能力。

TimeDarT方法详解

TimeDART是一种专为时间序列预测设计的自监督学习方法。它的核心思想是通过从时间序列历史数据中学习模式来改进未来数据点的预测。研究者采用了一种创新的方法,将时间序列数据分解成更小的片段(patches),并将这些patches作为建模的基本单位

核心技术组件

  1. Transformer编码器设计:- 使用了具有自注意力机制的Transformer编码器- 专注于理解patches之间的依赖关系- 有效捕获数据的整体序列结构
  2. 扩散和去噪过程:- 实现了两个关键过程:扩散去噪- 通过向数据添加和移除噪声来捕获局部特征- 这是所有扩散模型中的典型过程- 提升了模型在详细模式上的表现

TimeDART架构详解

TimeDART架构图展示了模型如何:

  • 使用自回归生成捕获全局依赖关系
  • 通过去噪扩散模型处理局部结构
  • 在前向扩散过程中向输入patches引入噪声
  • 生成自监督信号
  • 通过自回归方式在反向过程中恢复原始序列

实例归一化和Patch嵌入

这一阶段包含几个关键步骤:

  1. 实例归一化:- 对输入的多变量时间序列数据进行标准化- 确保每个实例具有零均值单位标准差- 目的是保持最终预测的一致性
  2. 数据分割策略:- 将时间序列数据划分为patches而非单个点- 这种方法能够捕获更全面的局部信息
  3. 避免信息泄漏:- patch长度设置为等于stride(步长)- 确保每个patch包含原始序列的非重叠段- 防止训练过程中的信息泄漏

Transformer编码器中的Patch间依赖关系

在架构中,研究者实现了以下关键特性:

  1. 基于自注意力的处理:- 使用自注意力的Transformer编码器- 专门用于建模patches之间的依赖关系
  2. 全局依赖性捕获:- 通过考虑时间序列数据中不同patches之间的关系- 有效捕获全局序列依赖关系
  3. 表示学习:- Transformer编码器能够学习有意义的patch间表示- 这对于理解时间序列的高层结构至关重要
 classTransformerEncoderBlock(nn.Module):
     def__init__(
         self, d_model: int, num_heads: int, feedforward_dim: int, dropout: float
     ):
         super(TransformerEncoderBlock, self).__init__()

         self.attention=nn.MultiheadAttention(
             embed_dim=d_model, num_heads=num_heads, dropout=dropout, batch_first=True
         )
         self.norm1=nn.LayerNorm(d_model)
         self.ff=nn.Sequential(
             nn.Linear(d_model, feedforward_dim),
             nn.GELU(),
             nn.Dropout(dropout),
             nn.Linear(feedforward_dim, d_model),
         )
         self.conv1=nn.Conv1d(in_channels=d_model, out_channels=feedforward_dim, kernel_size=1)
         self.activation=nn.GELU()
         self.conv2=nn.Conv1d(in_channels=feedforward_dim, out_channels=d_model, kernel_size=1)
         self.norm2=nn.LayerNorm(d_model)
         self.dropout=nn.Dropout(dropout)

     defforward(self, x, mask):
         """
         :param x: [batch_size * num_features, seq_len, d_model]
         :param mask: [1, 1, seq_len, seq_len]
         :return: [batch_size * num_features, seq_len, d_model]
         """
         # Self-attention
         attn_output, _=self.attention(x, x, x, attn_mask=mask)
         x=self.norm1(x+self.dropout(attn_output))

         # Feed-forward network
         # y = self.dropout(self.activation(self.conv1(y.permute(0, 2, 1))))
         # ff_output = self.conv2(y).permute(0, 2, 1)
         ff_output=self.ff(x)
         output=self.norm2(x+self.dropout(ff_output))

         returnoutput

前向扩散过程

前向扩散过程的主要特点:

  1. 噪声应用:- 在输入patches上应用噪声- 生成自监督信号- 通过从带噪声版本重构原始数据来学习稳健的表示
  2. 模式识别:- 噪声帮助模型识别关注- 专注于时间序列数据中的内在模式
 classDiffusion(nn.Module):
     def__init__(
         self,
         time_steps: int,
         device: torch.device,
         scheduler: str="cosine",
     ):
         super(Diffusion, self).__init__()
         self.device=device
         self.time_steps=time_steps

         ifscheduler=="cosine":
             self.betas=self._cosine_beta_schedule().to(self.device)
         elifscheduler=="linear":
             self.betas=self._linear_beta_schedule().to(self.device)
         else:
             raiseValueError(f"Invalid scheduler: {scheduler=}")

         self.alpha=1-self.betas
         self.gamma=torch.cumprod(self.alpha, dim=0).to(self.device)

     def_cosine_beta_schedule(self, s=0.008):
         steps=self.time_steps+1
         x=torch.linspace(0, self.time_steps, steps)
         alphas_cumprod= (
             torch.cos(((x/self.time_steps) +s) / (1+s) *torch.pi*0.5) **2
         )
         alphas_cumprod=alphas_cumprod/alphas_cumprod[0]
         betas=1- (alphas_cumprod[1:] /alphas_cumprod[:-1])
         returntorch.clip(betas, 0, 0.999)

     def_linear_beta_schedule(self, beta_start=1e-4, beta_end=0.02):
         betas=torch.linspace(beta_start, beta_end, self.time_steps)
         returnbetas

     defsample_time_steps(self, shape):
         returntorch.randint(0, self.time_steps, shape, device=self.device)

     defnoise(self, x, t):
         noise=torch.randn_like(x)
         gamma_t=self.gamma[t].unsqueeze(-1)  # [batch_size * num_features, seq_len, 1]
         # x_t = sqrt(gamma_t) * x + sqrt(1 - gamma_t) * noise
         noisy_x=torch.sqrt(gamma_t) *x+torch.sqrt(1-gamma_t) *noise
         returnnoisy_x, noise

     defforward(self, x):
         # x: [batch_size * num_features, seq_len, patch_len]
         t=self.sample_time_steps(x.shape[:2])  # [batch_size * num_features, seq_len]
         noisy_x, noise=self.noise(x, t)
         returnnoisy_x, noise, t

基于交叉注意力的去噪解码器

该解码器具有以下特点:

  1. 核心功能:- 使用交叉注意力机制- 目的是重构原始的、无噪声的patches
  2. 优化设计:- 允许可调整的优化难度- 使自监督任务更有效- 使模型能够专注于捕获详细的patch内特征

解码器的工作机制:

  • 接收噪声(作为查询)和编码器的输出(键和值)
  • 使用掩码确保第j个噪声输入对应于Transformer编码器的第j个输出
 classTransformerDecoderBlock(nn.Module):
     def__init__(
         self, d_model: int, num_heads: int, feedforward_dim: int, dropout: float
     ):
         super(TransformerDecoderBlock, self).__init__()

         self.self_attention=nn.MultiheadAttention(
             embed_dim=d_model, num_heads=num_heads, dropout=dropout, batch_first=True
         )
         self.norm1=nn.LayerNorm(d_model)
         self.encoder_attention=nn.MultiheadAttention(
             embed_dim=d_model, num_heads=num_heads, dropout=dropout, batch_first=True
         )
         self.norm2=nn.LayerNorm(d_model)
         self.ff=nn.Sequential(
             nn.Linear(d_model, feedforward_dim),
             nn.ReLU(),
             nn.Dropout(dropout),
             nn.Linear(feedforward_dim, d_model),
         )
         self.norm3=nn.LayerNorm(d_model)
         self.dropout=nn.Dropout(dropout)

     defforward(self, query, key, value, tgt_mask, src_mask):
         """
         :param query: [batch_size * num_features, seq_len, d_model]
         :param key: [batch_size * num_features, seq_len, d_model]
         :param value: [batch_size * num_features, seq_len, d_model]
         :param mask: [1, 1, seq_len, seq_len]
         :return: [batch_size * num_features, seq_len, d_model]
         """
         # Self-attention
         attn_output, _=self.self_attention(query, query, query, attn_mask=tgt_mask)
         query=self.norm1(query+self.dropout(attn_output))

         # Encoder attention
         attn_output, _=self.encoder_attention(query, key, value, attn_mask=src_mask)
         query=self.norm2(query+self.dropout(attn_output))

         # Feed-forward network
         ff_output=self.ff(query)
         x=self.norm3(query+self.dropout(ff_output))

         returnx

用于全局依赖关系的自回归生成

自回归生成的主要职责:

  1. 高层依赖捕获:- 捕获时间序列中的高层全局依赖关系- 通过自回归方式恢复原始序列- 使模型能够理解整体时间模式依赖关系- 显著提升预测能力
 classDenoisingPatchDecoder(nn.Module):
     def__init__(
         self,
         d_model: int,
         num_heads: int,
         num_layers: int,
         feedforward_dim: int,
         dropout: float,
     ):
         super(DenoisingPatchDecoder, self).__init__()

         self.layers=nn.ModuleList(
             [
                 TransformerDecoderBlock(d_model, num_heads, feedforward_dim, dropout)
                 for_inrange(num_layers)
             ]
         )
         self.norm=nn.LayerNorm(d_model)

     defforward(self, query, key, value, is_tgt_mask=True, is_src_mask=True):
         seq_len=query.size(1)
         tgt_mask= (
             generate_self_only_mask(seq_len).to(query.device) ifis_tgt_maskelseNone
         )
         src_mask= (
             generate_self_only_mask(seq_len).to(query.device) ifis_src_maskelseNone
         )
         forlayerinself.layers:
             query=layer(query, key, value, tgt_mask, src_mask)
         x=self.norm(query)
         returnx


 classForecastingHead(nn.Module):
     def__init__(
         self,
         seq_len: int,
         d_model: int,
         pred_len: int,
         dropout: float,
     ):
         super(ForecastingHead, self).__init__()
         self.pred_len=pred_len
         self.flatten=nn.Flatten(start_dim=-2)
         self.forecast_head=nn.Linear(seq_len*d_model, pred_len)
         self.dropout=nn.Dropout(dropout)

     defforward(self, x: torch.Tensor) ->torch.Tensor:
         """
         :param x: [batch_size, num_features, seq_len, d_model]
         :return: [batch_size, pred_len, num_features]
         """
         x=self.flatten(x)  # (batch_size, num_features, seq_len * d_model)
         x=self.forecast_head(x)  # (batch_size, num_features, pred_len)
         x=self.dropout(x)  # (batch_size, num_features, pred_len)
         x=x.permute(0, 2, 1)  # (batch_size, pred_len, num_features)
         returnx

优化和微调

优化过程的关键特点:

  1. 自回归优化:- 整个模型以自回归方式进行优化- 获得可以针对特定预测任务进行微调可迁移表示
  2. 表示特性:- 确保模型学习的表示既全面适应性强- 能够适应各种下游应用- 在时间序列预测中实现卓越性能

实验评估

数据集介绍

实验使用了八个广泛使用的数据集:

  1. ETT数据集系列:- ETTh1、ETTh2、ETTm1、ETTm2四个子集- 代表能源领域的时间序列数据
  2. 其他领域数据集:- Weather数据集- Exchange数据集- Electricity数据集- Traffic数据集

这些数据集涵盖了多个应用场景,包括电力系统、交通网络和天气预测等领域。

实验结果分析

表1展示了TimeDART与现有方法的对比结果:

  • 与最先进的自监督方法和监督方法进行比较
  • 最佳结果用粗体标示
  • 第二好的结果带有下划线
  • "#1 Counts"表示该方法达到最佳结果的次数

表2显示了TimeDART在不同设置下的性能:

  • 展示了在五个数据集上预训练并在特定数据集上微调的结果
  • 所有结果都是从4个不同预测窗口{96, 192, 336, 720}中平均得出
  • 最好的结果用粗体标示

消融研究结果:

  • 所有结果都是从4个不同预测窗口{96, 192, 336, 720}中平均得出
  • 最好的结果用粗体标示

超参数敏感性分析

前向过程参数

  • 噪声步数T的影响:- 测试了{750, 1000, 1250}三个设置- 发现噪声步数对预训练难度影响不大- 所有设置都优于随机初始化
  • 噪声调度器的选择:- 余弦调度器显著优于线性调度器- 某些情况下,线性调度器甚至导致性能低于随机初始化- 证实了平滑噪声添加的重要性

去噪patch解码器层数

  • 测试了{0, 1, 2, 3}层配置
  • 单层解码器通常提供最佳的模型复杂度和准确性平衡
  • 过多的层数可能导致表示网络的训练不足

patch长度的影响

  • 测试了{1, 2, 4, 8, 16}不同长度
  • 最佳patch长度取决于数据集特征
  • 较大的patch长度可能更适合具有高冗余性的数据集

总结

TimeDART通过创新性地结合扩散模型和自回归建模,成功解决了时间序列预测中的关键挑战:

  1. 技术创新:- 首次将扩散和自回归建模统一到单一框架- 设计了灵活的交叉注意力去噪网络
  2. 性能提升:- 在多个数据集上实现了最优性能- 展示了强大的域内和跨域泛化能力
  3. 实际意义:- 为时间序列预测提供了新的研究方向- 为实际应用提供了更可靠的预测工具

TimeDART的成功表明,结合不同的生成方法可以有效提升时间序列预测的性能,为该领域的进一步研究提供了新的思路。

论文地址:

https://avoid.overfit.cn/post/71857d3fd2ff434981138466f18a32d6

目录
相关文章
|
人工智能
【Mixup】探索数据增强技术:深入了解Mixup操作
【Mixup】探索数据增强技术:深入了解Mixup操作
1185 0
|
编解码 人工智能 运维
南加大提出全新通用时间序列基础模型TimeDiT!基于扩散模型创新物理约束机制
 【10月更文挑战第10天】南加大提出TimeDiT模型,创新融合扩散模型与Transformer架构,针对真实世界时间序列数据的复杂性,如多分辨率、缺失值等问题,提供高效解决方案。该模型通过新颖的掩码机制和无微调编辑策略,实现多任务处理及物理知识集成,显著提升预测和异常检测的准确性和鲁棒性。
366 3
|
机器学习/深度学习 自然语言处理 PyTorch
LLM-Mixer: 融合多尺度时间序列分解与预训练模型,可以精准捕捉短期波动与长期趋势
近年来,大型语言模型(LLMs)在自然语言处理领域取得显著进展,研究人员开始探索将其应用于时间序列预测。Jin等人提出了LLM-Mixer框架,通过多尺度时间序列分解和预训练的LLMs,有效捕捉时间序列数据中的短期波动和长期趋势,提高了预测精度。实验结果显示,LLM-Mixer在多个基准数据集上优于现有方法,展示了其在时间序列预测任务中的巨大潜力。
329 3
LLM-Mixer: 融合多尺度时间序列分解与预训练模型,可以精准捕捉短期波动与长期趋势
|
7月前
|
存储 人工智能 缓存
DeepSeek 3FS解读与源码分析(1):高效训练之道
本文从设计文档和源码,深入对 3FS 在文件系统和 AI workload 方面做一系列的解读。如有错误欢迎指正。
|
1月前
|
机器学习/深度学习 传感器 数据采集
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
273 0
|
机器学习/深度学习 编解码 测试技术
TimeMOE: 使用稀疏模型实现更大更好的时间序列预测
TimeMOE是一种新型的时间序列预测基础模型,通过稀疏混合专家(MOE)设计,在提高模型能力的同时降低了计算成本。它可以在多种时间尺度上进行预测,并且经过大规模预训练,具备出色的泛化能力。TimeMOE不仅在准确性上超越了现有模型,还在计算效率和灵活性方面表现出色,适用于各种预测任务。该模型已扩展至数十亿参数,展现了时间序列领域的缩放定律。研究结果显示,TimeMOE在多个基准测试中显著优于其他模型,特别是在零样本学习场景下。
1390 64
|
人工智能 API 决策智能
智胜未来:国内大模型+Agent应用案例精选,以及主流Agent框架开源项目推荐
【7月更文挑战第8天】智胜未来:国内大模型+Agent应用案例精选,以及主流Agent框架开源项目推荐
15831 134
智胜未来:国内大模型+Agent应用案例精选,以及主流Agent框架开源项目推荐
|
11月前
|
机器学习/深度学习 监控
在进行多任务学习时,确保模型不会过度拟合单一任务而忽视其他任务
多任务学习(MTL)中,为避免模型过度拟合单一任务,可采取任务权重平衡、损失函数设计、正则化、早停法、交叉验证、任务无关特征学习、模型架构选择、数据增强、任务特定组件、梯度归一化、模型集成、任务选择性训练、性能监控、超参数调整、多任务学习策略、领域适应性和模型解释性分析等策略,以提高模型泛化能力和整体表现。