1. 性能改进技术
赫兹量化考虑到所分析的源数据与模型复杂性之间的平衡,该方法的作者力求使用强大的深度学习技术(包括注意力机制和图神经网络 ( GNN ))实现具有竞争力的结果。与其他方法相比,这减少了参数和操作的数量。具体来说,论文作者使用以下内容作为其模型的输入数据:
-
代理的过去轨迹及其相应的交互是社交基础级别块的唯一输入
-
扩展,它将代理容忍区域的简化表示作为附加输入添加到制图数据库中。
因此,所提出的模型不需要高质量的完全注释的地图或栅格化的场景表示来计算物理环境。
该方法的作者建议使用一种简单但功能强大的地图预处理算法,其中首先过滤目标代理的轨迹。然后,他们计算目标代理可以交互的可行区域,仅考虑地图的几何信息。
社交基线使用最重要障碍物的过去轨迹作为相对位移的输入来馈送到编码器模块。然后使用图神经网络 (GNN) 计算社交信息。在他们的论文中,该方法的作者使用CrystalGraph 卷积网络( Crystal-GCN ) 和多头自注意力( MHSA ) 层来获取代理之间最显著的交互。之后,在解码器模块中,使用自回归策略解码这些潜在信息,其中第i步的输出取决于前一步的输出。
所提方法的特点之一是分析与具有整个时间范围T h = T obs + T len 信息的代理的交互。同时,在复杂交通场景中需要考虑的代理数量也减少了。代理i的输入不是使用绝对的 2D 视图,而是一系列相对位移:
添加图片注释,不超过 140 字(可选)
该方法的作者不限制或固定序列中的代理数量。为了考虑所有代理的相对位移,使用一个LSTM块,其中计算序列中每个代理的时间信息。
在按顺序对每辆车的分析历史进行编码后,计算代理之间的交互以获得最相关的社交信息。为此,构建了一个交互图。使用Crystal-GCN层构建图。然后应用MHSA来改进代理间交互的学习。
在创建交互机制之前,该方法的作者将临时信息分解为适当的场景。这考虑到每个运动场景可能有不同数量的代理。交互机制定义为双向全连接图,其中初始节点特征v 0i由运动历史编码器计算的每个车辆h i,out 的潜在时间信息表示。另一方面,从节点k到节点l的边由绝对坐标中时间点t obs,len处相应代理之间的距离向量e k,l表示:
添加图片注释,不超过 140 字(可选)
给定一个交互图(节点和边),Crystal-GCN定义为:
添加图片注释,不超过 140 字(可选)
该运算符允许赫兹量化嵌入边缘特征,以根据车辆之间的距离更新节点特征。该方法的作者使用了 2 层 Crystal-GCN,并使用 ReLU 和批量归一化作为层之间的非线性。
σ和μ分别为 sigmoid 和 softplus 的激活函数。此外,z i,j = ( v i ‖v j ‖e i,j ) 是GNN层中两个节点与对应边的特征的串联, N表示场景中的代理总数,W和b分别是相应层的权重和位移。
经过交互图后,每个更新的节点特征v i都包含有关代理的时间和社会背景i的信息。但是,根据当前位置和过去的轨迹,代理可能需要关注特定的社交信息。为了对这种方法进行建模,该方法的作者使用了具有 4 个头的多头自注意力机制,该机制应用于更新的节点特征矩阵V ,其中包含节点v i的特征作为字符串。
最终的社会注意力矩阵 SATT(社会注意力模块的输出,在GNN和MHSA机制之后)的每一行代表代理i与周围代理的交互特征,同时考虑到幕后的时间信息。
接下来,该方法的作者使用有关地图的最少信息扩展了社交基本模型,从中他们将目标代理的区域P离散化为围绕合理中心线(高级和结构化特征)的r 个随机选择的点 { p 0 , p 1 ...p r } 的子集,同时考虑到目标代理在最后一个观察帧中的速度和加速度。这是一个地图预处理步骤,因此模型永远不会看到高分辨率地图。
根据物理定律,该方法的作者将车辆视为刚性结构,在连续的时间戳之间不会发生突然的运动变化。因此,在描述道路上的驾驶任务时,通常最重要的特征是在特定的方向上(在运动方向上领先)。这允许获得地图的简化版本。
有关轨迹的信息通常包含与现实世界数据收集过程相关的噪声。为了估计最后一个观察帧t obs,len中目标代理的动态变量,该方法的作者建议首先沿每个轴使用最小二乘算法过滤目标代理的过去观察结果。他们假设代理以恒定加速度移动,并且可以计算目标代理的动态特性(速度和加速度)。然后,他们计算速度和加速度估计值的向量。此外,将这些向量作为标量相加以获得平滑的估计值,为第一次观察分配较小的权重(更高的遗忘因子λ)。这样,最近的观察在确定代理的当前运动状态方面起着关键作用:
添加图片注释,不超过 140 字(可选)
在哪里
观察长度 | 是观察到的帧的数量, |
ψ | 是帧 t中的估计速度/加速度, |
λ ∈ (0, 1) | 是遗忘因素。 |
计算出运动状态后,估计行进距离,假设基于加速度的物理模型,在任何时间t 具有恒定的转弯速度。
然后处理这些候选的合理车道轨迹,以用作合理的物理信息。首先,它们找到距离目标代理的最后一次观察最近的点,该点将代表合理中心线的起点。然后,它们估计沿原始中心线行驶的距离。它们将中心线m的端点索引p确定为累积距离(考虑每个点之间的欧几里得距离)大于或等于预先计算的偏差的点。
然后,他们在相应中心线m的起点和终点之间进行三次插值,以获得规划范围的步骤。该方法的作者进行的实验表明,考虑到目标代理的真实轨迹端点与过滤后的中心线端点之间的整个验证集的平均和中位距离L2,通过考虑运动状态下的速度和加速度并使用最小二乘法过滤输入,可以获得最佳先验信息。
除了这些高级结构化中心线之外,该方法的作者还建议根据正态分布N(0, 0.2)对所有合理中心线应用点扭曲。这将把合理区域P离散化为合理中心线周围r 个随机选择的点 { p 0 , p 1 ...p r }的子集。因此,他们可以大致了解被识别为低级特征的合理区域。该方法的作者使用正态分布N作为附加正则化项,而不是使用车道边界。这将防止编码模块中的过度拟合,类似于将数据增强应用于先前的轨迹的方式。
区域和中心线编码器用于计算潜在地图信息。它们分别处理低级和高级地图特征。每个编码器都由多层感知器 ( MLP ) 表示。首先,它们沿点的维度平滑信息,沿坐标轴交替信息。然后,相应的MLP(3 层,第一层有批量归一化、ReLU和DropOut)将围绕原点的解释绝对坐标转换为代表性的潜在物理信息。静态物理环境(区域编码器的输出)将作为不同模式的通用潜在表示,而特定的物理环境将说明每种模式的特定地图信息。
未来轨迹解码器是所提出的基线模型的第三个组成部分。该模块由一个LSTM块组成,该块以与在运动历史编码器中学习过去的相对运动相同的方式递归估计未来时间步骤的相对运动。对于社交基础情况,该模型使用社交互动模块计算的社交背景,仅关注目标代理的数据。社交背景本身代表场景中的所有流量,代表自回归 LSTM 预测器的输入潜在向量。
从模式m的制图基准角度来看,该方法的作者提出将潜在的交通上下文识别为社会上下文、静态物理上下文和特定物理上下文的串联,并将其作为 LSTM解码器的输入隐藏向量。
相对于社交情况下的 LSTM 块的原始数据,它由空间嵌入后编码的目标代理过去n 次相对运动表示,而制图基线则添加了目标代理当前绝对位置与当前中心线之间的编码距离向量,以及当前标量时间戳t。在这两种情况下(社交和地图),LSTM 块的结果都使用标准全连接层进行处理。
在时间步长t获得相对预测后,赫兹量化以某种方式移动过去观测的初始数据,以便将我们最后计算的相对运动带到向量的末尾,从而删除第一个数据。
计算出多模态预测后,将它们连接起来,并通过MLP残差进行处理以获得置信度(置信度越高,该状态越可能,越接近事实)。
论文作者提出的方法的原始可视化如下所示。这里蓝线代表社交信息,红线显示有关卡片的信息传输。
添加图片注释,不超过 140 字(可选)
2. 使用 MQL5 实现
赫兹量化已经考虑了所提方法的理论方面。现在让我们使用 MQL5 来实现它。如您所见,该方法的作者将模型划分为块。每个块使用最少的层数。同时,简化各个块的架构伴随着使用有关所分析环境的先验信息进行额外的数据分析。特别是,对地图进行预处理并过滤传递的轨迹。这允许您减少初始数据的噪音和数量,而不会损失构建预测轨迹的质量。
2.1 创建 CrystalGraph 卷积网络层
此外,在提出的方法中,我们遇到了以前从未遇到过的图神经层。因此,在继续构建所提出的算法之前,我们将在库中创建一个新层。
该方法作者提出的CrystalGraph卷积网络层可以用以下公式表示:
本质上,我们在这里看到的是 2 个全连接层工作结果的逐元素乘法。其中一个由 S 型激活,表示图顶点之间连接的可训练二进制矩阵。第二层由 SoftPlus 函数激活,它是 ReLU 的软模拟。
为了实现CrystalGraph 卷积网络,我们将创建一个新类CNeuronCGConvOCL ,继承CNeuronBaseOCL的基本功能。
类CNeuronCGConvOCL: 公共CNeuronBaseOCL { 受保护: CNeuronBaseOCL cInputF; CNeuronBaseOCL cInputS; CNeuronBaseOCL cF; CNeuronBaseOCL cS; //--- 虚拟 bool feedForward(CNeuronBaseOCL *NeuronOCL); //--- 虚拟 bool updateInputWeights(CNeuronBaseOCL *NeuronOCL); 民众: CNeuronCGConvOCL(无效){}; ~CNeuronCGConvOCL( void ) {}; //--- 虚拟 bool Init( uint numOutputs, uint myIndex, COpenCLMy *open_cl, uint window, uint numNeurons, ENUM_OPTIMIZATION 优化类型, uint batch); virtual bool calcInputGradients(CNeuronBaseOCL *prevLayer); //--- virtual int Type( void ) const { return defNeuronCGConvOCL; } //--- 处理文件的方法 virtual bool Save( int const file_handle); virtual bool Load( int const file_handle); virtual CLayerDescription* GetLayerInfo( void ); virtual bool WeightsUpdate(CNeuronBaseOCL *source, float tau); virtual void SetOpenCL(COpenCLMy *obj); };
我们的新类从父类接收一组用于覆盖和基本功能的标准方法。为了实现图卷积算法,我们将创建 4 个内部全连接层:
-
2 用于在反向传播过程中写入原始数据和误差梯度(cInputF和cInputS)
-
2 执行功能(cF和cS)。
我们将创建所有静态的内部对象,因此类的构造函数和析构函数将保持“空”。
在我们的Init类的初始化方法中,我们会首先调用父类的相关方法,该方法实现了对从外部程序接收的数据的所有必要的控制,并初始化了继承的对象和变量。