第三十二周:Informer学习笔记

目录

    • 摘要
    • Abstract
    • 1 Informer
      • 1.1 预备知识
      • 1.2 模型框架
      • 1.3 实验分析
    • 总结

摘要

本周学习的主要内容是Informer模型,Informer是一种专为长序列时间序列预测(LSTF) 设计的Transformer模型。相较于传统的Transformer,Informer采用ProbSparse自注意力机制,降低了时间复杂度和内存使用的同时能够有效捕获序列中的长期依赖关系。通过自注意力蒸馏技术,Informer能够高效处理极长的输入序列。Informer的生成式解码器可以一次性预测整个长时间序列,在预测过程中大幅提高了效率。经过大规模数据集的实验验证,Informer在LSTF问题上表现优秀,为长序列时间序列预测提供了一种高效准确的解决方案,克服了传统Transformer模型的限制。

Abstract

The main content of this week’s study is the Informer model, which is a Transformer model designed specifically for Long Term Time Series Forecasting (LSTF). Compared to traditional Transformer, Informer adopts ProbSparse self-attention mechanism, which reduces time complexity and memory usage while effectively capturing long-term dependencies in sequences. Through self-attention distillation technology, Informer is able to efficiently process extremely long input sequences. Informer’s generative decoder can predict the entire long time series at once, greatly improving efficiency during the prediction process. After experimental verification on large-scale datasets, Informer has shown excellent performance in LSTF problems, providing an efficient and accurate solution for long-term time series prediction, overcoming the limitations of traditional Transformer models.

1 Informer

Informer是一种专为长序列时间序列预测(LSTF) 设计的Transformer模型。传统的Transformer虽然可以捕获长时序的依赖关系,具有能够处理长时序预测问题的能力,但是其存在self-attention机制的二次计算复杂度问题、内存使用量大以及在处理LSTF问题时预测输出速度骤降的问题。Informer的出现克服了传统Transformer模型的限制。
在这里插入图片描述
本次的学习以名为Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting的论文为基础进行。

1.1 预备知识

在长序列时间序列预测问题中,transformer存在的问题有以下几点:
(1)self-attention机制的二次计算复杂度问题:每一层的计算复杂度为O(L2),自注意力中(原子操作)的点积运算,每一对Input都要做attention运算。
(2)高内存使用量问题:Encoder-Decoder的layer堆叠导致内存开销出现瓶颈,层数过多,导致复杂度进一步增大。
(3) 预测长序列输出的速度会下降:因为原始的Transformer的decoder在inference的过程中是动态输出的,即上一次的Output是下一次的Input,进而和隐藏层一起再预测下一次的Output,使得Transformer的Inference过程和RNN一样慢。

ProbSparse self-attention
ProbSparse self-attention的提出源于作者对自注意力机制特征图的思考。由于self-attention具有稀疏性,分布呈长尾分布,只有少数点积对主要注意力有贡献,其他点积只有非常微弱的作用,可以忽略。根据这一特点,作者着重对高得分点积对进行关注,尝试在每次的自注意模块的运算中仅需要计算高得分的部分,从而有效减少模型的时间和空间成本。
在这里插入图片描述
工作原理如下所示:
(1)为每个 query 都随机采样部分的 key,默认值为5∗lnL ;

(2)计算每个 query 的稀疏性得分M (qi,k);

(3)选择稀疏性得分最高的 N 个 query ,N 默认值为5∗lnL;

(4)只计算 N 个 query 和 key 的点积结果,进而得到 attention 结果;

(5)其余的 L-N 个 query 就不计算了,直接将 Self-Attention 层的输入取均值(mean(V))作为输出,这样可保证每个 ProbSparse Self-Attention 层的输入和输出序列长度都是L.
ProbSparse self-attention的核心思想:是找到某些重要的/稀疏的query,从而只计算这些query的attention值,来优化计算效率。

统一输入表示
原始 Transformer 使用点乘自注意机制并采用时间戳作为位置信息编码。然而,在 LSTF 问题中,时序建模不仅需要用到局部时序信息,还需要层次时间戳(week, month, year)和不可知的时间戳(holidays, events)。常规的自注意机制很难直接适配,编码器和解码器之间的 query-key 不匹配会降低预测性能。因此,Informer 给出一个统一的输入表示如下图所示:
在这里插入图片描述
Informer输入的嵌入由三个独立的部分组成——标量投影、局部时间戳(Position)和全局时间戳(Minutes, Hours, Week, Month, Holiday 等)。其中局部位置编码PE和传统Transformer所用的正余弦位置编码相同,全局位置编码SE是一个大小有限的可学习的表示,其 vocab size 大小有限制(最多60个,即以每分钟为最细粒度)。即自注意的相似性计算可以访问全局上下文,且计算消耗在长输入上也是可承受的。

1.2 模型框架

Informer模型框架如下图所示,左侧是Encoder部分,它接收超长的输入数据。然后将传统的Self-Attention层替换为作者提出的ProbSpare Self-Attention层。蓝色的部分是Self-Attention distilling操作来进行特征压缩。Encoder模块通过堆叠上述的两个操作来提高算法的鲁棒性。右侧是Decoder部分,它接收一系列的长序列输入,并将预测目标位置填充为0,再通过经过Mask的Attention层,最后一步生成预测输出。

在这里插入图片描述
Encoder
该部分输入是时序长度为seq_len的过去数据 ,首先进行的是编码操作,包含数值编码、位置编码、时间编码。接着通过由若干个Encoder组成的Encoder Stack提取数据特征并合并所有Encoder提取到的特征图。
在这里插入图片描述

在Encoder模块,Informer用到了Self-Attention Distilling。通过知识蒸馏抽取最重要的Attention信息。蒸馏操作减少了算法所需的内存和时间。具体是在相邻的Attention Block之间加入卷积池化操作,来对特征进行降采样。Informer中的Distilling操作,本质上就是一个1维卷积+ELU激活函数+最大池化。
公式如下:
在这里插入图片描述
Distilling操作的代码实现如下所示:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass ConvLayer(nn.Module):def __init__(self, c_in):super(ConvLayer, self).__init__()self.downConv = nn.Conv1d(in_channels=c_in,out_channels=c_in,kernel_size=3,padding=2,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 x

Decoder
Informer使用的Decoder和传统的Decoder不同,生成式decoder一次性生成所有的预测输出,而传统的Transformer是将上一步的输出放入decoder在得到下一步的输出,这样每步只能输出一个time step的数据。
这种形式的decoder的start token 是从input中sample一个较短的序列(需要预测的序列的之前一个片断),decoder输入是encoder输入的后面部分的截取+与预测目标形状相同的0矩阵。
在这里插入图片描述

为了让算法生成长序列的输出,Informer需要如下的输入:
在这里插入图片描述
其中, Xttoken为start token序列,Xto为需要预测序列,用0填充。
需要注意的是,第一个attention层中的query、key、value都是根据Decoder输入的embedding乘上权重矩阵得到的,而第二个attention层中的query是根据前面attention层的输出乘上权重矩阵得到的,key和value是根据Encoder的输出乘上权重矩阵得到的。其代码实现如下所示:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass 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

Decoder构成是由两个DecoderLayer构成,而每个DecoderLayer的内部,还包括:一个mask self-attention;一个multi cross-attention,负责target sequence和source sequence的交互用的;两个conv1,类似FFN;三个layer norm,一个dropout。
将Masked multi-head attention应用于ProbSparse self-attention,将mask的点积设置为-∞。它可以防止每个位置都关注未来的位置,从而避免了自回归。
经过Decoder后,每个placeholder(待预测位置)都有一个向量,然后输入到一个全连接层得到预测结果。

1.3 实验分析

(1)数据集
作者在四个数据集上进行了实验,包括两个真实数据集和两个公共基准数据集:

ETT:收集自中国两个县的电力变压器温度数据集,有2小时、1小时、15分钟三种粒度,每个数据点包括油温以及6个电力负载指标。数据集/验证集/测试集分别为12/4/4个月。

ECL:收集自321个用户的用电量。作者将其转化为两年间的用户每小时的电量使用量,以MT_320为预测目标。数据集/验证集/测试集分别为15/3/4个月。

Weather:收集自2010-2013四年间美国1600个地点的每小时气候数据。包括预测目标湿球温度以及11个气候指标。数据集/验证集/测试集分别为28/10/10个月。
(2)基线和评估指标
论文中选择了五种时间序列预测方法进行比较,包括 ARIMA、Prophet、LSTMa、LST net和 DeepAR。为了更好地探索 ProbSparse 自注意力在 Informer 中的表现,作者在实验中将规范的自注意力变体 (Informer) 、高效变体 Reformer和最相关的工作 LogSparse 自注意力纳入实验。
评估指标:Mean Absolutc Error (MAE),Mcan Squared Error (MSE).
(3)实验结果
下图总结了4个数据集上所有方法的单变量/多变量评估结果。作为对预测能力的更高要求,作者逐渐延长了预测范围,其中LSTF问题设置被精确控制,以便在每种方法的单个GPU上易于处理。最佳结果以粗体突出显示。
在这里插入图片描述
在这里插入图片描述
以上结果表明lnformer在提高LSTF问题的预测能力方面取得了成功。 Informer模型显示的结果明显优于递归神经网络LSTM,且与基于RNN的模型相比,自注意力机制中较短的网络路径获得了更好的预测能力。
下图是对​ self-attention的消融实验,探讨的是针对的attention部分的区别。Informer 将所有的ProbSparse Attention换成标准的self-attention。
在这里插入图片描述
可以看到,当输入序列长度为1440时,中间两个模型已经无法处理了,而Informer和Reformer依然坚挺,但是Informer效果要好很多;输入越长,效果会越好。
下图是对自注意力蒸馏操作的消融实验。Informer + 模型是使用原始self-attention并移除卷积蒸馏操作,在输入长度为720时取得了好的效果,但是无法处理更长的输入。Informer +对于更长的预测,更长的输入带来的性能提升更加明显。
)
下图是对生成式Decoder的消融实验结果。Informer 模型是使用原始self-attention并移除卷积蒸馏操作,也就是只保留生成式Decoder部分;下面那个模型是从Informer 模型中再移除生成式Decode,用原始的动态解码过程代替。
在这里插入图片描述

我们可以看到,生成式Decoder比传统的动态编码效果要好,这可能是因为动态编码存在这错误传递的问题。
在这里插入图片描述

上图显示了训练/测试阶段的总运行时间。在训练阶段,Informer(红线)在基于Transformer 的方法中实现了最好的训练效率。在测试阶段,Informer比其他采用生成式解码的方法要快得多。
在这里插入图片描述

上图总结了理论时间复杂度和内存使用情况的比较。lnformer的性能与运行时实验—致。

总结

本周对Informer进行了学习,其关注的问题依然是长时间序列预测问题。也是从self-attention 机制的缺陷出发,做了一些优化于改进工作,像ProbSparse self-attention,self-attention蒸馏机制,生成式 Decoder,其中还有比较关键的就是在LSTF问题中统一了输入表示。通过本次的学习我明白了Informer的基本知识,但对于模型的数学原理还不是很熟后续还需要进一步学习。

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

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

相关文章

React 生命周期函数详解

React 组件在其生命周期中有多个阶段,每个阶段都有特定的生命周期函数(Lifecycle Methods)。这些函数允许你在组件的不同阶段执行特定的操作。以下是 React 组件生命周期的主要阶段及其对应的生命周期函数,并结合了 React 16.3 的…

【计算机毕业设计】Spring Boot教师人事档案管理系统功能说明

🎉**欢迎来到琛哥的技术世界!**🎉 📘 博主小档案: 琛哥,一名来自世界500强的资深程序猿,毕业于国内知名985高校。 🔧 技术专长: 琛哥在深度学习任务中展现出卓越的能力&a…

绩效归因概述

绩效归因概述 1. 分类2. 基于净值的归因方法2.1 发展背景2.2 择时选股模型 T-M模型2.3 择时选股模型 H-M模型2.4 择时选股模型 C-L模型2.5 风格配置模型-Sharpe2.6 多因子模型 Fama-French32.7 多因子模型 Carhart42.8 多因子模型 Fama-French5 3. 基于持仓的归因方法3.1 发展背…

MambaMorph brain MR-CT

loss代码实现了几种用于医学图像配准(Registration)和分割(Segmentation)任务的损失函数,主要包括以下几种: NCC (Normalized Cross-Correlation): 功能: 计算局部归一化互相关损失,用于衡量两个图像之间的相似性。 应用场景: 通常用于图像配准任务,通过最大化图像之间…

大模型chagpt原理(持续更新)

20250210更新: 根据李宏毅课程可知,大模型chatgpt基本原理分为三步(每一步都是在做文字接龙,但训练资料不同) 一、依赖大量网上文章、维基百科等资料训练 对资料进行去重,劣质优质划分,过滤等…

DeepAR:一种用于时间序列预测的深度学习模型

介绍 DeepAR是一种基于递归神经网络(RNN)的时间序列预测模型,由亚马逊在2017年提出。它特别适用于处理多变量时间序列数据,并能够生成概率预测。DeepAR通过联合训练多个相关时间序列来提高预测性能,从而在实际应用中表…

C++ ——从C到C++

1、C的学习方法 (1)C知识点概念内容比较多,需要反复复习 (2)偏理论,有的内容不理解,可以先背下来,后续可能会理解更深 (3)学好编程要多练习,简…

<tauri><rust><GUI>基于rust和tauri的图片显示程序(本地图片的加载、显示、保存)

前言 本文是基于rust和tauri,由于tauri是前、后端结合的GUI框架,既可以直接生成包含前端代码的文件,也可以在已有的前端项目上集成tauri框架,将前端页面化为桌面GUI。 环境配置 系统:windows 10 平台:visual studio code 语言:rust、javascript 库:tauri2.0 概述 …

Java 中的 List 接口有哪些实现类?

以下是Java中List接口的主要实现类及其特点的详细总结: Java List 接口的主要实现类 1. ArrayList 实现方式:基于动态数组特点: 查询高效:支持随机访问(通过索引),时间复杂度为O(1)增删较慢&a…

Arrays工具类详解

目录 1. Arrays.toString() 方法 2. Arrays.deepToString() 方法 3. Arrays.equals(int[ ] arr1, int[ ] arr2) 方法 4. Arrays.equals(Object[] arr1, Object[] arr2) 方法 5. Arrays.deepEquals(Object[] arr1, Object[] arr2) 方法 6. Arrays.sort(int[] arr) 方法 7…

设计高效的测试用例:从需求到验证

在现代软件开发过程中,测试用例的设计一直是质量保证(QA)环节的核心。有效的测试用例不仅能够帮助发现潜在缺陷,提升软件质量,还能降低后期修复成本,提高开发效率。尽管如此,如何从需求出发&…

基于YoloV11和驱动级鼠标模拟实现Ai自瞄

本文将围绕基于 YoloV11 和驱动级鼠标实现 FPS 游戏 AI 自瞄展开阐述。 需要着重强调的是,本文内容仅用于学术研究和技术学习目的。严禁任何个人或组织将文中所提及的技术、方法及思路应用于违法行为,包括但不限于在各类游戏中实施作弊等违规操作。若因违…

三角测量——用相机运动估计特征点的空间位置

引入 使用对极约束估计了相机运动后,接下来利用相机运动估计特征点的空间位置,使用的方法就是三角测量。 三角测量 和对极几何中的对极几何约束描述类似: z 2 x 2 R ( z 1 x 1 ) t z_2x_2R(z_1x_1)t z2​x2​R(z1​x1​)t 经过对极约束…

【AI论文】Visual Instruction Tuning

文献核心目标 作者的目标是通过多模态指令微调(Visual Instruction Tuning)来训练一个通用的视觉助手,使其能够理解用户的语言指令并与视觉内容结合完成任务。例如,用户可以上传图片并提出问题,模型根据图片内容作出回答。 1. 引言 什么是多模态交互?为什么重要? 人类…

SQL-leetcode—1407. 排名靠前的旅行者

1407. 排名靠前的旅行者 表:Users ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- id 是该表中具有唯一值的列。 name 是用户名字。 表:Rides -------------------…

如何本地部署DeepSeek

第一步:安装ollama https://ollama.com/download 打开官网,选择对应版本 第二步:选择合适的模型 https://ollama.com/ 模型名称中的 1.5B、7B、8B 等数字代表模型的参数量(Parameters),其中 B 是英文 B…

Git生成公钥和私钥的方式

因为需要访问远程Git服务器,需要使用公钥: 1、先检测电脑上是否已经有.ssh目录 像我这就是没有的 2、开始生成一个新的SSH密钥(RSA) 打开Git Bash, 然后运行ssh-keygen -t rsa -b 4096 -C "注释" -t rsa是密匙类型…

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…

SQL-leetcode—1393. 股票的资本损益

1393. 股票的资本损益 Stocks 表: ---------------------- | Column Name | Type | ---------------------- | stock_name | varchar | | operation | enum | | operation_day | int | | price | int | ---------------------- (stock_name, operation_day) 是这张…

【Audio】Android 10车载音频路由

音频路由 在 Android 10 中,car_audio_configuration.xml 取代了 car_volumes_groups.xml 和 IAudioControl.getBusForContext。新的配置文件定义了一个音频区列表。每个音频区都拥有一个或多个音量组及其关联设备,而每台设备都具有应在该音频区内进行路…