当前位置: 首页 > article >正文

第三十二周: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 F

class 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 F

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_model
        self.self_attention = self_attention
        self.cross_attention = cross_attention
        self.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.gelu

    def 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_layer

    def 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.kler.cn/a/539372.html

相关文章:

  • 【MQ】Spring3 中 RabbitMQ 的使用与常见场景
  • android的DataBinding的使用
  • C#中的Frm_Welcome.Instance.Show(),是什么意思
  • Jetbrains IDE http客户端使用教程
  • ESXi Host Client创建ubuntu虚拟机教程及NVIDIA显卡驱动安装
  • YouBIP 项目
  • 通信模组认识
  • 重生之我要当云原生大师(十四)分析和存储日志
  • 打家劫舍3
  • 迁移学习 Transfer Learning
  • ESP32-C6通过Thread 1.4认证,设备无线交互联动,物联网通信方案
  • 【数据库创建】用ij工具部署Derby数据库并验证
  • 视觉硬件选型和算法选择(CNN)
  • 01单片机上电后没有正常运行怎么办
  • 升级RAG应用程序与Redis向量库
  • 25寒假周报1,2
  • Deep Dive into LLMs like ChatGPT - by Andrej Karpathy
  • ChunkKV:优化 KV 缓存压缩,让 LLM 长文本推理更高效
  • PyTorch Profiler 性能优化示例:定位 TorchMetrics 收集瓶颈,提高 GPU 利用率
  • [Windows] PDF补丁丁v1.1.0.4627绿色版
  • ASP.NET Core 如何使用 C# 从端点发出 GET 请求
  • PHP 运算符
  • 多线程编程入门-std::future
  • 第十二天 学习ArkUI的交互事件和动画效果
  • HarmonyOS 5.0应用开发——NodeContainer自定义占位节点
  • 每日一题——数组中出现次数超过一半的数字