被称为“图神经网络”(GNN)的深度学习技术在图域中运行。 这些网络最近在各种领域中得到了应用,包括计算机视觉、推荐系统和组合优化等等。
此外,这些网络可用于表示复杂系统,包括社交网络、蛋白质-蛋白质相互作用网络、知识图谱等多个研究领域。
与图片等其他类型的数据相比,非欧几里得空间是图形数据运行的地方。 为了对节点进行分类、预测链接和聚类数据,使用了图形分析。
在本文中,我们将检查 Graph 神经网络 详细介绍其类型,并提供使用 PyTorch 的实际示例。
那么,什么是图?
图是一种由节点和顶点组成的数据结构。 各个节点之间的连接由顶点决定。 如果在节点中指示了方向,则称该图为有向图; 否则,它是无向的。
图的一个很好的应用是对不同个体之间的关系进行建模 社交网络. 在处理复杂的情况时,例如链接和交换,图表非常有用。
它们被推荐系统、语义分析、社交网络分析和模式识别所采用
. 创建基于图形的解决方案是一个全新的领域,它提供了对复杂和相互关联的数据的深刻理解。
图神经网络
图神经网络是可以对图数据格式进行操作的专用神经网络类型。 图嵌入和卷积神经网络 (CNN) 对它们有重大影响。
图神经网络用于包括预测节点、边和图的任务。
- CNN 用于对图像进行分类。 类似地,为了预测一个类,GNN 被应用于表示图结构的像素网格。
- 使用递归神经网络的文本分类。 GNN 也用于图形架构,其中短语中的每个单词都是一个节点。
为了预测节点、边或完整图,使用神经网络来创建 GNN。 例如,节点级别的预测可以解决垃圾邮件检测等问题。
链接预测是推荐系统中的典型案例,可能是边缘预测问题的一个例子。
图神经网络类型
存在多种神经网络类型,其中大多数都存在卷积神经网络。 我们将在这一部分了解最著名的 GNN。
图卷积网络(GCN)
它们可与经典的 CNN 相媲美。 它通过查看附近的节点来获取特征。 GNN 使用激活函数在聚合节点向量并将输出发送到密集层之后添加非线性。
它本质上由图卷积、线性层和非学习器激活函数组成。 GCN 有两个主要品种:光谱卷积网络和空间卷积网络。
图自动编码器网络
它使用编码器来学习如何表示图,并使用解码器来尝试重建输入图。 有一个瓶颈层连接编码器和解码器。
由于自动编码器在处理类平衡方面做得非常出色,因此它们经常用于链接预测。
循环图神经网络 (RGNN)
在多关系网络中,单个节点有许多关系,它学习最佳扩散模式并可以管理图。 为了增加平滑度并减少过度参数化,正则化器用于这种形式的图神经网络。
为了获得更好的结果,RGNN 需要更少的处理能力。 它们用于文本生成、语音识别、机器翻译、图片描述、视频标记和文本摘要。
门控神经图网络 (GGNN)
在涉及长期依赖任务时,它们的性能优于 RGNN。 通过在长期依赖关系上包含节点、边和时间门,门控图神经网络增强了循环图神经网络。
门的功能类似于门控循环单元 (GRU),因为它们用于在各个阶段回忆和忘记数据。
使用 Pytorch 实现图神经网络
我们将关注的具体问题是一个常见的节点分类问题。 我们有一个相当大的社交网络,叫做 musae-github,它是从开放 API 编译的,供 GitHub 开发人员使用。
边表示节点之间的相互追随者关系,代表在至少 10 个存储库中加注星标的开发人员(平台用户)(注意,相互一词表示无向关系)。
根据节点的位置、加星标的存储库、雇主和电子邮件地址,检索节点特征。 预测 GitHub 用户是 Web 开发人员还是 机器学习开发者 是我们的任务。
每个用户的职位是此定位功能的基础。
安装 PyTorch
首先,我们首先需要安装 PyTorch. 您可以根据您的机器配置它 点击此处. 这是我的:
导入模块
现在,我们导入必要的模块
导入和探索数据
下一步是读取数据并绘制标签文件中的前五行和后五行。
四列中只有两列——节点的 id(即用户)和 ml_target,如果用户是机器学习社区的成员,则为 1,否则为 0——在这种情况下与我们相关。
鉴于只有两个类,我们现在可以确定我们的任务是一个二元分类问题。
由于严重的类不平衡,分类器可以只假设哪个类占多数,而不是评估代表性不足的类,这使得类平衡成为另一个需要考虑的关键因素。
绘制直方图(频率分布)揭示了一些不平衡,因为机器学习(标签=1)的类比其他类少。
特征编码
节点的特征告诉我们与每个节点相关的特征。 通过实现我们的数据编码方法,我们可以立即对这些特征进行编码。
我们想利用这种方法封装一小部分网络(比如 60 个节点)以供显示。 代码在此处列出。
设计和显示图表
我们将使用火炬几何。 数据来构建我们的图表。
为了对具有不同(可选)属性的单个图进行建模,使用作为简单 Python 对象的数据。 通过利用这个类和以下属性——所有这些都是火炬张量——我们将创建我们的图形对象。
将分配给编码节点特征的值 x 的形式是[节点数,特征数]。
y 的形状是[节点数],它将应用于节点标签。
边索引:为了描述无向图,我们需要扩展原始边索引,以允许存在两条不同的有向边,它们连接相同的两个节点但指向相反的方向。
例如,在节点 100 和 200 之间需要一对边,一个指向节点 200 到 100,另一个指向节点 100 到 200。如果提供了边索引,那么这就是无向图的表示方式。 [2,2*number of original edges] 将是张量形式。
我们创建了绘制图形方法来显示图形。 第一步是将我们的同构网络转换为 NetworkX 图,然后可以使用 NetworkX.draw 进行绘制。
制作我们的 GNN 模型并进行训练
我们首先通过使用 light=False 执行编码数据来对整个数据集进行编码,然后使用 light=False 调用构造图来构建整个图。 我们不会尝试绘制这个大图,因为我假设您使用的是资源有限的本地计算机。
掩码是使用数字 0 和 1 标识哪些节点属于每个特定掩码的二进制向量,可用于通知训练阶段在训练期间应包括哪些节点,并告诉推理阶段哪些节点是测试数据。 火炬几何变换。
可以使用 AddTrainValTestMask 类的训练掩码、验证掩码和测试掩码属性添加节点级拆分,这些属性可用于获取图表并让我们能够指定我们希望如何构建掩码。
我们只使用 10% 的数据进行训练,使用 60% 的数据作为测试集,同时使用 30% 作为验证集。
现在,我们将堆叠两个 GCNConv 层,第一个层的输出特征计数等于我们图中作为输入特征的特征数量。
在第二层,它包含与我们的类数量相等的输出节点,我们应用一个 relu 激活函数并提供潜在特征。
边索引和边权重是 GCNConv 在前向函数中可以接受的众多选项 x 中的两个,但在我们的情况下,我们只需要前两个变量。
尽管我们的模型将能够预测图中每个节点的类别,但我们仍然需要根据阶段分别确定每个集合的准确度和损失。
例如,在训练期间,我们只想利用训练集来确定准确度和训练损失,因此这就是我们的掩码派上用场的地方。
为了计算适当的损失和准确率,我们将定义掩码损失和掩码准确率的函数。
训练模型
现在我们已经定义了使用 Torch 的训练目的。 Adam 是一位优化大师。
我们将进行一定数量的 epoch 的训练,同时关注验证的准确性。
我们还绘制了不同时期的训练损失和准确性。
图神经网络的缺点
使用 GNN 有一些缺点。 何时使用 GNNa 以及如何提高我们的机器学习模型的性能,在我们对它们有了更好的了解之后,我们都会清楚地了解它们。
- 虽然 GNN 是浅层网络,通常具有三层,但大多数神经网络可以深入以提高性能。 由于这个限制,我们无法在大数据集上处于领先地位。
- 在图上训练模型更加困难,因为它们的结构动力学是动态的。
- 由于这些网络的高计算成本,为生产扩展模型提出了挑战。 如果您的图形结构庞大且复杂,那么将 GNN 用于生产将具有挑战性。
结论
在过去的几年里,GNN 已经发展成为解决图领域机器学习问题的强大而有效的工具。 本文给出了图神经网络的基本概述。
之后,您可以开始创建将用于训练和测试模型的数据集。 要了解它的功能和能力,您还可以走得更远,使用不同类型的数据集对其进行训练。
编码愉快!
发表评论