复杂动态系统的图。由ChatGPT生成的这张图。
图神经网络(GNN)可以用于执行节点、边和图级别的任务,通过学习图的节点嵌入表示。然而,许多图并不是静态的。它们往往会随着时间的推移或在特定事件和条件触发下发生变化,改变节点或边的特征,甚至改变整个图的结构。此外,由于网络结构的特性,一次变化可能会引起整个网络的连锁反应。当图变得非常复杂且动态时,找到变化的根本原因变得非常困难。
一个实际的例子是在软件工程中,为了提高可测试性并在大型系统中实现职责分离,其中一个方法是将软件组织成独立的模块。通过某种通信媒介将多个软件模块连接在一起时,它们会协同工作以实现相同的目标,这样。例如,开源框架如Apache Airflow 和 Robotic Operation Systems 允许用户将软件组织成依赖单元或模块,以形成数据处理流水线。这样的软件模块网络可以建模为有向循环图:每个模块都从其他模块获取输入并为下游模块生成输出。
ROS示例图形成的数据处理管道: researchgate.net
然而,这种架构存在级联故障的问题,即一个节点故障可能会导致下游节点以级联的方式相继故障。故障可能出现多种形式,比如一个节点接收到无效输入,生成无用输出,或者因软件崩溃而完全失去响应。对于复杂的图,当用户需要处理大量的日志数据或警报时,故障排查可能会变得非常困难,可能还需要专门领域的知识来高效地定位根本原因。因此,当出现故障时,有一个方法来预测或识别根本原因,对于保持系统可靠性并最小化停机时间至关重要。
受到这个现实挑战的启发,我们想尝试用图神经网络方法来模拟动态系统,并对类似软件工程示例的情景进行根本原因分析(RCA)。
创建我们自己的模拟的动力来源在我们的文献回顾中,我们发现捕获此类失败场景的真实世界数据通常是专有的。我们遇到的大多数与RCA相关的出版物使用专有数据集或模拟了自己的数据([1],[2],[3],[4]),但并未提供详细的模拟代码或故障注入方法的说明。因此,我们开发了一个图执行工具,它允许我们系统化地生成图特征并在受控条件下注入故障。在这种设定下,给定一组节点和边,每条边表示节点之间的发布-订阅关系,执行器根据用户提供的预定义规则,在每个时间点生成图的节点特征。
图执行引擎配置和输出:图执行引擎以节点定义配置和故障注入配置为输入,在每个时间点模拟图节点的特征,最多模拟最多步数。输出是一个在指定时间点注入故障的节点特征时间序列,其中指定的时间点由故障注入配置或模拟运行来确定。
用户可以定义节点间的连接性及其行为,例如发布、订阅和定期任务,如下所示的Yaml配置块。
一个名为 ‘A’ 的节点的示例 YAML 配置
订阅者节点可以定义如何处理接收到的消息,通过以下配置块指定如果消息值超出了范围或缺失时应如何处理。在以下示例中,它将生成错误消息进一步影响下游节点,这模拟了一个节点接收到无效输入并发送无效输出到其他节点的情况,这将影响其相邻的节点,并最终随着时间推移在整个图中传播。
名为 ‘B’ 的节点的示例 YAML 配置
我们的执行程序具有一套丰富的配置语言,包括延迟和丢弃周期回调,延迟和丢弃接收新消息,甚至导致节点崩溃。下图展示了节点是如何通过配置中指定的主题进行连接的。
在发布订阅框架中的图形配置实例
下面就是注入的故障配置:
一个使摄像头节点崩溃的故障注入配置示例
这是一个示例配置文件,用于忽略从主题接收到的消息。
当提供故障注入配置时,我们的图执行器将会干扰指定的节点并执行相关动作。用户可以立即看到动态图如何响应注入的故障。为了帮助配置问题排查,可以查看完整的图事件跟踪记录。
图中节点的一个例子追踪
我们的GNN方法的目的是处理系统图的时间序列,并确定故障(如果发生)在哪个时间点出现(图分类任务),并定位故障节点(节点分类任务)。这个流程如下图。
展示了GNN建模流程,动态图是如何通过模型处理的,从中学习局部和时间模式。
使用图执行器模拟器可以让我们生成大量的时序图数据,并在不同规模或连通性图上对我们的模型架构进行性能测试。例如,我们可以在一个类似于自动驾驶车辆系统的图上训练GCN,该图包含200个节点和1000条边,然后看看这种模型在另一个模拟在线电子商务系统的图上表现如何,该图包含50个节点和200条边。训练数据可以通过一组预定义的故障注入行为生成。用户应该能够配置我们的模拟器来丢弃从某个节点发布的任何消息,并观察这种故障的连锁反应。此外,模拟器还允许节点配置中存在一定随机性,使我们能够模拟真实世界的行为,如软件节点之间的信息传递延迟,或者可能导致节点行为异常的代码中的错误或缺陷。为了增加训练数据的多样性,我们的模拟器还应该允许用户在不同节点和不同时间注入多个故障。在项目结束时,我们计划向更广泛的科研社区开放我们的配置型图执行器模拟器,以解决文献中提到的合成数据问题。
使用我们的图执行器,我们创建了一个接近现代自动驾驶汽车的软件架构(具有合理相似的拓扑结构)的图配置,并在不同的时间向图中注入不同的故障,以收集大量图数据。该执行器能够为用户生成可视化,帮助他们理解动态图系统的内容。蓝色节点表示正常节点,红色节点表示故障节点。
例如,自主车辆软件栈通常包括传感器、地图、感知、运动规划和控制子系统。该模块位于软件栈的最底层,当摄像头传感器模块发生故障时,故障会首先导致地图和感知节点的失效,进而影响运动规划系统,最终导致车辆控制系统失效:
相机节点出故障会导致连锁反应的故障。
同样,当我们阻止GPS驱动程序时,地图和定位系统会首先失效,导致感知、运动规划和控制等环节出现级联失效。
如果一个GPS节点延迟了,可能会引发一系列连锁反应,进而导致故障。
另一方面,用户可以在软件堆栈的中间注入一个较轻的错误,这只会导致单一子系统(映射)失效,而不会影响下游的子系统,因为这些子系统在某种程度上具有对注入错误的抵御能力。例如,这种故障传播模式可以被描述为局部的。
延迟处理地图节点会导致地图映射子系统出现局部故障
如您所见,一些故障表现出周期性行为,因为节点通常会定时执行任务。故障扩散需要一段时间,其模式对于没有专业知识的人来说是高度不可预测的。该仿真器对于研究动态图系统的特性来说非常重要。我们的代码库包含了一系列用于生成训练数据集的故障。为了增加数据集的多样性,图执行器能扫描所有可用的故障并在不同时间注入。动态图系统在故障注入的时间不同的情况下,其响应可能会有所不同。在现实中,这种规模的故障注入仿真通常难以实现,但使用我们的图执行器并提供相应的配置,是极其可行的。
数据集为了构建用于模型训练的数据集,我们处理了来自图执行器的模拟运行输出,使用了节点配置与故障配置来指定上述gif中可视化图的结构。模拟输出包含节点特征的时间序列数据、图结构(即连接节点的边)以及故障标签(故障节点及其时间戳)。数据集中的每个torch_geometric.data
对象实例表示一个“快照”,即在给定时间t_i
上的图G节点特征和标签。这些快照按照时间顺序从t_1
到t_n
输入,以便模型能够区分系统的正常状态和故障状态,并模拟此类RCA工具在实际流图数据集上的实时分类操作方式。
对于每个 torch_geometric.data
对象,节点特征的维度是 “num nodes”
x “num features”
。每个节点包含 9 个特征。
- 订阅数
- 发布数
- 循环周期
- 上次事件时间戳
- 上次事件类型
- 回调类型
- 循环计数
- 接收总消息数
- 发布消息数
节点标签的维度是num nodes
x1
,健康的节点标记为0,如果是根本原因节点则标记为1。在故障时间戳之后的快照中,我们将根本原因节点的标签保持为1。
使用我们的图生成器,我们基于自动驾驶车辆作为模型动态系统模拟了一个图数据集。我们的目标是将GNN应用于分类上述动态网络系统中的根因节点(标记为1)。模拟的动态图数据集具有四个主要特征:首先,数据集具有局部和时间模式,因为故障通常会以周期性模式扩散;其次,图是具有方向性和异构性的;第三,由于异常事件较为罕见,数据集存在高度不平衡的现象。在这个项目中,为了简化处理,我们将图视为同质图,并实验了三种类型的图卷积层,即GCN、GraphSAGE 和 GAT。
有向图的分析与学习在我们的仿真系统中,节点之间的通信是有方向性的,因此边 src->dst
应该与 dst->src
区别对待。我们定制了三种有向卷积层:DirectedGCNConv
、DirectedSAGEConv
、DirectedGATConv
。为了在不同卷积类型之间保持公平比较,定向层通过相同的机制来学习方向差异,通过为 src->dst
和 dst->src
分别应用不同的权重矩阵来实现。
有向GCN卷积层(
(从源到目标的卷积): GCNConv(9, 18, 聚合方式='平均')
(从目标到源的卷积): GCNConv(9, 18, 聚合方式='平均')
)
有向SAGE卷积层(
(从源到目标的卷积): SAGEConv(9, 18, 聚合方式='平均')
(从目标到源的卷积): SAGEConv(9, 18, 聚合方式='平均')
(线性层自): 线性层(输入特征=9, 输出特征=18, 偏置=True)
)
有向GAT卷积层(
(从源到目标的卷积): GATConv(9, 18, 头数=18)
(从目标到源的卷积): GATConv(9, 18, 头数=18)
)
发现罕见事件
异常事件在现实世界中较为罕见,我们的模拟也符合这一现象。平均来看,包含异常节点的图与仅含正常节点的图的比例大约为1比4,而在节点层面,异常节点与正常节点的比例约为1比100。此外,在故障注入发生前,时间戳快照中的图只包括正常节点,这在时间序列数据集中平衡类别方面带来了额外挑战,因为在每个模拟回合的开始时,模型不会接触到异常样本。
此外,从实际应用来看,错过异常检测的风险可能比误报正常事件的风险更高。因此,我们设计了一种更为激进的训练策略,优先考虑罕见事件的检测而不是整体准确性,并将该策略应用于所有模型进行比较分析。该策略主要包括三个部分:按类别加权的损失计算方法、聚焦损失的反向传播和由宏观召回率监控的早停策略。
按类别加权的损失计算
计算 class_weights 的方式如下:
class0_weight = 总图数 / 包含 class0 的图数
class1_weight = 包含 class1 的图数与包含 class0 的图数比值 * 总图数 / 包含 class1 的图数
计算 class weights 的示例如下:
总图数:9367,class 0 的数量:9367,class 1 的数量:2368
tensor([ 1.0000, 15.6472])
这种加权损失计算方法在当模型错误地将异常事件分类时会给予更大的惩罚。
自定义的焦距损失反向传播算法
通过将反向传播与模型预测是否完美的条件结合,该方法确保模型仅在出现错误时更新其参数。这种方法还有可能通过避免在模型已经在给定批次上表现良好时进行不必要的更新,加快收敛速度。它迫使模型将学习重点放在更难或错误分类的例子上。
宏 召回率 评分 监督 的 提前 终止
这种方法通过在宏观召回率不再有效或高效提升时提前停止模型训练,优先考虑罕见事件检测而非全局准确度。由于召回率衡量了模型找到某一类所有相关实例的能力,而宏观召回率是根据各类别的数量无偏计算的,这迫使模型不再依赖于异常检测的表现而是优化所有类别的加权准确度。此外,该机制期望随着训练周期的延长,表现越来越好。触发提前停止的阈值会随着训练周期的增加而提高,要求模型达到其最佳表现的 >= (0.95+0.01*(训练轮次-1))
。这也就是说,模型在达到其最佳表现的 >= (0.95+0.01*(训练轮次-1))
时才会停止训练,确保当学习变得不那么高效时,模型会停止训练。
所有模型都应用两个卷积层,之后是一个线性层来进行分类。无论是空间模型还是时空模型,两者都会在每个卷积层前使用sigmoid激活函数,并在两个卷积层之间加入一个dropout层。此外,所有时空模型在卷积后还会应用一个GRU层来跟踪每个节点的隐藏状态。下图显示了空间模型和时空模型的结构。
模型结构,
结果部分 实验设定[GCNConv, SAGEConv, GATConv]
、[无向/有向]
和 [无GRU, 有GRU]
的组合产生了12个候选模型。将 学习率
固定为 0.001
和 权重衰减率
固定为 5e-4
,我们对每种特定类型的故障实例上训练每个候选模型,并在三个问题上评估每个训练好的模型。
1. 模型在训练数据集上的表现如何?
实验中使用的示例数据集例如:
crash_camera_driver1,1个实例,总图数:8877,类别0的出现次数:8877,类别1的出现次数:2048
2. 模型在相同类型的故障但不同的实例上的表现如何?
实验中使用的示例数据集例如:
crash_camera_driver1,1个不同实例,总图数:8843,类别0的出现次数:8843,类别1的出现次数:2048
3. 模型在不同类型的故障实例上的表现如何?
实验中使用的示例数据集例如:
crash_tracker,1个实例,总图数:8914,类别0的出现次数:8914,类别1的出现次数:1988
在处理空间模型时,因为不需要考虑时间顺序,数据加载器会随机打乱数据集;而在处理时空模型时,数据加载器则不会打乱数据,而是按照时间顺序将图传递给模型。
实验 1:在标准仿真上训练和评估模型。在我们进行的第一个实验中,我们训练并评估了我们的模型。该数据集总共包括200个实例。每个实例都是通过在随机时间戳处注入以下故障之一进行模拟来生成的:crash_camera_driver1
,crash_tracker
,drop_raw_camera1_publish
,drop_raw_camera1_receive
,mutate_raw_camera1_publish
。在每个实例期间,模拟会创建8000到10000个图,这些图代表了动态系统在特定时间戳下的离散快照。每个图包含29个节点,每个节点具有9个特征,41条有向边,以及每个节点都有一个二进制标签,0表示健康状态,1表示故障状态。动态系统在结构上是静态的,即在实例期间,图快照在结构上是相同的,但节点的特征值由于其自主行为而发生变化。
下面的图显示了每个模型在测试时产生的混淆矩阵。
访问该实验的混淆矩阵表、训练和测试的日志以及代码这里。
因为混淆矩阵没有被转换成百分比形式,所以用来显示每个类别的样本数量情况。
**===== 快速统计 =====
**精确度**:衡量正向预测的准确程度。
**召回率**:衡量模型找到所有相关实例的能力。
**F1 分数**:精确度和召回率的调和平均,平衡了这两个指标。
**支持度**:每个类的真实实例数。
**宏平均值**:在不考虑每个类支持度的情况下,取每个指标的平均值,提供一个不考虑权重的总体视角。
**加权平均值**:根据每个类中实例数加权,取每个指标的平均值。
有向卷积层与无向卷积层
总体而言,应用有向卷积层比应用无向卷积层表现更好。在评估训练实例(测试1)和相同类型的未见过错误实例(测试2)时,所有模型表现出相似的性能。在评估不同于训练错误类型的未见过错误类型实例(测试3)时,所有模型的表现明显更差。请记住,图系统在任何时候和任何情况下都保持结构不变,因此这表明,注入的故障类型独特且有效地影响了网络,并且模型正在学习特定故障的知识,而不是依赖常识。
在所有候选模型中,有4个模型在训练实例评估时达到了100%(2048/2048)的异常检测率(类别1的召回率为100%,没有将类别1误分类为其他类别)。这4个模型分别是:有向GCN(空间)、有向GAT(空间)、无向GRUGAT(时空混合)、有向GRUGAT(时空)。有向Graph SAGE(空间)在评估其训练实例时,检测到了大约84%(1561/2048)的异常节点。此外,有向GRUGAT的表现显著优于无向GRUGAT。因此,我们可以得出结论,有向卷积层优于无向卷积层。由于我们的数据集本质上是有向的,因此,对于我们的数据集来说,有向卷积层更为合适,这符合如果GNN模型能够很好地模拟真实数据集,那么GNN模型可能更好地学习数据集的特性的观点。实验结果还表明,图学习对信息流动的方向很敏感。
GCN 与 Graph SAGE 与 GAT5个有效异常检测模型中有3个使用了GAT卷积层,并在训练实例评估中实现了100%的异常检测。此外,有向GAT模型是所有候选模型中表现最好的,成功地检测到了所有异常节点,并且仅将254,399个正常节点中的288个误分类,达到了0.9991的宏平均召回率。因此,我们得出结论,GAT卷积层在三种卷积类型中表现最佳。GAT的高性能很可能得益于其多头注意力机制。对于第一个GAT卷积层,模型使用了特征维度的两倍数量的头。这有效地让每个节点能够学习其邻居的重要程度,并通过多头捕捉更多样化的关联信息。虽然两者都是顶尖表现者,但有向GAT(空间)模型的表现优于有向GRUGAT(时空)模型。由于多头注意力机制已经将输入形状从(节点数量:29,特征维度:9)
转换为(节点数量:29,特征维度*头:324)
,额外的GRU层可能过拟合并引入了不必要的噪声。这可以作为下一步实验。
平均来说,时空模型通常会在触发早停之前比空间模型训练更多的轮次。由于早停是在当宏评分不再有效提升时触发的,这表明时空模型可能拥有更加稳定的学習过程。训练轮次的多少也和模型的表现成正比。
根据这些实验来看,说了这么多,空间模型比时空模型更有效。这些发现背后的可能原因有:比如
- 动态系统中的局部通信模式可能比单个节点的行为历史更能反映节点的行为健康状况。
- 全局故障传播可能会表现出一种周期性模式,其中节点集群在正常和故障状态之间振荡,这可能需要模型记住一段较长的历史记录才能变得有用。
- 在卷积之前应用GRU是否比在卷积之后应用GRU更好,这引发了一个疑问。
- 调整超参数(如隐藏维度、dropout和学习率)并在各个时间点应用批归一化,可能有助于减少过拟合并促进模型更有效地学习。
总的来说,本次实验中,我们的观察结果和发现总结如下所示:
- 有向卷积比无向卷积产生更好的结果,这与假设相符,即如果消息传递更接近实际网络系统,模型往往表现得更好。
- GAT卷积比GCN和Graph SAGE表现更好,展示了多头注意力机制在学习跨通信的网络中的复杂关系时的优势。
- 根据实验设置,空间模型比时空模型更有效,进一步研究这一观察结果可能是未来实验的一个有趣方向。
使用与之前相同的实验设置,我们使用了一个扩展了之前数据集并增加了更多节点(总共46个节点)和更多软件模块间边连接的数据集来训练和评估这些模型。这种增强的图形可以在之前提到的故障可视化(.gif)中看到。在向数据中注入相机驱动程序#1随机崩溃的故障后,我们训练了模型,并对测试数据进行了评估。结果如下。
GNN模型在与训练数据相同故障类型(碰撞摄像头司机#1)的未见过的数据上的结果。每一列的最高分数都用粗体标出。在此实验的Colab笔记本中查看这里获取更多详情。
根据这些结果,我们观察到通常有向图模型优于无向图模型,而空间模型的表现优于空间-时间模型。在空间模型中,GCN和GAT模型表现相似,在类别0上,这两者具有高精度和召回率,而在类别1上,它们的精度较低但召回率较高。这在数据集本身不平衡的情况下合乎情理的,其中0标记的节点实例多于1标记的节点。总的来说,有向GraphSAGE模型表现最佳,两类(0和1)的精确度、召回率和F1值均较高。
在这些时空模型中,GRUGCN 和 GRUGAT 模型在预测类别 1 时表现明显不佳,这些模型的精度、召回率和 F1 分数都是 0。相比之下,GRUSAGE 模型在预测类别 1 时略有提升,但仍然不如纯空间模型的表现。
我们注意到,几个模型在各项指标上的得分相同,例如无向和有向的GCN,以及无向的GraphSAGE。在排除了我们代码中可能存在错误的问题之后,因为这些模型在训练过程中的指标不同,我们得出了这样的结论,这些得分的相似性是由于我们使用的预测机制:应用Sigmoid层得到类别0和1的预测分数后,每个节点的预测值是得分最高的类别。因此,最终的预测是由相对分数而不是绝对差异决定的。当不同模型预测分数的相对排名一致时,这种方法可能会导致相同的分类结果。
摘要我们实现了一个具有故障注入能力的图执行器,以便研究动态图在异常情形下的反应。虽然执行器的目标是近似发布-订阅图,经过各种简化,它能够生成和提供不依赖特定应用场景的节点特征。这些特征对所有基于发布-订阅的系统来说都很重要。在实际应用中,我们期望更多的特定应用场景的特征能提升根本原因分析的性能。我们希望这个执行器能加速未来模型的研究和开发。
基于我们的实验,基于注意力的模型表现最好,但令我们惊讶的是,基于时间的模型表现较差。故障传播的性质高度依赖于状态。因此,建议未来的研究人员在这方面做更多的探索。在实际应用中,也值得尝试使用丢失部分特征转换数据的模型。
GitHub 代码库你可以在这里找到我们的GitHub仓库,用于图生成器模拟器:here。请参阅README以了解如何运行模拟的详细信息。该仓库还包括我们的pipelines相关的Jupyter笔记本。我们搭建了基础设施,使得人们可以通过Bazel确定性地重现结果。
[1] Ailin Deng 和 Bryan Hooi. 基于图神经网络的多变量时间序列异常检测研究。CoRR, abs/2106.06947, 2021.
[2] 李泽yan, 陈俊杰, 陈逸豪, 罗成阳, 赵逸维, 孙永谦, 随凯欣, 王希平, 刘大鹏, 金兴, 王奇, 裴丹. 在线服务系统中多维数据的通用且鲁棒的根源定位, 2023.
[3] 王东杰,陈征章,倪静超,唐梁,王征,符艳杰,陈海峰。用于因果发现和根因定位的分层图神经网络,2023。
[4] 颜嘉诚, 孙文婷, Purmehdi Hakimeh, Park Won, Deshmukh Kunal Rajan, Thakrar Nishank, Nassef Omar, 和 Jacobs Adam. 基于图神经网络的多变量时间序列KPI的无线网络根原因分析。在2022年IEEE/IFIP网络运营与管理研讨会上发表(NOMS 2022),第1至第7页,2022年。
共同学习,写下你的评论
评论加载中...
作者其他优质文章