(5)时间序列预测之PatchTST


文章信息

  1. 模型: PatchTST (Channel-independent Patch time series Transformer )
  2. 关键词:Transformer,通道独立,patch,多变量时间序列,自监督学习
  3. 作者:Yuqi Nie, Nam H. Nguyen, Phanwadee Sinthong, Jayant Kalagnanam
  4. 机构:Princeton University(普林斯顿大学), IBM Research
  5. 发表情况:发表于 ICLR 2023 ( Published: 02 Feb 2023, Last Modified: 25 Nov
    2024 )
  6. 会议网址:A Time Series is Worth 64 Words: Long-term Forecasting with Transformers

前言

  1. Patching
      先前的多个Transformer模型专注于设计更稀疏的注意力机制。然而逐点的设计思路还是难以在信息利用率和计算复杂度上达到平衡。而通过patch可以提高对局部信息的提取,实现子序列级(patch之间)依赖关系的提取,同时降低计算复杂度。
  • 相比于点,片段具备更丰富语义信息;
  • 即便之前出现了Autoformer这种基于片段的,但其并不提取片段内语义,且片段附近的其他时间点受到了忽视。
  1. Channel-independence
      每个通道包含单个单变量时间序列,该序列在所有序列中共享相同的嵌入和Transformer权重。在patchTST中是将每个通道单独送入Transformer模块来实现的。
      例如之前的DLinear模型采用全连接结构,每个神经元对输入数据的权重是独立学习的,不考虑输入数据的通道关系。
    在这里插入图片描述  而通道混合(Channel-mixing)强调不同通道之间的相关性和交互性建模,提高模型的表达能力和泛化能力。

一、网络结构

patchTST  整体的结构是在Transformer的结构上构建的,在输入时进行了归一化和patching操作,在输出时进行反归一化操作,并利用线性展平层将不同patch合并得到对应输出。

Patching

  patching是沿着时间步进行划分的,通过滑动窗口来实现。这样一来可以将不同时间步之间注意力转变为同一特征不同patch之间的注意力。
patch

代码实现

class PatchEmbedding(nn.Module):
    def __init__(self, d_model, patch_len, stride, padding, dropout):
        super(PatchEmbedding, self).__init__()
        # Patching
        self.patch_len = patch_len
        self.stride = stride
        self.padding_patch_layer = nn.ReplicationPad1d((0, padding))  

        # Backbone, Input encoding: projection of feature vectors onto a d-dim vector space
        self.value_embedding = nn.Linear(patch_len, d_model, bias=False)

        # Positional embedding
        self.position_embedding = PositionalEmbedding(d_model)

        # Residual dropout
        self.dropout = nn.Dropout(dropout)

    def forward(self, x):
        # do patching
        n_vars = x.shape[1] # 特征数(通道数)
        x = self.padding_patch_layer(x)   # 划分前进行padding,
        x = x.unfold(dimension=-1, size=self.patch_len, step=self.stride)  # 划分padding
        x = torch.reshape(x, (x.shape[0] * x.shape[1], x.shape[2], x.shape[3]))
        # Input encoding
        x = self.value_embedding(x) + self.position_embedding(x)
        return self.dropout(x), n_vars

代码解读:
  以ETT数据集多对单的预测为例:

  1. 输入x: (Tensor:(32,7,96)) 依次对应batch_sizefeatureseq_len.
  2. padding的长度为滑动步长stride,padding后的长度为96+8=104.
  3. 对最后一个维度进行滑动取值,最后得到12个长度为patch_len=16的序列
    计算公式为 (seq_len − patch_len + padding)/stride + 1 = (96 - 16 + 8)/8 + 1 = 12.
    此时xTensor:(32,7,12,16)
  4. reshape:将前两维合并,得到尺寸为(224,12,16)的张量,对比原本的输入可以发现:原本计算96个点之间的注意力转变为了计算12个patch之间的注意力。(直到最后预测输出时再将前两维展平还原)

总结

  1. 优点:
  • 片段具备更丰富的语义信息
  • 使用channel-independent,不同通道会有不同注意力分数分布,从而使模型能够识别不同序列(不同通道)的个性行为
  1. 缺点
  • 由于使用channel-independent,有意不去捕获多变量时间序列不同序列(不同通道间)的依赖关系,缺乏关注不同序列的共性。

参考

论文研读之PatchTST:通道独立的时序Transformer

【汇报】时间序列预测阶段学习总结(Transformer,CNN,RNN,GNN)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值