交通预测一直是一个重要的问题,它涉及到交通运输系统的可靠性和效率。随着人工智能的发展,越来越多的研究者开始使用深度学习模型来解决这个问题。其中,基于Transformer的交通预测模型在近年来备受关注,因为它们具有优秀的建模能力和较好的预测准确性。
本文将介绍几个基于Transformer的交通预测模型,欢迎讨论。如有错误,也请指正。
目录
论文:[2001.02908] Spatial-Temporal Transformer Networks for Traffic Flow Forecasting
代码:GitHub - Lin956/STTNS: Spatial-Temporal Transformer Networks for Traffic Flow Forecasting
作者:Xu M, Dai W, Liu C, et al.
针对问题:
动态空间相关性:空间相关性随时间变化(实时的交通状况和交通流方向) <—— 设计了一种GNN变体,spatial transformer建模时变有向空间相关性;
长期时间相关性:长期时间相关性(短期<30min,长期>=30min)考虑得少,且过去自回归方法存在误差累积问题<—— 设计了 temporal transformer实现长期多步预测。
模型设计:
所提出的STTN(Spatial-Temporal Transformer Network)由堆叠的时空块和预测层组成。每个时空块由一个空间transformer和一个时间transformer组成,共同提取上下文动态依赖的时空特征。时空块可以进一步堆叠,形成深层时空特征的深层模型。然后,预测层利用两个1 × 1卷积层聚合这些时空特征进行交通预测。
在空间transformer中包含固定图卷积层(Fixed Graph,使用图卷积捕获平稳的空间依赖关系)、动态图卷积层(Dynamical Graph,使用多头自注意力捕获动态双向的空间依赖关系,节点特征用在前馈神经网络中)以及门控机制(融合上述固定与动态的空间特征)。

论文:[2104.05163] Learning dynamic and hierarchical traffic spatiotemporal features with Transformer
代码:暂未找到
作者:Yan H, Ma X, Pu Z.
针对问题:
GNN的局限性:
模型设计:
Traffic Transformer由两个主要部分组成。一个叫全局编码器,另一个叫全局-局部解码器。几个全局编码器和全局-局部解码器块堆叠起来,形成一个层次结构特征的深层模型。全局编码器和全局-局部解码器分别提取全局空间特征和局部空间特征。全局-局部解码器还融合了全局空间特征和局部空间特征。此外,时间嵌入块提取模型的时间特征。然后,位置编码和嵌入块帮助模型理解节点的绝对位置和相对位置。最后,一个Linear层聚合学习到的特征进行最终预测。
全局与全局-局部的区分是使用K-hop邻接矩阵定义的mask忽略非局部节点来提取局部空间特征。这种多头注意是全局和局部空间特征的融合,其表现优于通过注意机制简单地添加或串联。

作者:Guo S, Lin Y, Wan H, et al.
针对问题:
模型设计:
该模型思想是直接在时间和空间维度用自注意力建模与相关的复杂动态性。整个架构跟经典的transformer是一样的。主要有三点不同:
1)position embedding包含时空两个维度
时间的与原Transformer的一致,空间的是首先通过无监督图嵌入技术学习节点的表示,然后将学习到的表示作为节点嵌入向量的初始化,再根据监督信号进行微调,最后应用GCN层进行拉普拉斯平滑,得到最终的空间位置嵌入矩阵。
2)多头注意力机制模块他重构成了自己的时间趋势感知多头自我注意力
使用1D卷积替代原本多头自注意力Q、K的线性投影。由于卷积运算通过将局部上下文作为输入来计算表示,因此模型可以了解隐藏在交通流数据中的局部变化趋势。
3)Feed-forward模块被替换成了动态空间图卷积
其思想是利用自注意机制动态计算节点间的空间相关性强度,即把静态邻接矩阵与前面注意力模块的输出空间相关性矩阵作点积,再GCN。

论文: Meta Graph Transformer: A Novel Framework for Spatial–Temporal Traffic Prediction
作者:Ye X, Fang S, Sun F, et al.
针对问题:
模型设计:
MGT采用编码器-解码器架构。编码器和解码器都使用跳过连接堆叠多个子层。利用Temporal Self-Attention (TSA),Spatial Self-Attention (SSA)和 Temporal Encoder-Decoder Attention (TEDA)三种注意层来学习时空相关性。所有注意层都使用Spatial–Temporal Embeddings (STEs)来执行Spatial–Temporal Heterogeneity-Aware (STHA) attention操作。 Transition Matrices (TMs)被SSA用来执行稀疏空间注意。采用自回归方法逐步预测未来交通状态。
TSA:为每个head创建一个带有隐藏层的多层感知器,取消多头自注意力共享参数机制;
SSA:通过element-wise将转移矩阵中的动态注意系数和静态值联合确定相邻节点的权值;
TEDA:该模块目的是自适应地参与沿时间维度的Encoder特征。Q来自Decoder,而K和V来自Encoder。随后K、V执行STS-guide的时间注意操作。

论文: [2207.05064] Adaptive Graph Spatial-Temporal Transformer Network for Traffic Flow Forecasting
代码:GitHub - yokifly/ASTTN_pytorch
作者:Feng A, Tassiulas L.
针对问题:
模型设计:
它由输入层、时空嵌入层、具有残余连接的堆叠的ST注意块和输出层组成。模型的输入包括特征矩阵和底层图形结构. 每个ST注意块的输入和输出具有相同的尺寸以便于残差连接。嵌入层利用图结构对结构信息进行编码,并利用ST注意块计算局部MSA(multi-head self-attention)。

Local Spatial-Temporal Attention
如下图所示,在构建时空图Transformer时,可以考虑不同的注意力机制。带有颜色的项表示对应的两个节点(由行和列索引确定)将相互关注,不同的颜色对应于不同类型的attentions。本文所使用的的是Local st-attention与Adaptive st-attention。
Local st-attention
利用空间邻接性,通过将st-attention保持在空间1跳邻域内来降低注意力的复杂性,具体方法即Q、K点积缩放后得到的空间相关性矩阵再乘一个掩码矩阵。
Adaptive st-attention
使用两个可学习随机初始化的节点嵌入来计算自适应可学习邻接矩阵,随后对其应用局部注意力。

作者:Jiang J, Han C, Zhao W X, et al.
针对问题:
模型设计:
PDFormer模型由数据嵌入层、堆叠的 L个时空编码层和输出层组成。时空编码层包括三个核心组件:语义空间自注意力用来捕获距离远但功能相似的节点的空间相关性、带有延迟感知特征转换模块的地理空间自注意力模块用来建模距离近的节点的空间相关性并且考虑空间信息的传播延迟、时间自注意力模块用来捕捉动态和长时间模式。

语义空间自注意力
与ASTTN 的Local st-attention类似,都是在得出空间相关性矩阵后乘一个掩码矩阵,对于语义空间自注意力,掩码矩阵是使用动态时间规整(DTW) 算法计算节点之间历史交通流的相似度,每个节点选择相似度最高的K个节点作为其语义邻居,权值为1,否则为0。
地理空间自注意力模块
地理空间自注意力同样乘一个掩码矩阵,不同的是只有当两个节点之间的距离小于阈值λ时,权值为1,否则为0。
延迟感知特征转换模块
延迟感知特征转换模块的思想是使用K-shape从历史交通数据中识别出一组具有代表性的短期交通模式,然后比较每个节点的历史序列与提取的模式集,将相似模式的信息融合到每个节点的历史序列表示中。
考虑到交通流的延迟传播在远处影响很小,所以只作用在地理空间自注意力模块的Key矩阵中。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案