时间序列预测:MTGNN学习笔记 Multivariate Time Series Forecasting with Graph Neural Networks

MTGNN学习笔记

Multivariate Time Series Forecasting with Graph Neural Networks
提出一个专门针对多元时间序列数据设计的通用图神经网络框架。
通过图学习模块自动提取变量之间的单向关系,变量属性等外部知识可以很容易地集成到图学习模块中。
进一步提出了一种新的混合跳传播层和扩展初始层来捕获时间序列中的时空依赖关系。



MTGNN的框架

  • 1 × 1标准卷积首先将输入投影到潜在空间
  • 然后将时间卷积模块和图卷积模块相互交错,分别捕获时间和空间依赖关系
  • 控制时间卷积模块的接受域大小的超参数扩张因子d以q的指数速率增加
  • 图学习层学习图卷积模块使用的隐藏图邻接矩阵
  • 在模型中加入了残余连接和跳跃连接,避免了梯度消失的问题
  • 输出模块将隐藏的特征投影到所需的维度以获得最终结果

在这里插入图片描述
在这里插入图片描述


一、Graph Learning Layer 图学习

[单向关系邻接矩阵怎么来? 单向关系怎么卷积? ]
在这里插入图片描述
图学习层的作用:
在这里插入图片描述
在这里插入图片描述

二、Graph Convolution Module 学习空间结构

1.模型结构

Graph Convolution Module 学习空间结构

2.Mix-hop Propagation Layer

Mix-hop Propagation Layer

三、Temporal Convolution Module 学习时间序列信息

1.模型结构

Temporal Convolution Module

2.Dilated+inception layer

在这里插入图片描述

四、跳跃连接层 Skip Connection Layer

本质上是1xLi的标准卷积,其中Li是第i个跳跃连接层输入的序列长度。它将跳转到输出模块的信息标准化,使其具有相同的序列长度1。

五、输出模块 output layer

由两个1x 1的标准卷积层组成,将输入的通道维度转换为所需的输出维度。如果我们只想预测未来的某个步骤,那么期望的输出维数是1。当我们想要预测连续Q步时期望的输出维数是Q。

六、空洞卷积与感受野计算

在这里插入图片描述

根据上图可以归纳出感受野的计算公式总结,一共有两种,一种是层-层之间的推导递推关系,一种是计算“最大感受野”——即计算最后一层的featuremap的一个像素点对应的感受野的范围。
论文对应代码中的感受野计算:

【1】 层与层之间的感受野: r l = r l − 1 + ( k − 1 ) × ( s l a y e r − 1 ) r_l = r_{l-1} + (k - 1) × (s^ {layer - 1}) rl=rl1+(k1)×(slayer1)
其中:rl代表当前层感受野,rl-1代表前层感受野,k: kernel size ;s: stride (dilation exponential) ; layer:当前层数

【2】最大感受野:第l层感受野 r l = r 0 + ( k − 1 ) × ( s l a y e r − 1 ) r_l = r_0 + (k-1) × (s ^ {layer} - 1) rl=r0+(k1)×(slayer1)
其中:k: kernel size ;s: stride (dilation exponential) ; layer:当前层数

for j in range(1,layers+1):
	if dilation_exponential > 1: # 空洞系数>1
	    # dilation_exponential:stride(here it's 2), kernel_size = 7, layer:当前层数
	    # rf层与层之间的递推公式: rf_l = rf_l-1 + (k - 1) * (s**(layer-1)) 
	    # rf_0=1, rf_1=1+6*1=7, rf_2=7+6*2=19, rf_3= 19+6*4= 43, rf_4= 43+6*8= 91, rf_5= 91+6*16 = 187
	    # rf_size_j:本层的感受野
	    rf_size_j = int(rf_size_i + (kernel_size-1)*(dilation_exponential**j-1)/(dilation_exponential-1)) 
	else:
	    rf_size_j = rf_size_i+j*(kernel_size-1)
self.seq_length = seq_length
kernel_size = 7  # 卷积核为7
if dilation_exponential>1: 
    # 最大rf感受野公式: rl = r0 + (k-1) × (s ^ layer - 1)
    # r0 =1, kernel = 7, s =2
    # self.receptive_field = 1 + (7-1) * (2^5 -1) / (2-1) = 187  
    # 【最后一层的featuremap的一个像素点对应的感受野的范围】
    self.receptive_field = int(1+(kernel_size-1)*(dilation_exponential**layers-1)/(dilation_exponential-1))
else:
    self.receptive_field = layers*(kernel_size-1) + 1

文中的Dilated_inception Layer设计实现

class dilated_inception(nn.Module):   # dilated空洞卷积 + inception设置多种卷积核 【具有多个不同卷积核大小的扩张卷积层,并将它们的输出在通道维度上进行拼接】
    def __init__(self, cin, cout, dilation_factor=2):
        super(dilated_inception, self).__init__()
        self.tconv = nn.ModuleList()
        self.kernel_set = [2,3,6,7]  # 定义了四个kernelsize的滤波器
        cout = int(cout/len(self.kernel_set)) # 通过将cout除以self.kernel_set的长度,得到每个卷积核的输出通道数(相当于是平分),最后会再叠加在一起相当于channel不变
        
        # 通过一个循环遍历self.kernel_set列表,创建了多个卷积层,并将它们添加到self.tconv中
        # 每个卷积层的输入通道数为cin,输出通道数为计算得到的cout,卷积核大小为(1, kern),扩张因子为(1, dilation_factor=2)
        for kern in self.kernel_set:  
            self.tconv.append(nn.Conv2d(cin,cout,(1,kern),dilation=(1,dilation_factor))) # dilation第一个参数表示在输入张量的高度维度上的膨胀系数,第二个参数表示在输入张量的宽度维度上的膨胀系数

    def forward(self,input):  # input [32, 16, 137, 187]
        x = []
        for i in range(len(self.kernel_set)):
            x.append(self.tconv[i](input))  # x保存四个卷积核卷积之后的结果,x[0]:[32,4,137,186],x[1]:[32,4,137,185],x[2]:[32,4,137,182],x[3]:[32,4,137,181]
        
        for i in range(len(self.kernel_set)): # 对列表x中的每个元素进行切片操作,保留最后一个维度的一部分,因为上面得到的x[0]..x[3]最后一个维度不一样
            x[i] = x[i][...,-x[-1].size(3):] # 就是相当于所有的x[0]~x[3]都取最后一个维度为181个元素
            # ...表示保持张量的所有维度,-x[-1].size(3)表示从最后一个的倒数第x[-1].size(3)个元素开始切片,直到最后一个元素。
        x = torch.cat(x,dim=1) #可以拼接啦
        return x

总结

提出了一种新的多元时间序列预测框架。是第一个通过基于图的深度学习方法解决多元时间序列预测问题的论文。提出了一种利用多时间序列间固有依赖关系的有效方法。该方法在多种多元时间序列预测任务中表现出优异的性能,为使用gnn处理多种非结构数据打开了新的大门,yyds。
论文原文:
在这里插入图片描述
论文链接https://arxiv.org/pdf/2005.11650
代码可讨论分享

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值