时间序列预测(8) — Informer模型原理

2023-11-20 15:44

本文主要是介绍时间序列预测(8) — Informer模型原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

0 摘要

1 引言

2 定义

3 方法

3.1 高效的自注意力机制

3.2 稀疏度度量

3.3 ProbSparse稀疏自注意力机制

3.4 Encoder编码器

3.5 Decoder解码


参考视频:Informer原理及代码解析_哔哩哔哩_bilibili

0 摘要

长序列时间序列预测(LSTF)需要模型具有很高的预测能力,即精确的捕捉输出和输入之间长时间依赖关系的能力。Transformer能很好的提高预测精度,然而Transformer存在几个严重问题,二次时间复杂度、高内存使用和编码器-解码器架构的固有限制。为了解决这些问题,Informer设计了一种高效基于Transformer的LSTF模型,具有三个独特特点:

  1. ProbSparse稀疏自注意机制,其时间复杂度和内存使用为,在序列依赖性对齐方面具有可比性能;
  2. 自注意力提取突出显示主导关注,通过减半级联层输入有效处理极长输入序列;
  3. 生成式解码器,概念上简单,可以一次性预测长时间序列,而不是逐步方式,大大提高了长序列预测的推断速度。

1 引言

在能源和智能电网管理、经济和金融、以及疾病传播分析等领域,可以利用大量的过去时间序列数据来进行长期预测。然而,现有方法大多设计用于短期问题设置,比如预测48个点或更少。随着序列越来越长,模型的预测精度随之下降。

当解决LSTF问题时,Transformer存在三个重要的局限性:

  1. 自注意力的二次计算复杂度问题:自注意力机制的原子操作(即点积),导致每层的时间复杂度和内存使用量为
  2. 高内存使用量问题:对长序列输入进行堆叠时,J个encoder--decoder层的堆叠使得总内存使用量为,这限制了模型在接收长序列输入时的可伸缩性。
  3. 预测长输出时速度骤降问题:原始Transformer的动态解码操作导致step by step inference(逐步推理)的速度如同基于RNN的模型一样慢。

逐步推理的含义:只有当前层处理完后才处理下一层,造成模型速度很慢。

Informer深入探讨了这三个问题。研究了自注意力机制中的稀疏性,改进了网络组件。Informer的贡献总结如下:

  • 提出了Informer,成功提高了LSTF问题的预测能力,验证了Transformer-like模型捕捉长序列时间序列输出和输入之间个体长程依赖性的潜在价值。 
  • 提出了ProbSparse稀疏自注意力机制,以有效地替代经典的自注意力。它在依赖对齐上实现了的时间复杂度和的内存使用。
  • 提出了自注意力蒸馏操作,以优先考虑J层堆叠中的主导注意力分数,并将总空间复杂度大幅降至,有助于接收长序列输入。
  • 提出了生成式解码器,只需进行一次前向步骤即可获得长序列输出,同时避免了推断阶段的累积误差扩散。

2 定义

我们首先提供LSTF问题的定义。在具有固定大小窗口的滚动预测设置下,我们在时间 t :

  • 输入:
  • 输出:

编码器-解码器架构:将输入表示“编码”为隐藏状态,并从“解码”出输出表示。流程涉及一个名为“动态解码”的逐步过程,其中解码器从上一步的状态和来自第 k 步的其他必要输出计算出一个新的隐藏状态,然后预测第(k+1)序列

3 方法

3.1 高效的自注意力机制

经典自注意力是基于元组输入(即查询向量、键向量和值向量)定义的,它执行缩放点积,如

其中即查询向量、键向量、值向量、d为输入维度。

为了进一步讨论自注意力机制,让分别表示中的第 i 行。按照公式,第 i 个查询的注意力被定义为概率形式的核平滑器:

自注意力结合了值并根据计算概率获取输出。计算复杂度和内存使用为,并非高效的计算方式。

研究表明,自注意力概率分布具有潜在的稀疏性,并且他们设计了“选择性”计算策略,对所有进行计数,而不会显著影响性能。

self-attention的权重构成了一个长尾分布(long tail distribution),也就是很少的权重贡献了主要的attention,而其他的可以被忽略,也就是单前点只与少数历史点相关。

3.2 稀疏度度量

从公式(1)中,第 i 个查询对所有键的注意力定义为概率,输出是它与值 v 的组合。我们希望该计算的概率分布远离均匀分布。如果接近均匀分布,则计算会产生很多冗余,也就是其他点对当前点的影响是一样的,并没有区分度。我们通过Kullback-Leibler散度来测量“相似性”:

省略常数,我们定义第 i 个查询的稀疏度量为:

其中第一项是在所有键上的Log-Sum-Exp(LSE),第二项是它们的算术平均值。如果第 i 个查询获得更大的,它的注意力概率 p 更“波动”,也就是更加远离均匀分布,是我们需要的。

3.3 ProbSparse稀疏自注意力机制

核心思想:不能为每个quey都计算下稀疏性得分吧?这样不但没有优化效率,还带来
了额外的计算量。作者利用点积结果服从长尾分布的假设,提出在计算每个quey稀疏
性得分时,只需要和采样出的部分key计算就可以了。就是找到这些重要的/稀疏的query,从而只计算这些queryl的attention值,来优化计算效率。

允许每个键只关注前个主要查询:

其中是与相同大小的稀疏矩阵,它只包含在稀疏度量下的前 个查询。受常数采样因子控制,我们设置,这使ProbSparse自注意力仅需要为每个查询-键查找计算个点积,并且内存使用量是。此注意力为每个头生成不同的稀疏查询-键对,从而避免了严重的信息损失。

然而,对所有查询点计算,时间复杂度是,受此启发,提出了最大均值测量

个的范围近似保持在边界放松中。 在长尾分布下,我们只需要随机采样个点积对来计算,即填充其他对为零。然后,我们从中选择稀疏的前 个作为中的最大运算符对零值不太敏感,且数值稳定。在实践中,查询和键的输入长度通常在自注意力计算中是相等的,即,因此ProbSparse自注意力的总时间复杂度和空间复杂度为

  • 公式(4)比公式(3)更加利于计算
  •  的作用是计算点的波动性,数值越大,证明波动性越大。

3.4 Encoder编码器

Encoder在内存使用限制下允许处理更长的顺序输入,编码器旨在提取长顺序输入的稳健长程依赖性。在输入表示之后,第 t 个序列输入已被塑造成一个矩阵

自注意力精炼:作为ProbSparse自注意力机制的自然结果,编码器的特征图具有冗余的值组合。我们使用精炼操作来优先考虑具有主导特征的优越组合,并在下一层中形成一个聚焦的自注意力特征图。它锐利地修剪输入的时间维度,观察图3中注意力块的n头权重矩阵(重叠的红色方块)。受到扩张卷积的启发,我们的“精炼”过程从第 j 层向(j + 1)层前进,如下所示:

这里的 代表注意力块。它包含了多头ProbSparse自注意力和基本操作,其中对时间维度进行1-D卷积滤波(核宽度为3),并使用激活函数。我们添加了一个步长为2的最大池化层,并在堆叠一层之后将降采样为其一半的片段,从而将整个内存使用减少为,其中是一个小数。为增强精炼操作的稳健性,我们建立了主堆栈的副本,并逐渐减少自注意力精炼层的数量,每次丢弃一层,就像图2中的金字塔一样,以使它们的输出维度对齐。因此,我们连接所有堆栈的输出,并得到编码器的最终隐藏表示。

3.5 Decoder解码器

提出了生成式的decoder机制,在预测序列(也包括inferencel阶段)时一步得到结果,而不是step-by-step,直接将预测时间复杂度降低。

Transformer是一个encoder-decoder的结构,在训练阶段,我们可以用teacher forcing的手段
让decoder-一步就得到预测结果,但是inferencel时,都是step-by-step,所以看到Informer中的“一步Decoder”,作者的做法也很简单直接,首先,不论训练还是预测,Decoder的输入序列分为两部分。

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

解码器生成长序列输出,通过一次前向过程我们在图(2)中使用了标准的解码器结构,它由两个相同的多头注意力层堆叠而成。然而,在长序列预测中,采用生成式推断来缓解速度下降。我们将以下向量作为解码器的输入:

这里是起始标记,是目标序列的占位符(标量设为0)。在ProbSparse自注意力计算中应用了掩码多头注意力,通过将掩码点积设为,防止每个位置关注到后续位置,避免自回归。最终输出由全连接层获取,其输出大小取决于我们是执行单变量预测还是多变量预测。

生成式推断:起始标记在NLP的“动态解码”中得到了高效应用,我们将其扩展为一种生成式方式。我们不是选择特定的标记作为令牌,而是在输入序列中随机抽样一个长度为的序列,比如在输出序列之前的一个较早的片段。以预测168个点为例(实验部分的7天温度预测),我们将取目标序列之前已知的5天作为“起始标记”,并将其与一起作为生成式推断解码器的输入,即。这里的包含目标序列的时间戳,即目标周的上下文。然后我们的提出的解码器通过一次前向过程而不是在传统的编码器-解码器架构中耗时的“动态解码”来预测输出。在计算效率部分给出了详细的性能比较。

这篇关于时间序列预测(8) — Informer模型原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/395694

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N