远程项目调试-informer2020

informer2020

     Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting(原文)

Informer 是一个基于Transformer的模型,是为了应对长依赖关系而开发的。本文的主要主题是序列预测。序列预测可以在任何具有不断变化的数据的地方找到,例如股票市场等。尽管人工智能在大多数现实世界应用中都至关重要,但这并不容易;事实上,它需要一个具有高预测能力的稳健模型,可以捕捉长期依赖关系
在这里插入图片描述

图 1. (a) LSTF 可以覆盖比短序列预测更长的时间段,这对政策规划和投资保护至关重要。 (b) 现有方法的预测能力限制了 LSTF 的性能。 例如,从长度 = 48 开始,MSE 上升到不可接受的高水平,推理速度迅速下降
Transformer被认为是深度学习时代的革命性技术,它使预测更加可靠和准确。然而,Transformer 也存在一些问题,导致它们无法直接应用于长序列时间序列预测 (LSTF),例如二次时间复杂度、高内存使用率以及编码器-解码器架构的固有限制。这导致开发一种基于 Transformer 的高效模型,称为Informer。在本文中,我将详细展示此 Informer 所取得的进展。 ## Transformer

首先,让我对 Transformers 做一个总结,以防你不了解它。(对于那些熟悉 Transformers 的人,你可以跳过本节)

Transformer 是一种新兴的深度学习模型,其出现的频率正在不断上升。它们采用了自注意力机制,在 NLP 和计算机视觉等具有挑战性的任务中表现出了模型性能的显著提升。Transformer 架构可以分为两个部分,即编码器和解码器,如下图 :<ce

图 2. Transformer 架构

Transformer 的重点在于其不受局部性限制;也就是说,与其他流行模型(如 CNN)相比,Transformer 不受局部性限制。此外,我们没有在 Transformer 中提出任何 CNN 架构;相反,我们在 Transformer 中使用基于注意力机制的结构,这使我们能够获得更好的结果。

注意力机制架构可以概括为图 3:
在这里插入图片描述

图 3.(左)缩放点积注意力机制。(右)多头注意力机制由多个并行运行的注意力层组成
Scaled Dot-Product Attention 的函数为 Eq. 1

在这里插入图片描述

式1

Q(查询)、K(键)和V(向量)是我们注意力的输入。

有关 transformer 的完整基本实现,可以查阅相关论文。下面开始介绍informer

Informer 架构

ProbSparse自注意力机制:
在这个通知器中,我们不使用公式 1,而是使用公式 2,让每个键只关注u 个主要查询:
在这里插入图片描述

式2

在这里插入图片描述

式3
## Informer 架构

编码器:在内存使用限制下处理较长的序列输入

编码器的设计方式是提取长序列输入的鲁棒长程依赖关系。图 4 显示了编码器的示意架构:
在这里插入图片描述

图 4. Informer 编码器中的单个堆栈。(1)水平堆栈代表图 5 中的单个编码器副本。(2)所示的堆栈是接收整个输入序列的主堆栈。然后,第二个堆栈取输入的一半切片,后续堆栈重复(3)红色层是点积矩阵,它们通过在每一层上应用自注意力提取来实现级联减少。(4)将所有堆栈的特征图连接起来作为编码器的输出
``由于ProbSparse自注意力机制的存在,编码器的特征图上出现了额外的V值组合。蒸馏操作用于对具有主导特征的优秀组合进行评分,并在下一层构建集中的自注意力特征图。

从图4可以看出,该结构由多个Attention块、Conv1d和MaxPooling层组成,用于对输入数据进行编码。通过将输入分成两半来构建主堆栈的副本,​​可以提高蒸馏操作的可靠性。此外,自注意力蒸馏层的数量不断减少。在编码器的末端,研究人员连接了Feature Map,将编码器的输出引导至解码器

class ConvLayer(nn.Module):def __init__(self, c_in):super(ConvLayer, self).__init__()padding = 1 if torch.__version__>='1.5.0' else 2self.downConv = nn.Conv1d(in_channels=c_in,out_channels=c_in,kernel_size=3,padding=padding,padding_mode='circular')self.norm = nn.BatchNorm1d(c_in)self.activation = nn.ELU()self.maxPool = nn.MaxPool1d(kernel_size=3, stride=2, padding=1)def forward(self, x):x = self.downConv(x.permute(0, 2, 1))x = self.norm(x)x = self.activation(x)x = self.maxPool(x)x = x.transpose(1,2)return xclass EncoderLayer(nn.Module):def __init__(self, attention, d_model, d_ff=None, dropout=0.1, activation="relu"):super(EncoderLayer, self).__init__()d_ff = d_ff or 4*d_modelself.attention = attentionself.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1)self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1)self.norm1 = nn.LayerNorm(d_model)self.norm2 = nn.LayerNorm(d_model)self.dropout = nn.Dropout(dropout)self.activation = F.relu if activation == "relu" else F.geludef forward(self, x, attn_mask=None):new_x, attn = self.attention(x, x, x,attn_mask = attn_mask)x = x + self.dropout(new_x)y = x = self.norm1(x)y = self.dropout(self.activation(self.conv1(y.transpose(-1,1))))y = self.dropout(self.conv2(y).transpose(-1,1))return self.norm2(x+y), attnclass Encoder(nn.Module):def __init__(self, attn_layers, conv_layers=None, norm_layer=None):super(Encoder, self).__init__()self.attn_layers = nn.ModuleList(attn_layers)self.conv_layers = nn.ModuleList(conv_layers) if conv_layers is not None else Noneself.norm = norm_layerdef forward(self, x, attn_mask=None):# x [B, L, D]attns = []if self.conv_layers is not None:for attn_layer, conv_layer in zip(self.attn_layers, self.conv_layers):x, attn = attn_layer(x, attn_mask=attn_mask)x = conv_layer(x)attns.append(attn)x, attn = self.attn_layers[-1](x, attn_mask=attn_mask)attns.append(attn)else:for attn_layer in self.attn_layers:x, attn = attn_layer(x, attn_mask=attn_mask)attns.append(attn)if self.norm is not None:x = self.norm(x)return x, attnsclass EncoderStack(nn.Module):def __init__(self, encoders, inp_lens):super(EncoderStack, self).__init__()self.encoders = nn.ModuleList(encoders)self.inp_lens = inp_lensdef forward(self, x, attn_mask=None):# x [B, L, D]x_stack = []; attns = []for i_len, encoder in zip(self.inp_lens, self.encoders):inp_len = x.shape[1]//(2**i_len)x_s, attn = encoder(x[:, -inp_len:, :])x_stack.append(x_s); attns.append(attn)x_stack = torch.cat(x_stack, -2)return x_stack,attns

Informer 架构

解码器:通过一个前向过程生成长序列输出

解码器结构并不复杂;它是标准解码器结构。它包括两个相同的多头注意力层的堆栈。但是,生成推理的提出是为了缓解长预测中的速度下降,如图 5 所示:
在这里插入图片描述

图 5. Informer 模型概览。左图:编码器接收大量长序列输入(绿色系列)。我们用提出的ProbSparse注意力机制取代了规范的自注意力机制。蓝色梯形是自注意力提炼操作,用于提取主导注意力,从而大幅减小网络规模。层堆叠副本可提高鲁棒性。右图:解码器接收长序列输入,将目标元素填充为零,测量特征图的加权注意力组成,并立即以生成式预测输出元素(橙色系列)
解码器的馈送方式是通过获得以下方程(等式 4):

在这里插入图片描述

式4
我们不采用特定的标志作为标记,而是在输入序列中采样一个长度为 L(token) 的序列,就像输出序列之前的早期切片一样。
class DecoderLayer(nn.Module):def __init__(self, self_attention, cross_attention, d_model, d_ff=None,dropout=0.1, activation="relu"):super(DecoderLayer, self).__init__()d_ff = d_ff or 4*d_modelself.self_attention = self_attentionself.cross_attention = cross_attentionself.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1)self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1)self.norm1 = nn.LayerNorm(d_model)self.norm2 = nn.LayerNorm(d_model)self.norm3 = nn.LayerNorm(d_model)self.dropout = nn.Dropout(dropout)self.activation = F.relu if activation == "relu" else F.geludef forward(self, x, cross, x_mask=None, cross_mask=None):x = x + self.dropout(self.self_attention(x, x, x,attn_mask=x_mask)[0])x = self.norm1(x)x = x + self.dropout(self.cross_attention(x, cross, cross,attn_mask=cross_mask)[0])y = x = self.norm2(x)y = self.dropout(self.activation(self.conv1(y.transpose(-1,1))))y = self.dropout(self.conv2(y).transpose(-1,1))return self.norm3(x+y)class Decoder(nn.Module):def __init__(self, layers, norm_layer=None):super(Decoder, self).__init__()self.layers = nn.ModuleList(layers)self.norm = norm_layerdef forward(self, x, cross, x_mask=None, cross_mask=None):for layer in self.layers:x = layer(x, cross, x_mask=x_mask, cross_mask=cross_mask)if self.norm is not None:x = self.norm(x)return x

接下来是代码调试过程

主要就是安装环境,数据集,如果数据集不是用项目提供的数据集,可能还要经过一些处理,最好是处理成跟提供的数据集类似的,这样是最快的,当然也可以改代码来适应自己的数据集
还有就是当自己的数据集出现效果不好,指标差的情况,可以调整参数,多次训练。可以改变三个重要的长度参数:延长输入长度(48、96、168、240、336、480、624、720)、编码器输入长度(78、96、168、240、480、624、720)和编码器输入长度(96、168、240、336、480、720)
还有就是学习率和batch_size的调整。

运行方法

首先使用git命名将项目下载到本地
命令为git clone:
git clone https://github.com/zhouhaoyi/Informer2020.git
后面这个连接地址取得的方法:搜索Informer2020,点code,复制出现的链接,右边有复制按钮
然后cd Informer2020, cd是进入该目录,使用git clone命令会将项目下载到 Informer2020目录。
接下来需要创建虚拟环境,我使用的是conda来创建虚拟环境,命令为:
conda create -n informer python=3.8,然后输入y,虚拟环境即可创建完成。
infomer可以进行更改,是该虚拟环境的名称
然后激活该环境:conda activate informer
接下来要安装依赖,可以使用命令pip install -r requirements.txt,等待安装完成即可
在搭建好环境后,需要下载数据集,也可以使用自己的数据集,不过可能需要更改一些代码。
原文使用的数据集为ETT数据集,下载了数据集后,新建一个datasets目录,复制到该目录。
然后可以用vscode打开Informer2020目录,使用以下命令运行该项目:

# ETTh1
python -u main_informer.py --model informer --data ETTh1 --attn prob --freq h# ETTh2
python -u main_informer.py --model informer --data ETTh2 --attn prob --freq h# ETTm1
python -u main_informer.py --model informer --data ETTm1 --attn prob --freq t

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——管理本地用户和组(详细介绍了Linux中用户和组的概念及用法)

目录 一、用户和组概念 &#xff08;一&#xff09;、用户的概念 &#xff08;二&#xff09;、组的概念 补充组 主要组 二、获取超级用户访问权限 &#xff08;一&#xff09;、su 命令和su -命令 &#xff08; 二&#xff09;、sudo命令 三、管理本地用户账户 &…

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH?

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 目录 ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/61780…

Transformer自然语言处理实战pdf阅读

一.第一章 欢迎来到transformer的世界 1.解码器-编码器框架 在Transformer出现之前&#xff0c;NLP的最新技术是LSTM等循环架构。这些架 构通过在神经网络连接使用反馈循环&#xff0c;允许信息从一步传播到另一 步&#xff0c;使其成为对文本等序列数据进行建模的理想选择。如…

多模态大模型应用中的Q-Former是什么?

多模态大模型应用中的Q-Former是什么&#xff1f; Q-Former是一种新型的神经网络架构&#xff0c;专注于通过查询&#xff08;Query&#xff09;机制来改进信息检索和表示学习。在这篇博客中&#xff0c;我们将详细探讨Q-Former的工作原理、应用场景&#xff0c;并在必要时通过…

pyqt designer使用spliter

1、在designer界面需要使用spliter需要父界面不使用布局&#xff0c;减需要分割两个模块选中&#xff0c;再点击spliter分割 2、在分割后&#xff0c;再对父界面进行布局设置 3、对于两边需要不等比列放置的&#xff0c;需要套一层 group box在最外层进行分割

大数据学习之Flink基础

Flink基础 1、系统时间与时间时间 系统时间&#xff08;处理时间&#xff09; 在Sparksreaming的任务计算时&#xff0c;使用的是系统时间。 假设所用窗口为滚动窗口&#xff0c;大小为5分钟。那么每五分钟&#xff0c;都会对接收的数据进行提交任务. 但是&#xff0c;这里有…

GoogleCTF2023 Writeup

GoogleCTF2023 Writeup Misc NPC Crypto LEAST COMMON GENOMINATOR? Web UNDER-CONSTRUCTION NPC A friend handed me this map and told me that it will lead me to the flag. It is confusing me and I don’t know how to read it, can you help me out? Attach…

VSCode切换默认终端

我的VSCode默认终端为PowerShell&#xff0c;每次新建都会自动打开PowerShell。但是我想让每次都变为cmd&#xff0c;也就是Command Prompt 更改默认终端的操作方法如下&#xff1a; 键盘调出命令面板&#xff08;CtrlShiftP&#xff09;中,输入Terminal: Select Default Prof…

Java 中的Stream流

Stream流就像工厂中的流水线操作。 如何使用Stream&#xff1f; 1、首先要获取Stream流&#xff0c;那么如何获取呢? 对于不同的数据&#xff0c;有不同的获取方法。 ①单列集合 方法名说明default Stream<E> stream()Collection接口中的默认方法 所以实现了Colle…

Multi Range Read与Covering Index是如何优化回表的?

上篇文章末尾我们提出一个问题&#xff1a;有没有什么办法可以尽量避免回表或让回表的开销变小呢&#xff1f; 本篇文章围绕这个问题提出解决方案&#xff0c;一起来看看MySQL是如何优化的 回表 为什么会发生回表&#xff1f; 因为使用的索引并没有整条记录的所有信息&…

DataEase一键部署:轻松搭建数据可视化平台

DataEase是一个开源的数据可视化和分析工具&#xff0c;旨在帮助用户轻松创建和共享数据仪表盘。它支持多种数据源&#xff0c;包括关系型数据库&#xff0c;文件数据源&#xff0c;NoSQL数据库等&#xff0c;提供强大的数据查询、处理和可视化功能。DataEase 不仅是一款数据可…

VMware虚拟机中CentOS7自定义ip地址并且固定ip

配置固定ip(虚拟机) 前提&#xff1a;虚拟机网络配置成&#xff0c;自定义网络并选择VMnet8(NAT 模式) 操作(如下图)&#xff1a;点击虚拟机–》设置–》–》硬件–》网络适配器–》自定义&#xff1a;特定虚拟网络–》选择&#xff1a;VMnet8(NAT 模式) 虚拟机网络设置 需要记…

【漏洞复现】Jenkins CLI 接口任意文件读取漏洞(CVE-2024-23897)

漏洞简介 Jenkins是一款基于JAVA开发的开源自动化服务器。 Jenkins使用args4j来解析命令行输入&#xff0c;并支持通过HTTP、WebSocket等协议远程传入命令行参数。在args4j中&#xff0c;用户可以通过字符来加载任意文件&#xff0c;这导致攻击者可以通过该特性来读取服务器上…

论文快过(图像配准|Coarse_LoFTR_TRT)|适用于移动端的LoFTR算法的改进分析 1060显卡上45fps

项目地址&#xff1a;https://github.com/Kolkir/Coarse_LoFTR_TRT 创建时间&#xff1a;2022年 相关训练数据&#xff1a;BlendedMVS LoFTR [19]是一种有效的深度学习方法&#xff0c;可以在图像对上寻找合适的局部特征匹配。本文报道了该方法在低计算性能和有限内存条件下的…

【PyTorch】基于LSTM网络的气温预测模型实现

假设CSV文件名为temperature_data.csv&#xff0c;其前五行和标题如下&#xff1a; 这里&#xff0c;我们只使用Temperature列进行单步预测。以下是整合的代码示例&#xff1a; import pandas as pd import numpy as np import torch import torch.nn as nn import torch.op…

RocketMQ消息短暂而又精彩的一生(荣耀典藏版)

目录 前言 一、核心概念 二、消息诞生与发送 2.1.路由表 2.2.队列的选择 2.3.其它特殊情况处理 2.3.1.发送异常处理 2.3.2.消息过大的处理 三、消息存储 3.1.如何保证高性能读写 3.1.1.传统IO读写方式 3.2零拷贝 3.2.1.mmap() 3.2.2sendfile() 3.2.3.CommitLog …

Redis 7.x 系列【27】集群原理之通信机制

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2 节点和节点2.1 集群拓扑2.2 集群总线协议2.3 流言协议2.4 心跳机制2.5 节点握…

OpenGauss和GaussDB有何不同

OpenGauss和GaussDB是两个不同的数据库产品&#xff0c;它们都具有高性能、高可靠性和高可扩展性等优点&#xff0c;但是它们之间也有一些区别和相似之处。了解它们之间的关系、区别、建议、适用场景和如何学习&#xff0c;对于提高技能和保持行业敏感性非常重要。本文将深入探…

蓝桥强化宝典(4)Dijkstra

前言 Dijkstra算法&#xff08;迪杰斯特拉算法&#xff09;&#xff0c;又称狄克斯特拉算法&#xff0c;是由荷兰计算机科学家Edsger W. Dijkstra于1959年提出的。该算法主要用于在加权图中查找从一个起始节点到所有其他节点的最短路径&#xff0c;解决的是有权图中最短路径问题…

NLP基础知识2【各种大模型的注意力】

注意力 传统Attention存在的问题优化方向变体有哪些现在的主要变体集中在KVMulti-Query AttentionGrouped-query AttentionFlashAttention 传统Attention存在的问题 上下文约束速度慢&#xff0c;显存占用大&#xff08;因为注意力考虑整体信息&#xff0c;所以每一个位置都要…