基于图神经网络的节点表征学习part1

引言

在图节点预测或边预测任务中,首先需要生成节点表征(Node Representation)我们使用图神经网路来生成节点表征,并通过基于监督学习的对图神经网路的训练,使得图神经网络学会产生高质量的节点表征。高质量的节点表征能够用于衡量节点的相似性,同时高质量的节点表征也是准确分类节点的前提。
本文,我们将学习实现多层图神经网路的方法,并以节点分类任务为例,学习训练图神经网络的一般过程。我们将以Cora数据集为例子进行说明,Cora是一个引文网络,节点代表论文,如果两篇论文存在引用关系,则对应的两个节点之间存在边,各节点的属性都是一个1433维的词包特征向量。我们的任务是预测各篇论文的类别(共7类),我们还将对MLP和GCN,GAT(两个知名度很高的图神经网络)三类神经网络在节点分类任务中的表现进行比较分析,以此来展现图神经网络的强大和论证图神经网络强于普通深度神经网络的原因。
内容安排如下:
1、首先,我们要做一些准备工作,即获取并分析数据集、构建一个方法用于分析节点表征的分布。
2、然后,我们考察MLP神经网络用于节点分类的表现,并观察基于MLP神经网络学习到的节点表征的分布。
3、接着,我们逐一介绍GCN,GAT这两个图神经网络的理论、对比他们在节点分类任务中的表现以及他们学习到的节点表征的质量。
4、最后,我们比较三者在节点表征学习能力上的差异。

准备工作

获取并分析数据集

from torch_geometric.datasets import Planetoid
from torch_geometric.transforms import NormalizeFeatures
dataset = Planetoid(root='dataset', name='Cora',transform=NormalizeFeatures())
print()
print(f'Dataset: {dataset}:')
print('======================')
print(f'Number of graphs: {len(dataset)}')
print(f'Number of features: {dataset.num_features}')
print(f'Number of classes: {dataset.num_classes}')
data = dataset[0] # Get the first graph object.
print()
print(data)
print('======================')
# Gather some statistics about the graph.
print(f'Number of nodes: {data.num_nodes}')
print(f'Number of edges: {data.num_edges}')
print(f'Average node degree: {data.num_edges / data.num_nodes:.2f}')
print(f'Number of training nodes: {data.train_mask.sum()}')
print(f'Training node label rate: {int(data.train_mask.sum()) / data.num_nodes:.2f}')
print(f'Contains isolated nodes: {data.contains_isolated_nodes()}')
print(f'Contains self-loops: {data.contains_self_loops()}')
print(f'Is undirected: {data.is_undirected()}')

我们可以看到,Cora图拥有2708个节点和10556条边,平均节点度为3.9,训练集仅使用了140个节点,占整体的5%。我们还可以看到,这个图是无向图,不存在孤立的节点。
数据转换(transform)在将数据输入到神经网络之前修改数据,这一功能可用于实现数据规范化或数据增强。在此例子中,我们使用NormalizeFeatures进行节点特征归一化,使各节点特征总和为1。

你可能感兴趣的:(人工智能)