第四十六周:文献阅读+itransfomer

news2024/11/27 21:05:15

目录

摘要

Abstract

文献阅读:ITtransformer——转置transformer对时间序列预测的实用性

现有问题

提出方法

方法论

研究实验

实验目的

数据集

基线模型

实验结果

研究贡献

模型代码

总结


摘要

本周阅读的文献《Inverted Transformers are Effective for Time Series Forecasting》中,提出了一种更利于时间序列预测的转置transformer模型,即iTransformer。文章作者认为Transformer并非不适合于时间序列预测任务,而是没有“正确使用”Transformer。在在保留Transformer结构的同时,通过将输入Embedding的进行转置,将每个变量的整个时间序列独立地嵌入到Token中,扩大了当地的感受野,聚合了系列的全局表示,可以更加以变量为中心。而注意力机制的使用,能够利用这些变量标记来捕获多变量相关性。同时,前馈网络可以学习每个变量标记的非线性表示,并解码以预测未来序列。

Abstract

In the literature "Inverted Transformers are Effective for Time Series Forecasting" read this week, a more favorable transposed transformer model for time series prediction, namely iTransformer, is proposed. The author of the article believes that Transformers are not unsuitable for time series prediction tasks, but rather have not been "used correctly". By transposing the input Embedding while preserving the Transformer structure, the entire time series of each variable is independently embedded into the Token, expanding the local receptive field and aggregating a series of global representations, making it more variable centric. The use of attention mechanisms can utilize these variable markers to capture multivariate correlations. Meanwhile, the feedforward network can learn the nonlinear representation of each variable label and decode it to predict future sequences.

文献阅读:ITtransformer——转置transformer对时间序列预测的实用性

Inverted Transformers are Effective for Time Series Forecastingicon-default.png?t=N7T8https://arxiv.org/abs/2310.06625

现有问题

Transformer对时间序列的时间token进行全局依赖性建模,每个token由相同时间戳的多个变体组成。Transformer通常将同一时间戳的多个变量嵌入到无法区分的通道中,并将注意力集中在这些时间标记上以捕获时间依赖性。然而由于性能下降和计算爆炸,Transformer在预测具有较大回溯窗口的序列时面临挑战。此外,每个时间token的嵌入融合了代表潜在延迟事件和不同物理测量的多个变量,这可能无法学习以变量为中心的表征,并导致无意义的attention map。因此基于transformer的预测器结构可能不适合多变量时间序列预测,Transformer在捕获基本序列表示和描绘多元相关性方面被削弱,限制了其在不同时间序列数据上的容量和泛化能力。

transformer无法学习以变量为中心的表征,导致无意义的attention map的原因:

  1. 将不同序列中同一个时间点嵌入到一个时间token中,而同一时间点的点基本上代表了完全不同的物理意义,而这些点是由不一致的测量记录下来的,因此无法考虑时间序列中的多变量相关性;
  2. 同一时间点所代表的局部感受野和时间不一致事件过多,因此单个时间步形成的token难以揭示有益信息;
  3. 虽然序列变化会受到序列顺序的很大影响,但在时间维度上没有适当地采用排列不变的注意力机制;

提出方法

在不对基本组件进行任何修改的情况下,重新设计了Transformer架构,提出了转置Transformer,即iTransformer 模型,该模型将每单个序列的时间点整体独立嵌入到变量标记中,然后由注意力机制利用这些变量标记来捕获多变量相关性,同时,利用前馈网络来学习每个变量标记的非线性表示。

方法论

iTransformer的整体结构与Transformer的编码器具有相同的模块排列,舍弃了Transformer中的解码器结构。在Enbedding部分进行转置,将不同变量的原始序列独立嵌入为token,然后嵌入的变量token再通过一层多变量注意力层,以增强可解释性,揭示多变量相关性。然后采用层归一化以减少变量之间的差异。再通过前馈网络提取每个token的序列表示。

模型输入为历史观测序列数据,输出为预测数据。在多变量时间序列预测中,给定历史观测数据序列大小为(T x N),其中T为时间序列的长度,N为特征维度,而预测的序列长度为S。中间通过Embedding、TrmBlock的多层堆叠以及最后的Projection来实现对未来长度为S时间序列的预测。

X_{t},:将表示在第t步同时记录的时间点,X_{:},n表示以n为索引的每个变量的整个时间序列。

iTransformer模型伪代码如下:

转置Embedding:将单个变量的整个时间序列视为一个Token

iTransformer将不同的变量分开考虑,将一个变量的整个时间序列,独立Embedding为一个token,然后再通过一个linear层进行Embedding。

 

LayerNorm(层归一化)

原本Transforer中的LayerNorm会对相同时间戳的变量作归一化,使得变量之间的区分度下降。同时当各个变量的时间点没有对齐时,还会产生“交互噪声”。这种每个变量的归一化还会让模型拟合过于“平滑”,使得模型无法有效地区分不同的特征或模式从而造成过拟合。

在提出iTransforer的中,归一化被应用于作为下述方程的每单个变量的级数表示,让所有变量的特征通道都处于相对统一的分布下。此外,由于所有变量的特征表示都被归一化到正态分布,由变量取值范围不同造成的差异可以减弱。

Feed-forward network(前馈网络)

传统Transformer对同一时间戳下的变量编码,形成token的同一时间戳的多个变量可能发生错位,并且过于局部化,无法揭示足够的信息用于预测。在iTransforer中,FFN被用于每个Variate Token的序列表示,可以用于复杂的时间序列。

FNN包含激活函数层和两层Conv1d(第一层是对历史时间数据编码,第二层是解码进行预测),这里的FNN是计算序列内的全局表示。通过反向块的堆叠,致力于对观测到的时间序列进行编码,并使用密集的非线性连接对未来序列的表示进行解码。

Multivariate-Attention(多变量注意力机制)

注意力图可以在一定程度上揭示变量的相关性,以前的Transformer预测器通常采用注意力机制来促进时间依赖性建模,但iTransformer模型通过转置编码将一个变量的整个系列视为一个单独的过程,因此自注意力机制就可以促进不同变量之间的依赖了。

自注意力模块全面提取时间序列表示,采用线性投影获取Q、K、V的值,计算前Softmax分数,揭示变量之间的相关性,而原本的Transformer的注意力机制中的Q和K计算的是时间序列的相关性。在Softmax加权操作中,高度相关的变量将在与其Value向量的交互中获得更大的权重,更自然地建模了多变量时序数据的关联。

研究实验

实验目的

评估提出的iTransformer在各种时间序列预测应用,验证所提出的框架的通用性,并进一步验证应用在Transformer组件上的时间序列倒维的有效性。

数据集

在实验中使用了7个真实世界的数据集,包括ECL、ETT(4个子集)、Exchange、Traffic、Autoformer使用的天气,LSTNet中提出的太阳能数据集和SCINet中评价的PEMS(4个子集)。以及市场实验(6个子集),它记录了支付宝在线交易应用程序的分钟采样服务器负载,具有数百个变量。

基线模型

选择了10个公认的预测模型作为我们的基准,包括:

(1)基于Transfomer的方法:Autoformer(2021)、FEDformer(2022)、固定(2022 )、Crossformer(2023)、PatchTST(2023);

(2)基于线性的方法:DLinear(2023)、TiDE(2023)、RLinear(2023);

(3)基于TCN的方法:SCINet(2022)、TimesNet(2023)。

实验结果

1、通过与基准模型对比实验,证明iTransformer预测高维时间序列预测能力。

将基准模型与研究模型在多个数据集上进行对比实验,多变量时间序列预测基准结果如下表所示,红色与蓝色分别表示最优与次优结果。MSE/MAE越低,预测结果越准确。从综合预测结果可以看出,与其他预测器相比,iTransformer特别擅长预测高维时间序列。作为明确捕获多变量相关性的代表,Crossformer的性能仍然低于iTransformer,这表明来自不同多变量的时间未对齐的补丁的相互作用将为预测带来不必要的噪声。因此,本地Transformer组件能够胜任时间建模和多变量相关,并且所提出的倒置架构可以有效地处理真实世界的时间序列预测场景。

2、证明提出的转置框架能够获得的性能提升

其变体来评估iTransformer,其通常解决自我注意力机制的二次复杂性,表明简单的倒置视角可以提高基于Transformer的预测器的性能,提高效率,对未知变量进行泛化,并更好地利用历史观测。提出的反转框架获得包括平均性能和相对MSE降低的性能提升。此外,由于注意力机制在我们的反向结构中的变量维度上被采用,因此具有线性复杂度的有效注意力的引入本质上解决了由于众多变量而导致的计算问题。因此,iTransformer的想法可以广泛应用于基于Transformer的预测器,以更好利用高效注意力机制。

3、验证iTransformers模型对未知变量的泛化性能

将每个数据集的变量划分到五个文件夹中,用20%的变量训练模型,并使用部分训练的模型来预测所有品种。如下图所示,每个条形图显示了所有文件夹的平均结果。CI-Transformers在推理过程中需要很长时间来逐个预测每个变量,而iTransformers直接预测所有变量,并且通常呈现较小的增加,这表明FFN能够学习可转移的时间序列表示。

Q:为什么会具有对未知变量的泛化性能?

首先,得益于输入令牌数量的灵活性,变量通道的数量不再受到限制,因此可以根据训练和推理而变化。此外,前馈网络同样适用于iTransformer中的独立变量令牌。如前所述,作为过滤器的神经元学习任何时间序列的内在模式,这些模式倾向于在不同的变量之间共享和转移。 

4、验证iTransformers在扩大的回溯窗口上具有更好的性能(能给更好利用回溯窗口)

回溯长度T ∈ {48,96,192,336,720}和固定的预测长度S = 96。虽然基于Transformer的预测器的性能不一定受益于增加的回溯长度,但倒置框架使vanilla Transformer及其变体在扩大的回顾窗口上具有更好的性能。随着回溯窗口长度的增加,iTransformers 的预测性能有了显著提高。

5、验证Transformer组件的合理性

消融研究包括更换组件(Replace)和移除组件(w/o)实验,在变量维度上利用attention、在时间维度上利用前馈的 iTransformer 性能最佳。在这些设计中,原始Transformer(第三行)的性能最差,这表明传统架构与该任务的责任不匹配,揭示了传统架构的潜在风险。

研究贡献

  1. 反思了Transformer的架构,并提炼出普通Transformer组件对多变量时间序列的胜任能力。·
  2. 提出了iTransformer,该模型将独立的时间序列视为Token,通过自我关注来捕获多变量相关性,并利用层归一化和前馈网络模块来学习更好的时间序列全局表示。
  3. 在实验上,iTransformer在现实世界的基准测试中达到了全面的最先进水平,广泛地分析了倒置模块和架构选择,为未来改进基于transformer的预测器指明了一个有希望的方向。

模型代码

第一层:Enbedding层

iTransformer的Embedding将整个输入都做转置,将每个特征的时间序列整个作为一个Embedding的Token,故而没有了原本的Positional Embedding,就将时间序列根据不同粒度分解作x_mark,也是将各个维度的变量作整个输入变为1个Embedding Token,不再使用Temporal Embedding。

#转置之后的Enbedding层
class DataEmbedding_inverted(nn.Module):
  
    def __init__(self, c_in, d_model, embed_type='fixed', freq='h', dropout=0.1):
        super(DataEmbedding_inverted, self).__init__()
        #用于设置网络中的全连接层,c_in输入维度,d_model为模型的维度
        self.value_embedding = nn.Linear(c_in, d_model)
        #p为保留概率,对于每个输入元素,以概率p置0
        self.dropout = nn.Dropout(p=dropout)
 
    def forward(self, x, x_mark):
        #将指定的矩阵维度进行重新排序,将第1维和第2维进行互换
        x = x.permute(0, 2, 1)
        # x: [Batch Variate Time]
        if x_mark is None:
            #标记不为空则进行编码
            x = self.value_embedding(x)
        else:
            #将协变量(如时间戳)作为标记的可能性
            x = self.value_embedding(torch.cat([x, x_mark.permute(0, 2, 1)], 1))
        #返回正则化后的结果
        return self.dropout(x)
        

第二层:注意力层

将每个变量token都复制三分,通过不同的线性层分别作为Q、K、V,形状变成了[Batch Variate n_head  d_model],将Q、K相乘缩放以当做相关性的度量,Softmax化后乘以Values得到不同变量之间的相关性权重,从而得到全局的Attention map。

class AttentionLayer(nn.Module):
    def __init__(self, attention, d_model, n_heads, d_keys=None,
                 d_values=None):
        super(AttentionLayer, self).__init__()
 
        d_keys = d_keys or (d_model // n_heads)
        d_values = d_values or (d_model // n_heads)
 
        self.inner_attention = attention
        #采用线性投影获取Q、K、V的值
        self.query_projection = nn.Linear(d_model, d_keys * n_heads)
        self.key_projection = nn.Linear(d_model, d_keys * n_heads)
        self.value_projection = nn.Linear(d_model, d_values * n_heads)
        self.out_projection = nn.Linear(d_values * n_heads, d_model)
        self.n_heads = n_heads

     #这里和Transformer中的的self-attention一样,对embedding的输出分别做3个线性转换,获得queries,keys,values
    def forward(self, queries, keys, values, attn_mask, tau=None, delta=None):
        B, L, _ = queries.shape
        _, S, _ = keys.shape
        H = self.n_heads
 
        queries = self.query_projection(queries).view(B, L, H, -1)
        keys = self.key_projection(keys).view(B, S, H, -1)
        values = self.value_projection(values).view(B, S, H, -1)
 
        out, attn = self.inner_attention(
            queries,
            keys,
            values,
            attn_mask,
            tau=tau,
            delta=delta
        )
        #将out的维度进行转换
        out = out.view(B, L, -1)
 
        return self.out_projection(out), attn
    

第三层:前馈神经网络

FNN包含激活函数层和两层Conv1d,第一层是对历史时间数据编码,第二层是解码进行预测。注意:这里的FNN是计算序列内的全局表示。

class FullAttention(nn.Module):
    def __init__(self, mask_flag=True, factor=5, scale=None, attention_dropout=0.1, output_attention=False):
        super(FullAttention, self).__init__()
        self.scale = scale
        self.mask_flag = mask_flag
        self.output_attention = output_attention
        self.dropout = nn.Dropout(attention_dropout)
 
    def forward(self, queries, keys, values, attn_mask, tau=None, delta=None):
        B, L, H, E = queries.shape
        _, S, _, D = values.shape
        scale = self.scale or 1. / sqrt(E)
 
        scores = torch.einsum("blhe,bshe->bhls", queries, keys)
 
        if self.mask_flag:
            if attn_mask is None:
                attn_mask = TriangularCausalMask(B, L, device=queries.device)
 
            scores.masked_fill_(attn_mask.mask, -np.inf)
 
        A = self.dropout(torch.softmax(scale * scores, dim=-1))
        V = torch.einsum("bhls,bshd->blhd", A, values)
 
        if self.output_attention:
            return V.contiguous(), A
        else:
            return V.contiguous(), None

Encoder

这部分就完全和Transformer中的Encoder部分一样了,包含两层Conv1d和LayerNorm,以及一层激活函数和Dropout防止全连接层过拟合,最后将一个线性层作为decoder,得到未来n个时间段的预测值。

class 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_model
        self.attention = 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.dropout = nn.Dropout(dropout)
        self.activation = F.relu if activation == "relu" else F.gelu
 
    def forward(self, x, attn_mask=None, tau=None, delta=None):
        new_x, attn = self.attention(
            x, x, x,
            attn_mask=attn_mask,
            tau=tau, delta=delta
        )
        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), attn

总结

这种通过阅读文献和模型代码,学习了 2024年时间序列预测领域的最新研究成果iTransformer模型,该模型在Transformer的基础上,将独立时间序列整体作为一个token,然后可以通过self-attention捕捉(每个序列)多变量相关性,并利用层归一化和前馈网络模块学习更好的序列全局表示,以用于时间序列预测,通过实验证明该模型在真实世界基准测试中取得了全面的SOTA。

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

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

相关文章

海康威视【管理员】账号密码泄露【附Poc】

「企业介绍」 海康威视成立于2001年, 是一家专注技术创新的科技公司 ,在安防、智能物联领域耕耘二十余年,业务覆盖全球150多个国家和地区。公司致力于将物联感知、人工智能、大数据技术服务于千行百业,引领智能物联新未来&#x…

【Python】——变量名的命名规则

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

2024长三角快递物流高质量创新发展论坛

2024长三角快递物流高质量创新发展论坛暨 2024长三角快递物流供应链与技术装备展览会(杭州) 2024年7月8-10日 | 杭州国际博览中心 指导单位:浙江省邮政管理局 中国快递协会 主办单位:浙江省快递行业协会 联合主办:上…

【医学嵌入模型】中文医疗文本处理大模型 PCL-MedBERT

中文医疗文本处理大模型 PCL-MedBERT 提出背景对ELECTRA限制的深入分析eHealth的创新方法实体识别关系抽取 总结 最近再做医学项目,需要从文本中抽取医学概念和关系,通用模型的抽取效果还可以。 但还想找医学嵌入模型,能够更准确地从文本中识…

python---基础(一)

文章目录 前言1.对象的基本组成2.变量和常量2.1.变量的声明2.2.常量_链式赋值_系列解包赋值2.2.1.常量是不是真的常量?2.2.2.链式赋值2.2.3.系列解包赋值 3.内置数据类型_基本算数运算符3.1四种内置数据类型3.2.基本运算符3.3.divmod() 前言 这几年,随着…

Wasm初上手

总之也是为了扩宽技术面吧。。。我也不知道为什么就想试试了,就酱。 参考阅读:极客时间《WebAssembly入门课》 安装wasm的编译器Emscripten。Emscripten 是一个“源到源”语言编译器工具集,这个工具集可以将 C/C 代码编译成对应 JavaScript 代…

JavaScript 入门指南(三)BOM 对象和 DOM 对象

BOM 对象 BOM 简介 BOM(browser Object Model)即浏览器对象模型BOM 由一系列对象组成,是访问、控制、修改浏览器的属性的方法BOM 没有统一的标准(每种客户端都可以自定标准)。BOM 的顶层是 window 对象 window 对象 …

微机原理-基于8086电压报警器仿真系统设计

**单片机设计介绍,微机原理-基于8086电压报警器仿真系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086电压报警器仿真系统设计是一个综合了硬件和软件设计的复杂过程。以下是该设计概要的主要内容&…

TypeScript-自动编译

1.生成文件 tsc --init 2.修改配置文件 说明:通过CTRLF搜索到以下单词,进行修改。 "strict": true, //是否开启严格模式 "outDir": "./outFile", //表示ts文件最终编译为js文件,js文件存放的位置 3.新…

QML通过鼠标拖动的位置

当通过鼠标拖动Rectangle 的位置时,可以使用Qt Quick的MouseArea组件来实现 Rectangle {id: rectx:0;y:0width: 200; height: 100color: "lightblue"MouseArea {id: mouseAreaanchors.fill: parentdrag.target: rect//要拖动的项目的IDdrag.axis: Drag.XA…

C# 实践【WebService编写调用】

Webservice 学习 创建发布调用 创建 新增专案 点击确定,选择空白 右击新建好的专案下图中操作 新增项目选择 WEB 服务(ASMX) 新增项目完成,添加Web方法 启动之后的效果如下 调用方法测试接口 测试结果如下&#xff…

Docker镜像其他相关操作

镜像其他相关操作 1. 镜像备份 使用 docker save 将指定镜像保存成 tar 归档文件。 docker save [OPTIONS] IMAGE [IMAGE...] docker save -o /root/mycentos7.tar mycentos:7-o:镜像打包后的归档文件输出的目录。 2. 镜像恢复 使用 docker load 导入 docker s…

【活动回顾】| ABeam德硕受邀参加SAC+AI 智能分析与预算管理体验营并发表演讲

近日,主题为“商业AI,智慧未来”的SACAI 智能分析与预算管理体验营顺利召开,本次活动由SAP主办,ABeam中国受邀出席并发表专题演讲【云端计划,预见未来——SAP分析云全面预算案例分享】。 现场照 随着AI再次成为科技界和…

基于YOLOV5+Pyqt5农作物叶片病害检测系统

1、引言 农作物病害的精准检测与识别是推动农业生产智能化与现代化发展的重要举措。随着计算机视觉技术的发展,深度学习方法已得到快速应用,利用卷积神经网络进行农作物病害检测与识别成为近年来研究的热点。基于传统农作物病害识别方法,分析…

高阶DS---AVL树详解(每步配图)

目录 前言: AVL树的概念: AVL树节点的定义: AVL树的插入(重点) AVL树的旋转: (1)新节点插入较高左子树的左侧---右单旋 (2)新节点插入较高右子树的右侧---左单旋 …

经纬恒润AUTOSAR产品成功适配芯来RISC-V车规内核

近日,经纬恒润AUTOSAR基础软件产品INTEWORK-EAS(ECU AUTOSAR Software,以下简称EAS)在芯来提供的HP060开发板上成功适配芯来科技的RISC-V处理器NA内核,双方携手打造了具备灵活、可靠、高性能、强安全性的解决方案。这极…

【嵌入式智能产品开发实战】(十二)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的安装运行】

目录 程序的安装 程序安装的本质 在Linux下制作软件安装包 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正&#xf…

Python学习之-协程

前言: 在Python中,协程(coroutines)是利用生成器(generator)的特性,来实现并发编程的一种方式。从Python 3.5开始,通过引入async和await关键字,Python对异步IO提供了更原生的支持,使得协程成为了实现异步编…

脑机辅助推导算法

目录 一,背景 二,华容道中道 1,问题 2,告诉脑机如何编码一个正方形格子 3,让脑机汇总信息 4,观察图,得到启发式算法 5,根据启发式算法求出具体解 6,可视化 一&am…

【Blockchain】GameFi | NFT

Blockchain GameFiGameFi顶级项目TheSandbox:Decentraland:Axie Infinity: NFTNFT是如何工作的同质化和非同质化区块链协议NFT铸币 GameFi GameFi是游戏和金融的组合,它涉及区块链游戏,对玩家提供经济激励&#xff0c…