【论文复现】基于深度学习的高效时序预测

在这里插入图片描述

📝个人主页🌹:Eternity._
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述
在这里插入图片描述

概述


2022年,清华大学软件学院的学者提出了Autoformer:用于长期时间序列预测的自相关分解Transformer延长预测时间是实际应用的关键需求,如极端天气预警和长期能耗规划。本文研究了时间序列的长期预测问题。先前的基于 Transformer 的模型采用各种自注意力机制来发现长期依赖关系。然而,长期未来复杂的时间模式禁止模型找到可靠的依赖关系。本文通过对Transformer进行改进,通过序列分解和全新的自相关机制对时序数据进行建模,在各种公开的数据集上达到了很好的效果
代码转载自 Autoformer

一、论文思路


为了解决长期未来复杂的时间模式,作者将Autoformer作为分解体系结构,通过设计内部分解模块,使深度预测模型具有内在的渐进分解能力。同时作者提出了一种在序列级别上具有依赖关系发现和信息聚合的自相关机制。我们的机制超出了以前的自注意力家族,可以同时提高计算效率和信息利用率。

本文所涉及的所有资源的获取方式:这里

二、论文模型


作者改进了经典的Transformer模型,包括内部序列分解块、自相关机制以及相应的编码器和解码器。
(1).作者首先通过原数据减去池化平均项,获得分解项备用
(2).编码器,待训练的原始时序数据经过自相关机制,时序分解模块,前馈神经网络以及再一次时序分解模块获得编码器的结果,其中,从输入到第一个时序分解和从第一个时序分解模块到最后一个有一个残差连接。
(3).解码器,将(1)中获得的分解项和(2)的输出结果一并输入到解码器中,解码器会经过两次自相关机制和时序分解,在第二次自相关中会接受来自编码器的输出和自身模型前一个阶段的输出同时作为输入。最后经过前馈网络和序列分解。其中每一个序列分解都会加入原始的序列数据作为残差连接。
在这里插入图片描述

三、实现方法


1.TimesDecomp
主要是对原始项进行池化得到池化项,在相减获得剩余项,由此进行序列分解

在这里插入图片描述
2Auto-Correlation
作者提出了具有串联连接的自相关机制来扩展信息利用率。自相关通过计算序列自相关来发现基于周期的依赖关系,并通过时间延迟聚合聚合相似的子序列。

在这里插入图片描述
类似Transformer 输入的数据经过Linear层变换得到Query,Key,Value.不同于attention机制,Q,K经过快速傅里叶变换后 K经过共轭操作和Q相乘后,经过傅里叶反变换,和V做 time delay agg 操作。
3.time delay agg操作基于所选时间延迟τ1,···,τk对序列进行滚动。该操作可以对齐在估计周期的同一相位位置相似的子序列,这与自我注意家族中的逐点点积聚合不同。最后,我们通过 softmax 归一化置信度聚合子序列。

在这里插入图片描述
4.前馈网络(FFN):与前向传播类似,包含多层感知机(MLP)和归一化层(LN)。
损失函数:L1 loss 和 L2 loss,或二者结合。

四 复现论文


在这里插入图片描述
论文中的结果显示该模型的效果非常好。

使用方式


代码结构


在这里插入图片描述
总程序入口在 run.py,运行之前注意请新建一个 data的文件夹,把需要训练的数据放进文件夹中:

在这里插入图片描述
相关的数据位于
Google Drive中。注意科学上网。

附件中也包含数据。
作者准备了相关脚本,直接运行即可一键训练,开箱即用
bash ./scripts/ETT_script/Autoformer_ETTm1.sh
bash ./scripts/ECL_script/Autoformer.sh
bash ./scripts/Exchange_script/Autoformer.sh
bash ./scripts/Traffic_script/Autoformer.sh
bash ./scripts/Weather_script/Autoformer.sh
bash ./scripts/ILI_script/Autoformer.sh
注意如果需要使用论文以外的数据,请保证数据是csv格式,且在 data_provider/data_loader.py 中进行类的改写
如果不想采用脚本,可以通过以下命令启动程序:

python -u run.py \
  --is_training 1 \ ##是否训练
  --root_path ./dataset/ETT-small/ \ 数据集类型
  --data_path ETTh1.csv \ ##数据文件
  --model_id ETTh1_96_24 \ ##模型id
  --model Autoformer \
  --data ETTh1 \ ##数据类型
  --features M \ ##数据特征维度
  --seq_len 96 \ ##输入长度
  --label_len 48 \ ##标签长度 该项不得高于 seq_len
  --pred_len 24 \  ##预测长度
  --e_layers 2 \  ## 编码器层数
  --d_layers 1 \  ## 解码器层数
  --factor 3 \ 
  --enc_in 7 \ ## 编码器特征维度
  --dec_in 7 \ ## 解码器特征维度
  --c_out 7 \ ##输出维度
  --des 'Exp' \
  --itr 1   ## 训练epochs

训练演示截图

在这里插入图片描述
训练结果,使用的ETTm2 数据集可以看到和论文中的数字相差不大

在这里插入图片描述

部署方式


Python 3.6, PyTorch 1.9.0. 相关库在requirements.txt中


编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!

更多内容详见:这里

### 如何复现Transformer模型及进行超参数调整 #### 复现Transformer模型的关键要素 为了成功复现Transformer模型,需理解其核心架构并按照标准实现方法构建。以下是几个重要方面: 1. **输入嵌入与位置编码** 输入序列通过词嵌入矩阵转换为向量表示,并加入位置编码以引入顺序信息[^1]。这一步对于捕捉序列中的相对距离至关重要。 2. **多头自注意力机制 (Multi-head Attention)** 自注意力模块允许模型关注不同部分的信息权重分布。具体而言,Q、K、V三个张量分别代表查询(Query)、键(Key)以及值(Value),它们经过线性变换后计算得到注意力分数。 3. **前馈神经网络 (Feed Forward Network)** 每个子层之后连接一个全连接前馈网络,该结构由两个线性变换组成,中间夹带ReLU激活函数。 4. **残差连接与标准化** 在每个子层应用残差连接(residual connection),随后执行Layer Normalization操作来稳定训练过程。 5. **解码器生成策略** 解码阶段采用自回归方式逐词预测目标序列,在每步仅暴露已知的部分给当前时间步处理。最终输出形状应匹配 `(batch_size, max_tgt_len, d_model)` 的形式。 #### 超参数调整建议 针对性能优化,合理设置以下几类超参数尤为重要: - **学习率调度** 使用预热(warm-up)策略配合逆平方根衰减(inverse square root decay)可以有效提升收敛速度和稳定性。 - **层数与隐藏单元数** 增加Encoder/Decoder堆叠层数或扩展内部维度可能提高表达能力,但也伴随更大计算开销;需要依据硬件资源权衡选取适当规模。 - **Dropout比率** 设置合适的dropout比例有助于缓解过拟合现象,通常推荐范围介于0.1至0.3之间。 - **批量大小(Batch Size)** 较大批次能更好地估计梯度方向从而加快更新频率,不过内存占用亦随之增长,实际取值视设备而定。 ```python import torch.nn as nn class PositionalEncoding(nn.Module): def __init__(self, d_model, dropout=0.1, max_len=5000): super(PositionalEncoding, self).__init__() pe = ... # 构造PE表 ... def scaled_dot_product_attention(q, k, v, mask=None): attn_scores = ... if mask is not None: ... return output, attention_weights class MultiHeadAttention(nn.Module): def __init__(self, embed_dim, num_heads, dropout=0.0): super(MultiHeadAttention, self).__init__() assert embed_dim % num_heads == 0 ... class TransformerBlock(nn.Module): def __init__(self, embed_dim, num_heads, ff_dim, rate=0.1): super(TransformerBlock, self).__init__() self.att = MultiHeadAttention(embed_dim, num_heads) self.ffn = nn.Sequential( nn.Linear(embed_dim, ff_dim), nn.ReLU(), nn.Linear(ff_dim, embed_dim)) self.layernorm1 = nn.LayerNorm(embed_dim, eps=1e-6) self.dropout1 = nn.Dropout(rate) class Encoder(nn.Module): def __init__(self, vocab_size, embed_dim, num_layers, heads, ff_dim, dropout_rate): super(Encoder, self).__init__() ... class Decoder(nn.Module): def __init__(self, vocab_size, embed_dim, num_layers, heads, ff_dim, dropout_rate): super(Decoder, self).__init__() ... ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值