神经子图同构计数

摘要

        本文研究了一个新的图学习问题:学习计算子图同构。与其他传统的图学习问题,如节点分类和链接预测不同,子图同构计数是NP完全的,需要更多的全局推理来监督整个图。为了使其可扩展为大规模的图形和模式,我们提出了一个学习框架,增强不同的表示学习架构和迭代出席模式和目标数据图,以记忆子图同构搜索的中间状态,用于全局计数。我们开发了小图(每个图中≤ 1,024个子图同构)和大图(每个图中≤ 4,096个子图同构)集,以评估不同的表示和交互模块。诱变化合物数据集MUTAG也用于评估神经模型并证明迁移学习的成功。虽然基于学习的方法是不精确的,但与原始NP完全问题的指数时间相比,我们能够在线性时间内概括计算大型模式和数据图。实验结果表明,基于学习的子图同构计数可以在误差可接受的情况下,将传统算法VF 2的速度提高10- 1000倍。基于微调的域自适应也显示了我们的方法在现实世界中的应用程序的有用性。

CCS概念

        计算理论→模式匹配; 信息系统→信息集成。

关键词

        子图同构,动态存储,神经网络

一、简介

        计算子图同构的目的是确定给定图的匹配的子图的数量(即,同构于)感兴趣的特定图案图。它是知识发现和数据挖掘应用中有用的图相关任务之一,例如,在生物信息学中发现蛋白质相互作用[1,34],在化学信息学中为新药开发寻找活性化合物[24],以及在在线社交网络分析中挖掘社交结构[30]。此外,寻找子结构对于异构信息网络(HIN)(如知识图和推荐系统)是有用的[13,25,26,59]。HIN模式上的丰富类型提供了有意义的语义,因此计数本身对于各种类型的查询都很有价值。例如,在知识图谱中,我们可以回答诸如“非洲有多少种语言是居住在尼罗河沿岸的人说的?”在社交网络上,类似于“朋友对的数量,其中一个喜欢漫画,另一个喜欢其电影改编”的查询可以帮助简要介绍广告定向。

        然而,以前的研究类似的任务往往是在特定的约束条件下,和讨论的一般模式上的大型异构图是有限的。特别是,以前关于计数的研究减少到具有3-5个节点作为基元的小子图(不考虑同构)[34]或小图(限于诱导子图)[38]。此外,尽管定制的模式挖掘算法或基于图数据库索引的方法可以解决子图同构的一般问题[5,8,19,20,48],但由于任务的NP完全性质,所有这些算法都难以扩展到更大的图。为了在更一般和理论上基本的设置下扩展到更大的图,需要替代的可扩展方法。具体来说,我们转而通过机器学习来近似答案。图学习最近引起了人们的广泛关注,因为表示学习的神经方法已被证明对复杂数据结构有效[18,28,35,40,50,53]。不可否认,大多数现有的图表示学习算法都集中在节点分类和链接预测等任务上[17],这些任务来自局部结构的信息足以进行推理。这些任务与我们的任务不同,我们的任务是在整个图上计数。然而,最近已经证明,涉及全局推理的更具挑战性的推理问题,如汇总统计,关系argmax,动态规划和NP-hard子集求和,可以通过使用适当设计的架构进行学习来优雅地解决[54]。结果是鼓舞人心和令人鼓舞的。然而,在利用机器学习计算子图同构的目标面前仍然存在挑战:

  • 现有数据集的典型大小是有限的,远远不足以训练图神经网络。同时,与其他图学习问题(如最短路径[15]或中心性[11])相比,由于难以获得地面真值,因此为这个问题生成足够的训练数据是不平凡的。
  • 必须仔细选择合适的归纳偏置,以完成这一具有挑战性的任务[3]。因此,应该考虑以下考虑:首先,作为考虑异构节点类型和边类型的一般情况,为了表示和区分具有邻域结构的节点和边,应该应用更强和更复杂的表示学习技术。其次,任务不是在单个图上执行,而是涉及额外的模式。因此,在模型设计中必须考虑两个图之间的相互作用。第三,该模型将被训练并应用于不仅具有大型图形而且具有大量样本的数据集,考虑到可能模式的多样性。因此,还应考虑计算效率。

        在本文中,为了解决上述挑战,我们首先为我们的实验开发了两个大规模数据集,包括一个小图(每个图中的计数≤ 1,024)和一个大图(每个图中的计数≤ 4,096)。我们开发了一个框架来从我们的数据集中学习。为了在图神经网络中找到适当的归纳偏差,我们比较了提取节点和边的表示的不同方法,包括CNN [27],RNN如GRU [7],注意力模型如Transformer-XL [9],RGCN [40],这是异构图的图卷积网络的自然推广,以及RGIN,RGCN与最近的图同构网络(GIN)的扩展[53]。此外,我们开发了一个动态的中间注意记忆网络(DIAMNet),它迭代地参加查询模式和目标数据图扫描的数据图与局部结构记忆的全局推理。然后,我们对我们的合成数据集进行系统评估,以证明我们引入的归纳偏差的有效性。此外,我们还进行了实验,著名的基准数据集,MUTAG,显示的权力和实用性,我们的方法为真实的应用程序。

        我们的主要贡献概括如下:

  • 据我们所知,这是第一个将子图同构计数问题建模为学习任务的工作,其中训练和推理都具有线性时间复杂度,可根据模式/图大小和数据示例的数量进行伸缩
  • 我们在端到端学习框架下,利用不同深度神经网络架构的表示能力。特别地,我们为序列模型和图模型提供了通用的编码方法,并在此基础上引入了一个动态中间注意力记忆网络来解决更全局的计数推理问题.
  • 我们在两个合成数据集和一个著名的真实的基准数据集上进行了拓展实验,这表明我们的框架可以在相对较大的图和模式上实现良好的结果。有关数据和代码,请访问https://github.com/HKUST-KnowComp/NeuralSubgraphCounting

二、前言

        我们开始先介绍问题和我们的总体思路

2.1问题定义

        传统上,子图同构问题定义在两个简单图或两个有向简单图之间,这是一个NP完全问题。我们将问题扩展到更一般的情况下,有向异构多重图。图或模式定义为G=\left (V,E,X,Y \right ),其中V是顶点的集合,每个顶点具有不同的顶点id。E \subseteq V \times V是边的集合,X是将顶点映射到顶点标签的标签函数,Y是将边映射到边标签集合的标签函数。在异构多重图的背景下,每个多重边可以用一个有序的源和目标对以及一组边标签沿着来表示。也就是说,每个边可以用源、目标及其边标签唯一地标识。为了简化陈述,我们假设Y((u,v)) = \phi如果(u,v )\notin E。在这里,我们专注于保持图拓扑,顶点标签和边标签,但不是顶点ID的同构映射。更精确地说,一个模式G_P=\left (V_P,E_P,X_P,Y_P \right )同构于一个图G_G=\left (V_G,E_G,X_G,Y_G \right ),如果存在一个双射f:V_G \rightarrow V_p使得

\bullet \forall v \in V_G,X_G(v)= X_p(f(v))\\ \bullet \forall v \in V_P,X_P(v)= X_G(f^{-1}(v))\\ \bullet \forall (u,v) \in E_G,Y_G((u,v))= Y_p((f(u),f(v)))\\ \bullet \forall (u,v) \in E_P,Y_P((u,v))= Y_G((f^{-1}(u),f^{-1}(v)))\\

        然后,将同构于图G_G的模式G_P记为G_P \simeq G_G,将函数f记为同构。此外,模式G_P=\left (V_P,E_P,X_P,Y_P \right )同构于图G_G=\left (V_G,E_G,X_G,Y_G \right )的子图G_G^{'}=\left (V_G^{'},E_G^{'},X_G^{'},Y_G^{'} \right ),V_G^{'} \subseteq V_G^{'} ,\:E_G^{'} \subseteq E_G \cap \left ( V_G^{'} \times V_G^{'} \right )如果G_P \simeq G_G^{'}。双射函数f:V_G^{'} \rightarrow V_p称为子图同构。

        定义子图同构计数问题为求模式图G_P与图G_G之间所有不同子图同构的个数。示例如图1所示。

图一:不同设置中的子图同构计数示例:同构图、存在两种类型的节点的异构顶点图、以及存在两种类型的节点和两种类型的边的异构顶点和异构边图。

2.2总体思路

        因此,我们需要计算O\left ( Perm\left ( \left | V_G \right |, \left | V_P \right |\right ) \cdot d^{\left | V_p \right |}\right )用蛮力法解决子图同构计数问题,其中Perm(n,k) = \frac{n!}{(n-k)!}, \left| V_G \right ||图节点的数量\left| V_P \right |是模式节点数,d是最大度。Ullmann的算法[48],任务的标准精确方法,将搜索时间减少到O\left (\left | V_p \right | ^{\left | V_G \right |} \cdot \left | V_G \right | ^2\right ).

        由于计算成本呈指数增长,因此不可能应用于更大的图或模式。对于非指数逼近,我们可以应用神经网络以线性代价学习G_GG_P的分布表示。然后,为了进行预测,图和模式的节点或边之间的成对交互可以通过注意力来处理[2],在O\left ( \left | V_P \right | \cdot \left | V_G \right | + \left | V_P \right |^2+ \left | V_G \right | ^2\right )O\left ( \left | E_P \right | \cdot \left | E_G \right | + \left | E_P \right |^2+ \left | E_G \right | ^2\right )的复杂度之下.然而,当在大型图上查询时,这种二次复杂度仍然是不可接受的。不幸的是,如果用于处理交互的注意模块(尤其是自注意模块)完全不存在,则即使时间可以减少到O\left (\left | V_G \right | \right )O\left (\left | E_G \right | \right ),则模型的性能将受到严格限制,性能可能恶化。因此,在本研究中,我们引入额外记忆体的注意机制,以将复杂度降低至近似线性,而我们预期其效能会维持在可接受的程度。

三、方法论

图2:神经子图同构计数模型的一般框架

        学习计算子图同构的一般框架如图2所示。在我们的框架中,我们把图G_G看作包含信息的数据,把模式G_p看作从图中检索信息的查询。因此,计数问题可以自然地被公式化为在自然语言处理中很好地建立的问答问题(例如,[29])。除了文本和图形作为输入的差异之外,主要问题是在QA模型中,答案通常是从提供的文本中提取的事实,而在计数问题中,答案是匹配的局部模式的汇总统计。为了使问题可学习,图(或模式)应该表示为一系列边,或一系列相邻矩阵和顶点特征。图3显示了序列编码和图形编码之间的区别。对于序列输入,我们可以使用CNN [27],RNN如LSTM [22]或Transformer-XL [9]来提取高级特征。如果输入被建模为一系列相邻矩阵和顶点特征,我们可以使用RGCN [40]或GIN [53]的扩展来学习顶点表示,并从邻域传递消息。在获得模式表示和图形表示之后,我们将它们馈送到交互模块中以从每一侧提取相关特征。然后,我们将交互模块的输出上下文与大小信息馈送到完全连接的层中以进行预测。

图3:不同编码方法的两个视图。有三个顶点标签(标记为橙子、蓝色和黄色)和两个边标签(标记为实线和虚线)。附加的数字显示了顶点的一组可能的id。

3.1序列模型

3.1.1序列编码

        在序列模型中,图(或模式)的最小元素是边。根据定义,至少需要三个属性来标识边e,它们是源顶点idu、目标顶点idv和它的边标签y \in Y(e)。我们进一步添加顶点标签的两个属性以形成一个5元组\left ( u,v,X(u),y,X(v) \right )来表示边的标签,其中X(u)是源顶点标签,X(v)是目标顶点标签。五元组的列表被称为代码。我们遵循gSpan [55]中定义的顺序来按字典顺序比较代码对;附录A中给出了详细的定义。最小代码是具有相同元素的最小词典顺序。最后,每个图都可以用相应的最小代码来表示,反之亦然。

        假设一个图被表示为一个最小码,或者一个5元组的列表,下一个编码步骤是将每个5元组转换为一个向量。假设我们提前知道在一个数据集中|V|, |X|, |Y|的最大值,我们可以预先将每个顶点id,顶点标签和边标签编码成\textup{B-aray}数字,其中\textup{B}是基数,每个数字d \in \left \{ 1,2,\cdots, B-1 \right \}。我们可以将每个数字表示为一个one-hot vector,这样每个id或label就可以被矢量化为一个multi-hot vector,它是这些one-hot vector的串联。此外,5个多热向量可以连接以表示5元组。5元组的多热向量的长度为B \cdot \left ( 2 \cdot \left \lceil log_B\left ( Max\left ( \left | V \right | \right ) \right ) \right \rceil + 2 \cdot \left \lceil log_B\left ( Max\left ( \left | X \right | \right ) \right ) \right \rceil + \cdot \left \lceil log_B\left ( Max\left ( \left | Y\right | \right ) \right ) \right \rceil \right )。最小值是在B = 2时达到的。我们可以很容易地计算图元组的维数d_g和模式元组的维数d_p。此外,最小码可以被编码成一个多热矩阵,\mathbf{G} \in \mathbb{R}^{\left | E_G \right | \times d_g}对于图G_G\mathbf{P} \in \mathbb{R}^{\left | E_P \right | \times d_p}对于模式G_P

        这种编码方法可以扩展当我们\left | V \right |,\left | X \right |,\left | Y \right |有更大的值,例如,\left | V \right |只增加其对应于附加数字的多热向量的长度。因此,我们可以将新的数字视为前一个编码向量前面相同数量的零和一,例如,从0110延伸到01 · · · 010110。只要我们将与新扩展维度相关的模型参数初始化为零,扩展输入和参数就不会影响模型。

3.1.2序列神经网络

        给定3.1.1节中的编码方法,我们可以简单地将图嵌入为多热矩阵。然后,我们可以使用序列建模的一般策略来学习图中边之间的依赖关系。

卷积神经网络(CNNs)

        已被证明在序列建模中是有效的[27].在我们的实验中,我们堆叠乘卷积层和最大池层,以获得一系列高级特征。

长短时记忆体(LSTM)

        [22]广泛用于许多序列建模任务。它的存储器单元被认为能够学习长期依赖性。

Transformer-XL(TXL)

        [9]是Transformer架构[49]的变体,能够在不破坏时间一致性的情况下学习超过固定长度的长依赖关系。与原始的自回归设置不同,我们使用Transformer-XL作为特征提取器,其中注意力机制在整个序列上具有完整的,未掩蔽的范围。但其计算开销与数据段长度和内存大小成二次方增长,因此需要在性能和效率之间进行权衡.

3.2图模型

3.2.1图形编码

        在图模型中,每个顶点都有一个特征向量,每条边用于将信息从源传递到目标。GNN不需要显式的顶点ID和边ID,因为邻接信息包含在相邻矩阵中。如第3.1.1节所述,我们可以将顶点标签矢量化为多个热点向量作为顶点特征。(有向或无向)简单图的邻接信息可以存储在稀疏矩阵中,以减少内存使用量,提高计算速度。对于异构图,边的行为应该依赖于边的标签。因此,应该应用特定于关系的转换来混合边标签和拓扑信息,并将其传递给目标。

3.2.2图神经网络

        我们设置编码的顶点标签作为顶点特征,并通过边传播混合消息。

关系图卷积网络(RGCN)

        [40]专门用于处理现实知识库中的多关系数据。每个关系对应于一个转换矩阵,用于将特定于关系的信息从源转换到目标。提出了两种分解方法来解决参数数量随着关系数量的快速增长的问题:基分解和块对角分解。我们选择块对角分解,并遵循原始设置的均值聚合器。

图同构网络(GIN)

        [53]可以在多层感知器(MLP)和总和聚合器的帮助下更好地捕获同构图结构。我们在每个关系图卷积层之后添加MLP,并使用总和聚合器来聚合消息,我们将此变体命名为RGIN。

3.3动态中介注意记忆

表1:数据集统计。“#”表示数字,“A”表示平均值,“M” 表示最大值

        在从序列模型或列向量为维的图模型中获得图表示\widetilde{G}和模式表示\widetilde{P}后,我们将它们作为交互作用层的输入,以提取模式和图之间的相关上下文。一个天真的想法是使用注意机制[2]来建模这两种表示之间的交互以及图本身上的交互。然而,该方法由于进行序列建模其复杂度高达O\left (\left |E_P \right | \cdot \left |E_G \right | + \left |E_G \right |^{2} \right ),对于图形建模为O\left (\left |V_P \right | \cdot \left |V_G \right | + \left |V_G \right |^{2} \right )

图4:动态中介注意记忆网络(DIAMNet)。Φ1表示等式(1)和(2),Φ2表示等式(3)。(4)和(5),并且两种类型的门是Eqs。(3)和(6)

        为了解决注意机制中计算量大的问题,提出了一种动态中间注意存储网络(DIAMNet),利用外部存储器作为中间介质,对模式和图进行顺序注意。为了确保记忆在关注图的同时具有模式的知识,并且反之亦然,该动态记忆被设计为如图4所示的门控递归网络。假设存储器大小为M,并且我们有递归步骤T,则时间复杂度降低到O(T \cdot M \cdot \left ( \left | E_P \right | + \left | E_G \right | \right ))O(T \cdot M \cdot \left ( \left | V_P \right | + \left |V_G \right | \right )),这意味着该方法可以很容易地应用于大规模图

        外部存储器M分为M\left \{ m_1,\cdots ,m_M \right \},其中m_j \in \mathbb{R}^d。在每个时间步t\left \{ m_j \right \}通过多头注意机制由模式和图按顺序更新[49]。具体地说,我们的DIAMNet的更新方程由下式给出:

s_j^{(t)} = MultiHead\left ( \textbf{m}_j^{(t)},\widetilde{\boldsymbol{P}}, \widetilde{\boldsymbol{P}}\right ) \\z_j^{(t)} =\sigma\left (\textbf{U}_P \textbf{m}_j^{(t)}+\textbf{V}_P s_j^{(t)}\right ) \\\overline{s}_j^{(t)} =z_j^{(t)} \odot \textbf{m}_j^{(t)} +\left ( 1- z_j^{(t)} \right )\odot s_j^{(t)} \\\widetilde{s}_j^{(t)} = MultiHead\left ( \overline{s}_j^{(t)},\widetilde{\boldsymbol{G}}, \widetilde{\boldsymbol{G}}\right ) \\ \widetilde{z}_j^{(t)} =\sigma\left (\textbf{U}_G \overline{s}_j^{(t)}+\textbf{V}_G \widetilde{s}_j^{(t)}\right ) \\ \textbf{m}_j^{(t+1)} = \widetilde{z}_j^{(t)} \odot \overline{s}_j^{(t)} +\left ( 1- \widetilde{z}_j^{(t)} \right ) \odot \widetilde{s}_j^{(t)}

        这里MultiHead是[49] 中描述的注意力方法,\sigma表示逻辑激活函数,\overline{s}_j是存储器第j块的模式块的中间状态,它总结来自模式的信息,\widetilde{s}表示来自模式和图的信息。z_j\widetilde{z}_j是两个门,用于控制第j块中状态的更新。\boldsymbol{U}_P ,\boldsymbol{V}_P ,\boldsymbol{U}_G ,\boldsymbol{V}_G是可训练的参数。他们有很多可能的方法初始化\boldsymbol{M}^{(0)},我们在附录D.3中讨论内存初始化。

四、实验

        在本节中,我们报告我们的主要实验结果。

4.1数据集

        为了训练和评估子图同构计数问题的神经模型,我们需要生成足够的graph-pattern数据。

合成数据

        我们生成两个合成数据集,一个是小型数据集(small),一个是大型数据集(large)。由于对模式没有特殊的约束,模式生成器可以生成任何没有相同边的连通多重图,即,具有相同标签的平行边。相反,在给定一种模式的合成数据图中子图同构的基本真值数必须是易处理的。我们遵循TurboISO [19]中的邻域等价类(NEC)的思想来控制图生成过程中子图同构的必要条件。详细算法见附录B。我们的图形生成器首先生成多个不连通的组件,可能与一些子图同构。然后,生成器将这些组件合并到一个更大的图中,并确保在合并过程中不会创建更多的子图同构。因此,子图同构搜索可以在合并成一个大图之前并行地在小组件上完成。使用上面的模式生成器和图形生成器,我们可以为神经模型生成许多模式和图形。我们对以下研究问题感兴趣:序列模型和图模型是否可以在有限的数据下表现良好,它们的运行时间是否可以接受,即使面对NP完全问题,内存是否可以帮助模型做出更好的预测,以及在合成数据上预训练的模型是否可以转移到现实数据。为了评估不同的神经架构和不同的预测网络,我们生成了两个不同图形尺度的数据集,统计数据见表1。有187个独特的模式,其中75个模式属于小数据集,122个模式属于大数据集。图是基于这些模式随机生成的。生成详细信息见附录C.1。

MUTAG

        我们还在MUTAG数据集上生成了188个图形的24个模式。我们使用相同的模式发生器生成24种不同的异质模式,其结构见附录C.2。为了使数据集更具挑战性,定型数据、开发数据和测试数据中的图形是不相交的。

4.2实现细节

        我们使用两个线性层来分别将模式和图形多热点向量转换为具有预定义隐藏大小的向量,而不是直接将多热点编码向量馈送到表示模块。为了提高效率和性能,我们还增加了一个过滤网络,过滤掉图中与给定模式无关的边或顶点,然后再表示模块。该滤波器网络的详细信息见第D.1节。

4.2.1表示模型

        在我们的实验中,我们实现了五种不同的表示模型:(1)CNN是一个3层卷积层,后面是最大池化层。卷积核分别为2、3、4,步长为1。池化内核是2,3,4,步幅是1。(2)LSTM是一个简单的3层LSTM模型。(3)TXL是一个6层Transformer编码器,具有额外的内存。(4)RGCN是一个3层的RGCN,采用块对角分解。我们遵循原始论文中的相同设置,在消息传播部分使用均值池。(5)RGIN是GIN和RGCN的组合:在每个关系卷积层之后添加2层MLP,并使用总和聚合器。增加了残差连接[21]以限制消失梯度问题。

4.2.2交互网络

        在从表示学习模块获得图形表示\widehat{G}和模式表示\widehat{P}之后,我们将它们馈送到以下不同类型的交互层进行比较。

Pool:

        一个简单的池化操作直接应用于神经模型的输出,用于分类或回归。我们将sum pooling、mean-pooling和max pooling中的一种应用于\widehat{G}\widehat{P},以获得\widehat{g}\widehat{p},然后将Concate(\widehat{g},\widehat{p},\widehat{g}-\widehat{p},\widehat{g} \odot \widehat{p})和图的大小和模式的大小发送到下一个全连接(FC)层。

MemAttn:

        QA模型总是使用源注意力和自我注意力来寻找段落中的答案[23]。注意力的一个缺点是计算成本。我们考虑将内存用于键和值。双门控多头注意力应用于\widehat{G}\widehat{P},如附录D.2所述。最后,我们得到模式和图的均值池表示,并将池中的相同组合馈送到FC层。

DIAMNet:

        我们将第3.3节中提出的DIAMNet的性能和效率与上述交互网络进行了比较。类似地,我们在附录D.3中有许多初始化策略,但我们发现均值池快速且性能良好。最后,我们将整个内存的大小信息馈送到下一个FC层。DIAMNet和MemAttn之间的主要区别在于,DIAMNet中的内存被视为查询,初始化一次,更新t次,而MemAttn将内存存储2t次,将内存作为键和值,并将图形表示\widehat{G}更新t次。

4.3实验设置

        为了公平比较,我们将嵌入维度、所有表示模型的维度和过滤器的数量都设置为128。基于计算复杂度的考虑,TXL中的段大小和内存大小也是64。对于所有实验,DIAMNet和MemAttn中的内存长度固定为4。在MemAttn和DIAMNet中,我们使用网格搜索来寻找最佳递归步骤,使用均方误差(MSE)来训练模型,并根据dev集的结果选择最佳模型。优化器是AdamW [32],对于合成数据,基本学习率为1 e-3,对于真实数据,基本学习率为1 e-4,权重衰减系数为1 e-6。为了避免梯度爆炸和过度拟合,我们添加了梯度裁剪和dropout,dropout率为0.2。我们在所有模块中使用激活函数𝐿𝑒𝑎𝑘𝑦__𝑅𝑒𝐿𝑈。我们使用相同的表示模块与共享的参数,以产生表示模式和图形考虑到有限的模式数量。

        对于small和large数据集,我们首先在小型数据集上训练模型,然后在大型数据集上进一步使用课程学习[4]。对于MUTAG数据集,我们报告了最佳表示模型RGIN的结果,其中包含不同数量的训练数据。还进行了从合成数据到MUTAG的迁移学习[36]。

                在PyTorch和DGL框架下,在NVIDIA V100 GPU上完成了神经模型的训练和评估。VF 2使用16核(32线程)Intel E5- 2620 v4 CPU并行完成。

4.4评估指标

        当我们将这个子图同构计数问题建模为学习问题时,我们使用在回归任务中使用常用的度量,包括均方根误差(RMSE)和平均绝对误差(MAE)。在这个任务中,否定的预测是没有意义的,因此这些预测被视为零。两个平凡的基线,Zero总是预测0和Avg总是预测训练数据的平均计数,也被用于比较

4.5合成数据的结果与分析

         表2:不同模型在small数据集上的结果,在整个测试集上评估时间

        我们首先在表2中报告small数据集的结果,在表3中报告large数据集的结果。对于每个表示模块,仅报告最佳池结果。除了琐碎的全零和平均基线以及其他基于神经网络学习的基线之外,我们还想知道我们的神经模型比传统搜索算法快到什么程度。因此,我们还比较了运行时间(不包括I/O时间)。考虑到我们使用NEC来生成图而不是随机生成,为了公平我们与不涉及NEC或类似启发式规则的VF 2算法[8]进行了比较(例如,VF3[5]中的规则)。从实验中,我们可以得出以下观察结果和结论。

表3:不同模型在large数据集上的结果,在整个测试集上评估时间。

不同表示架构的比较

        如表2所示,一般来说,图模型优于大多数序列模型。CNN是图同构计数问题的最差模型。编码顺序没有考虑相邻顶点的连通性和相关的标签信息。因此,卷积操作和池化操作不能提取有用的局部信息,但可能会引入一些噪声。从large数据集的结果中,我们可以看到CNN也比其他人差。事实上,我们观察到CNN总是预测大型图为0。RNN和transformers广泛用于序列任务,LSTM和TXL是具有内存的高级变体。我们注意到,具有不同交互网络的LSTM模型始终优于TXL。虽然LSTM的内存比TXL小得多,但LSTM的内存可以以某种方式记住以前看到的所有信息,而TXL的内存只是前一段的表示。在我们的实验中,段的大小是64,所以TX一次不能学习全局信息。局部结构信息也误导了TXL,这与CNN一致。为TXL设置更长的段可能会带来更好的结果,但它需要更多的GPU内存和更长的训练时间。图模型的性能总是优于序列模型。这并不奇怪,因为这些图卷积操作是基于拓扑结构设计的。RGIN模型的性能明显优于RGCN和其他序列模型,这表明MLP和求和聚合器在该任务中擅长顶点表示学习和结构建模。平均聚合器可以对邻居的分布进行建模,但该分布可能会误导模型[53]。

记忆的有效性

        表2显示了DIAMNet作为预测层的有效性。它优于其他池方法(SumPool,MeanPool,MaxPool)以及所有表示架构的注意力与内存机制(MemAttn)。这意味着我们可以使用少量额外的GPU内存和相应的计算成本来实现更好的结果。DIAMNet的内存和计算成本随着输入的大小线性增长。当模型应用于具有数千甚至数百万个顶点和边的实际数据时,其效率是不可忽视的。MemAttn也可以将二次计算成本降低到线性,但其性能不稳定。

        当表示模块是CNN或TXL时,基于池化的预测模块通常更差。这一观察表明,模式表示的上下文应该被计算在内,我们需要一种更好的方法来聚合上下文中的信息。DIAMNet可以帮助提取模式和图形的上下文,即使表示层(如CNN)的性能不太好。最后,带有DIAMNet的CNN是序列模型中最好的。在记忆的帮助下,局部信息可以进一步用于在全局水平上进行推断。

在较大图形上的性能

        表3显示了大比例图的结果。我们可以发现大部分的结果与小数据集是一致的。RGIN仍然是我们的任务中最好的表示方法,动态记忆也很有效。在运行时间上,所有基于学习的模型都比传统的子图同构计数的VF2算法快得多。此外,神经网络模型的运行时间仅线性增长,使得其能够应用于大规模的实际数据。

图5:在small数据集上,使用MaxPool的CNN和使用DIAMNet的CNN的模型行为。在这里,O_V表示x轴上的bin按模式/图形顶点的大小排序,O_E按边的大小排序,O_X按顶点标签的大小排序,O_Y按边标签的大小排序。橙色表示真实计数,蓝色表示预测。

模型行为

        如图5所示,使用CNN模型比较了MaxPool和DIAMNet的性能。我们发现,MaxPool总是能预测较小的子图同构,而DIAMNet即使在图变得很大很复杂的情况下也能预测较小的同构数,这是因为简单的合并方法会丢失很多信息。相反,DIAMNet使用较小的存储器来学习哪些信息应该被保留或丢弃。总体而言,我们的DIAMNet在大多数数据规模上都取得了较好的结果。当条柱按节点标注大小或边标签大小排序时,我们有相同的观察,MaxPool在面对具有更多不同标签的复杂模式时失败,但DIAMNet几乎可以处理所有复杂情况。

图6:CNN与DIAMNet和RGIN与DIAMNet在large数据集上的模型行为。设置类似于图5

        我们还可以从图6得出结论,不同的表示模块的性能也不同。当图尺寸较大(如图6a和6b所示)并且模式变得复杂(如图6c和6d所示)时,CNN的表现更差,这进一步表明CNN只提取局部信息,并且在较大的图中受到全局信息的推断。相反,带有DIAMNet的RGIN不受边大小的影响,因为它直接学习顶点表示而不是边表示。此外,顶点标签大小和边标签大小没有明显的不良影响在RGIN上,但CNN受到严重影响。因此,可以看出,具有很少拓扑信息的简单卷积和池化操作不适合此任务。

4.6 在MUTAG上迁移学习

        对于MUTAG数据,我们使用不同的交互网络将不同数量的训练对输入到RGIN,并通过微调在小数据集上训练的模型来尝试迁移学习。结果如图7中所示。当训练数据不足时,从头建立的模型与迁移学习模型的性能差距不容忽视。在迁移学习的帮助下,经过微调的RGIN模型在任意交互模块的作用下均能将RMSE降低到1.588以下,而从头得到的最佳模型的RMSE仍在1.884左右。当训练数据有限时,除MemAttn-Transfer模型外,其他模型的性能均不理想.当提供30%-40%的训练数据时,我们可以观察到迁移学习的巨大改进。之后DIAMNet-Transfer的性能最好,最终达到了1.307的均方根误差和0.440的平均误差。值得注意的是,在MUTAG上的训练数据中没有出现测试图,这表明我们的学习计数框架和算法有望在未来处理大规模真实的世界图.

图7:基于RGIN的模型在MUTAG数据集上的结果。虚线是从头开始训练的模型的结果,而实线是迁移学习的结果。当使用100%训练数据时,Zero和Avg分别得到19.384和17.754 RMSE。

五、相关工作

子图同构问题

        给定一个模式图和一个数据图,子图同构搜索的目标是利用双射映射函数找到模式在数据图中的所有出现。子图同构是不同类型的图匹配问题(单同构、同构和子图同构)中的一个NP完全问题。大多数的子图同构算法都是基于回溯的。该算法首先获取一系列候选顶点并更新映射表,然后递归地调用自己的子图搜索函数,每次只匹配一个顶点或一条边。Ullmann算法[48]、VF2 [8]和GraphQL [20]都属于这种类型的算法。然而,当模式或数据图增长时,由于搜索空间也呈指数增长,因此仍然难以执行搜索。运用图索引的思想设计了一些算法,如gIndex [56],它可以用作过滤器来修剪掉许多不必要的图。然而,基于图索引的算法存在一个问题,即索引的时间和空间也随着图的增长而呈指数增长[43]。TurboISO [19]和VF 3 [5]添加了一些弱规则来找到候选子区域,然后在子区域上调用递归匹配过程。在大多数情况下,这些弱规则可以显著减少搜索空间。此外,也有一些近似技术[10,47]用于三角形计数,但它们很难推广到大型模式。随机游走也被用来计算子图同构[45,52],但成本和错误仍然是问题。图模拟[12,33]是另一种在三次时间上找到子图同构的方法,但研究人员需要纠正拓扑捕获失败和错误或假匹配。

图表示学习

        图(或网络)表示学习可以直接学习每个图节点的嵌入向量[16,37,44]。这种方法不容易推广到看不见的节点。另一方面,图神经网络(GNNs)[3]提供了一种节点表示学习的解决方案,可以推广到新的图和看不见的节点。自2005年以来,许多图神经网络已经被提出[14,39],但近年来发展迅速。他们中的大多数专注于将卷积神经网络的思想推广到一般的图数据结构[18,28,35,50]或具有多种关系类型的关系图结构[40]。最近,[53]提出了一个图同构网络(GIN),并展示了它的鉴别能力。其他人使用递归神经网络(RNN)的想法,这些网络最初被提出来处理序列数据来处理图形数据[31,58]。有趣的是,有了外部存储器,序列模型可以很好地处理复杂的任务,如语言建模[29,42]和图上的最短路径查找[15]。还有另一个研究分支称为图核[6,41,46,51,57],它也将图同构转换为相似性学习问题。然而,他们通常工作在小图,并没有专注于子图同构识别或计数问题。

六、结论

        本文研究了具有挑战性的子图同构计数问题。在深度图表示学习的帮助下,我们能够将NP完全问题转化为基于学习的问题。然后,我们可以使用学习的模型来预测多项式时间内的子图同构计数。我们建立了两个合成数据集来评估不同的表征学习模型和全局推理模型。结果表明,基于学习的方法是子图同构检测和计数的一个有前途的方向,而动态中间注意力记忆网络确实有助于全局推理。鸣谢。本文得到了香港研究赠款理事会(RGC)的早期职业发展计划(ECS,No.26206717)和研究影响基金(RIF,No.R6020 -19)以及华为诺亚方舟实验室的捐赠基金的资助。

附录

A 代码的词法顺序

        字典序是一个线性序,定义如下:

如果A = \left ( a_0,a_1,\cdots,a_m \right )B= \left ( b_0,b_1,\cdots,b_n \right ),则A \leq B当且仅当下列任一项为真:

       \left ( 1 \right ) \exists t, 0\leq t\leq min\left ( m,n \right ) ,\forall k < t,a_k= b_k,a_t <_{e} b_t \\\left ( 2 \right ) \forall 0\leq k\leq m, a_k=b_k, \textup{and} n\geq m

        在我们的设置中a_i =\left ( u_{a_i} , v_{a_i},X( u_{a_i}), y_{a_i},X( v_{a_i})\right ) <_e b_j=\left ( u_{b_j} , v_{b_j},X( u_{b_j}), y_{b_j},X( v_{b_j})\right )当且仅当下列之一为真

\left ( 1 \right ) u_{a_i} < u_{b_j} \\ \left ( 2 \right ) u_{a_i}=u_{b_j} ,v_{a_i} < v_{b_j}\\ \left ( 3 \right ) u_{a_i}=u_{b_j} ,v_{a_i} = v_{b_j}, y_{a_i} < y_{b_j}\\

B 模式生成器和图生成器

 算法1 模式生成器

        如4.1节所述,需要两个生成器来生成数据集。关于模式生成器的算法如算法1所示,该算法首先统一生成一棵有向树。然后添加带有随机标签的其余边。顶点标签和边标签也是统一生成的,但每个标签都要求至少出现一次。算法2显示了图形生成的过程。两个超参数控制子同构的密度:(1)\alpha \in \left [ 0,1 \right ]决定加入子同构的概率而不是随机边;(2)\beta \in \mathbb{N}^++是Dirichlet分布对组件样本大小的参数。在生成多棵有向树并满足顶点数要求后,算法开始添加剩余的边。它可以在一个组件中添加边并尝试添加子图同构,也可以在两个组件之间或一个组件中随机添加边。下面的合并子例程旨在将这些组件合并到一个大图中。为了使数据集很难被黑客入侵,还需要进行洗牌。由于任意两个分支之间的边不满足必要条件,在整个图中搜索子同构等价于分别在分支中搜索。

 算法2 图生成器

        在算法1和算法2中,函数AddRandomEdges将所需的边从一个组件添加到另一个组件,而不生成新的子图同构。这两个组件也可以是同一个,这意味着添加一个组件。NEC树在TurboISO [19]中用于探索候选区域以进行进一步匹配。它需要O(\left | V_P \right |^2)时间,但可以显著减少数据图中的搜索空间。它记录了模式的等价类和必要条件。当在两个组件之间添加随机边时,我们确保两个组件之间的边不满足NEC树中的必要条件。与随机生成和传统的子图同构搜索相比,这种数据结构和这种思想有助于我们生成更多的数据和搜索子同构。

C 数据集细节

C.1合成数据集的详细信息

表4:两个数据集的参数和约束

        我们可以使用两个图形生成器生成尽可能多的示例。然而,我们限制了训练、开发和测试实例的数量,以确定基于学习的模型是否可以推广到新的未见实例。生成了不同尺度的模式图和数据图。表4中列出了两个生成器和约束的参数。添加了两个约束以简化此任务。平均度约束\left ( \frac{N_e}{N_v} \leq 4\right )用于保持图的不那么密集,而次同构计数约束\left ( \left \{ c \in \mathbb{N} | c\leq 1024 \right \} \textup{ for\: small} , \left \{ c \in \mathbb{N} | c\leq 4096 \right \} \textup{ for\: large} \right ){确保了两个数据集的难度不同。

        我们使用8核(16线程)Intel E5-2620v4 CPU并行生成数据。图8显示了两个数据集的计数分布。从图中我们可以看到,这两个数据集都遵循长尾分布。

图8:两个数据集的子图同构计数分布

C.2 MUTAG数据集详情

        MUTAG数据集包含188个致突变化合物图。我们将188个图分为62个训练图、63个验证图和63个测试图,使用附录B中的模式生成器生成24个不同的模式,最终构建了4,512个图-模式对(1,488个训练对,1,512个验证对和1,512个测试对)。详细的图案结构如图9所示。

图9:MUTAG数据集中的24种不同模式

D 更多的实现细节

        在本节中,我们提供了更多的实现细节,而不是表示架构和DIAMNet模块。

D.1 Filter Network

        直觉上,并非图中的所有顶点和边都可以匹配某些子同构,因此我们只需添加一个FilterNet来调整图编码,如下所示:

\overline{p} = \textup{MaxPool}(p),\:\:\;\;\;\:\:\;\;\:\:\;\;\:\:\;\;\:\:\;\;\:\:\;\;\:\:(7) \\ \widehat{G} =GW_G^T,\:\:\:\:\:\:\:\:\;\;\;\:\:\;\;\:\:\;\;\:\:\;\;\:\:\;\;\:\:\;\;\:\:\;\;\:\:(8) \\f_i = \sigma(W_F\left ( \widehat{G}_{i:} \odot \overline{p} \right )),\;\;\:\:\;\;\:\;\;\:\:\;\;\:\:\:\:(9) \\G_{i:} = f_i \odot G_{i:}\;\;\:\:\;\;\:\;\;\:\:\;\;\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:(10)

        其中\widehat{G}是模式空间中的图形表示,\sigma是sigmoid函数,f_j是决定j^{th}顶点或j^{th}边过滤的门,W_G \in \mathbb{R} ^{d_p \times d_g}W_F \in \mathbb{R} ^{1 \times d_p}是可训练的。多亏了多热编码,我们可以简单地使用Eq(7以累积图案的标签信息。在这个过滤层之后,只有图形的相关部分将被传递到下一个表示层。

D.2 MemAttn

        为了解决二次成本问题,我们将内存用于键和值,并在查询和内存之间进行点积。我们将\widehat{G}初始化为\widehat{G}^{(0)},并更新t次。细节如下所示:

\boldsymbol{M}^{(t)} = \textit{MemInit} (\widehat{P}),\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:(11) \\ s_j^{(t)}= \textit{MultiHead} \left ( \widehat{\boldsymbol{g}}_{j}^{(t)}, \boldsymbol{M}^{(t)},\boldsymbol{M}^{(t)}\right )\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:(12) \\z_j^{(t)} = \sigma(\boldsymbol{U}_P \widehat{\boldsymbol{g}}_{j}^{(t)} +\boldsymbol{V}_Ps_j^{(t)}),\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:(13) \\ \overline{s}_j^{(t)} = z_j^{(t)} \odot \widehat{\boldsymbol{g}}_{j}^{(t)} +\left ( 1- z_j^{(t)} \right ) \odot s_j^{(t)},\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:(14) \\\boldsymbol{\overline{M}}^{(t)} = \textit{MemInit} (\overline{S}^{(t)}),\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:(15) \\ \widetilde{s}_j^{(t)}= \textit{MultiHead} \left ( \overline{s}_{j}^{(t)}, \boldsymbol{\overline{M}}^{(t)},\boldsymbol{\overline{M}}^{(t)}\right )\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:(16) \\\widetilde{z}_j^{(t)} = \sigma(\boldsymbol{U}_S \overline{\boldsymbol{s}}_{j}^{(t)} +\boldsymbol{V}_S \widetilde{s}_j^{(t)}),\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:(17) \\ \widehat{g}_j^{(t+1)} = \widetilde{z}_j^{(t)} \odot \overline{s}_{j}^{(t)} +\left ( 1-\widetilde{z}_j^{(t)} \right ) \odot \widetilde{s}_j^{(t)},\:\:\:\:\:\:\:\:\:\:\:(18)

        初始化内存的方法有很多,我们在附录D.3中简要讨论。在实验中,我们简单地选择通过均值池进行初始化。

D.3存储器初始化

        有很多方法可以初始化给定输入\boldsymbol{L} = \left \{ \boldsymbol{l}_1,\cdots,\boldsymbol{l}_L \right \}的存储器\boldsymbol{M} = \left \{ \boldsymbol{m}_1,\cdots,\boldsymbol{m}_M \right \}在实验中,我们简单地通过以下方式初始化\boldsymbol{m}_i:

s = \left \lfloor \frac{L}{M} \right \rfloor, \:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:(19) \\k = L-(M-1)\cdot s,\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:(20) \\ \boldsymbol{m}_i = \textup{MeanPool}\left ( \left \{ \textbf{l}_{i\cdot s} ,\cdots,\textbf{l}_{i\cdot s+k-1} \right \} \right )\:\:\:\:\:\:\:\:\:\:\:\:\:\:(21)

        其中,s是步幅,k是内核大小。简单地将填充的输入与长度M \cdot \left \lfloor \frac{L}{M} \right \rfloor分开也应该工作得很好。可以很容易地用最大池化和总和池化来取代均值池化。有趣的是,我们也可以为\left \{ \textbf{l}_{i\cdot s} ,\cdots,\textbf{l}_{i\cdot s+k-1} \right \}使用自我注意力来获得更好的记忆块\boldsymbol{m}_i。然而,自注意使得初始化不快于O(L^{1.5})。进一步的工作是设计散列和选择,以帮助内存更好地记忆全局和局部结构信息的顶点,如节点具有相同的顶点标签存储在同一个内存块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源模型应用落地-模型上下文协议(MCP)-第三方MCP Server实战指南(五)

一、前言 在AI技术高速发展的2025年,如何让大语言模型(LLM)更灵活地调用外部工具与数据,成为开发者关注的焦点。​模型上下文协议(MCP)​作为AI与外部资源的“万能接口”,通过标准化交互框架解决了传统集成中的碎片化问题。而第三方MCP Server的引入,进一步降低了开发门…

【2025年认证杯数学中国数学建模网络挑战赛】C题 数据预处理与问题一二求解

目录 【2025年认证杯数学建模挑战赛】C题数据预处理与问题一求解三、数据预处理及分析3.1 数据可视化3.2 滑动窗口相关系数统计与动态置信区间耦合分析模型3.3 耦合关系分析结果 四、问题一代码数据预处理问题一 【2025年认证杯数学建模挑战赛】C题 数据预处理与问题一求解 三…

AI Agent开发大全第二十八课-MCP实现本地命令调用怎么做的?

开篇 MCP很强大,Client端一旦实现了稳定的连接和执行流程后任Server端随意改动都可兼容,这就是热插拨功能。 如果我们仅仅满足于MCP查点网上资料、读点图片即文字型的功能肯定是不能充分发挥MCP的强大之处的,正应了Google以及Anthropic最近的研究报告上说的:不要再在chat…

AJAX原理与XMLHttpRequest

目录 一、XMLHttpRequest使用步骤 基本语法 步骤 1&#xff1a;创建 XHR 对象 步骤 2&#xff1a;调用 open() 方法 步骤 3&#xff1a;监听 loadend 事件 步骤 4&#xff1a;调用 send() 方法 二、完整示例 1. GET 请求&#xff08;带查询参数&#xff09; 2. POST 请…

python写个0~12个月宝宝喂养规划表

下载字体&#xff1a;https://github.com/adobe-fonts/source-han-sans/releases 下载fpdf2 pip uninstall fpdf pip install fpdf2运行代码 ​from fpdf import FPDF from fpdf.enums import XPos, YPos# 创建 PDF 类 class BabyFeedingPDF(FPDF):def header(self):self.s…

集中趋势描述

一、集中趋势的定义与核心目标 集中趋势指数据向其中心值聚集的倾向,反映数据的典型水平或分布中心。其核心是通过统计指标(如众数、中位数、均值)概括数据的核心特征,帮助快速理解数据分布的核心位置。 核心作用:简化复杂数据、指导业务决策(如确定用户平均消费水平)、…

【NLP】Attention机制

1.模型对比 RNN(马尔科夫链式编码) 通过递归计算逐个处理 token,当前编码结果 h t h_t ht​仅依赖前一步的隐藏状态 h t − 1 h_{t-1} ht−1​和当前输入 x t x_t xt​局限性:序列建模需严格串行,无法并行;长距离依赖易丢失(梯度消失/爆炸)例:双向 LSTM 需正向+反向两…

基于OpenCV与PyTorch的智能相册分类器全栈实现教程

引言&#xff1a;为什么需要智能相册分类器&#xff1f; 在数字影像爆炸的时代&#xff0c;每个人的相册都存储着数千张未整理的照片。手动分类不仅耗时&#xff0c;还容易遗漏重要瞬间。本文将手把手教你构建一个基于深度学习的智能相册分类系统&#xff0c;实现&#xff1a;…

活动安排问题 之 前缀和与差分

文章目录 D. Robert Hood and Mrs Hood 考虑到一个活动开始时间和结束时间s,e&#xff0c;那么可以影响到的范围就是 s-d1,e,所以我们只需对这个每一个活动可以影响到的区域进行标记即可&#xff0c;当然为了降低时间复杂度&#xff0c;我们将使用前缀和与差分 t int(input()…

C++之 多继承

在学校里有老师和学生&#xff0c;他们都是人&#xff0c;我么应该创建一个名为 Person 的基类和两个名为 Teacher 和Student 的子类&#xff0c;后两者是从前者继承来的 有一部分学生还教课挣钱&#xff08;助教&#xff09;&#xff0c;也就是同时存在着两个”是一个”关系&…

大数据学习栈记——Redis安装及其使用

本文介绍NoSQL技术&#xff1a;Redis的安装及其使用。操作系统&#xff1a;Ubuntu24.04 Redis介绍 Redis是一个键值&#xff08;key-value&#xff09;存储系统&#xff0c;即键值对非关系型数据库&#xff0c;和Memcached类似&#xff0c;目前正在被越来越多的互联网公司采用…

2024团体程序设计天梯赛L3-1 夺宝大赛

L3-037 夺宝大赛 分数 30 作者 陈越 单位 浙江大学 夺宝大赛的地图是一个由 nm 个方格子组成的长方形&#xff0c;主办方在地图上标明了所有障碍、以及大本营宝藏的位置。参赛的队伍一开始被随机投放在地图的各个方格里&#xff0c;同时开始向大本营进发。所有参赛队从一个方格…

JMeter的高并发和高频率和分布式

性能测试 模拟各种正常的、峰值的测试环境&#xff0c;检测程序的各项性能指标是否能够达标 高并发 JMeter中内置了定时器&#xff0c;可以实现时间模式相关的性能测试 需求1:同一时刻100个同学去访问学生管理系统的查询所有学院信息功能&#xff0c;统计高并发情况下平均响…

ubuntu学习day2

linux常用命令 3.文件查看及处理命令 3.1查看文件内容 cat[选项][文件] -b 对非空输出行编号 -E 在每行结束处显示$ -n 对输出的所有行编号 -s 不输出多行空行 标准输入、标准输出和标准错误 在 Linux 中&#xff0c;每个进程默认有三个文件描述符&#xff1a; 标准输入&…

项目中引入 Redis 及 常用五种数据类型

在平常的开发过程中&#xff0c;我们经常会用到缓存的技术。比如&#xff0c;验证码60秒后过期、计数器的实现、商品信息存储在缓存中快速展示等。那么&#xff0c;项目中经常会使用到的便是 redis 缓存。redis 在内存中操作&#xff0c;读写快。Redis 常用的数据类型有五种&am…

Spark-SQL简介及核心编程

Spark-SQL概述&#xff1a;是Spark用于结构化数据处理的模块&#xff0c;前身是Shark。Shark基于Hive开发&#xff0c;使SQL-on-Hadoop性能大幅提升&#xff0c;但对Hive依赖制约了Spark发展。SparkSQL汲取Shark优点并重新开发&#xff0c;在数据兼容、性能优化和组件扩展上优势…

奇趣点播系统测试报告

1.项目简介 本项目旨在搭建一个视频共享点播系统&#xff0c;服务器支持用户通过前端浏览器访问服务器&#xff0c;获取展示与观看和操作的界面&#xff0c;最终实现视频的上传以及观看和删改查等基础管理功能。让用户拥有良好的观看体验和分享视频的快捷方式&#xff0c;此外…

【Web API系列】WebSocketStream API 深度实践:构建高吞吐量实时应用的流式通信方案

前言 在当今的 Web 开发领域&#xff0c;实时通信已成为许多应用的核心需求。无论是即时聊天、实时数据仪表盘&#xff0c;还是在线游戏和金融交易系统&#xff0c;都需要高效的双向数据传输能力。传统的 WebSocket API 为此提供了基础支持&#xff0c;但在处理大规模数据流、…

基于LangGraph的智能报告生成平台项目分析

前言 不知道你是否知道或者了解OpenAI and Gemini Deep Research。他们是一种能够根据输入问题进行规划、结合网络搜索获取信息并最终呈现结果的研究工具或技术。那这样research是如何实现的呢?最近刚好看到一个实现类似功能的开源项目: open_deep_search。本文将基于该项目进…

Redis 常见的集群架构

Redis 常见的集群架构 以下是 Redis 常见的集群架构及其核心模式详解&#xff0c;结合其设计原理、适用场景和优缺点进行综合说明&#xff1a; 一、主从复制模式 架构原理 角色划分&#xff1a;包含一个主节点&#xff08;Master&#xff09;和多个从节点&#xff08;Slave&…