关于人工智能:图卷积和消息传递理论的可视化详解

4次阅读

共计 4114 个字符,预计需要花费 11 分钟才能阅读完成。

本文中将钻研如何基于消息传递机制构建图卷积神经网络,并创立一个模型来对具备嵌入可视化的分子进行分类。

假如当初须要设计医治某些疾病的药物。有一个其中蕴含胜利医治疾病的药物和不起作用的药物数据集,当初须要设计一种新药,并且想晓得它是否能够医治这种疾病。如果能够创立一个有意义的药物示意,就能够训练一个分类器来预测它是否对疾病医治有用。咱们的药物是分子式,能够用图表示意。该图的节点是原子。也能够用特征向量 x 来形容原子(它能够由原子属性组成,如品质、电子数或其余)。为了对分子进行分类,咱们心愿利用无关其空间结构和原子特色的常识来取得一些有意义的示意。

以图形示意的分子示例。原子有它们的特征向量 X。特征向量中的索引示意节点索引。

最间接的办法是聚合特征向量,例如,简略地取它们的平均值:

这是一个无效的解决方案,但它疏忽了重要的分子空间结构。

图卷积

咱们能够提出另一种想法:用邻接矩阵示意分子图,并用特征向量“扩大”其深度。咱们失去了一个伪图像 [8, 8, N],其中 N 是节点特征向量 x 的维数。当初能够应用惯例卷积神经网络并提取分子嵌入。

图构造能够示意为邻接矩阵。节点特色能够示意为图像中的通道(括号代表连贯)。

这种办法利用了图构造,但有一个微小的毛病:如果扭转节点的程序会失去不同的示意。所以这样的示意不是置换不变量。然而邻接矩阵中的节点程序是任意的,例如,能够将列程序从 [0, 1, 2, 3, 4, 5, 6, 7] 更改为 [0, 2, 1, 3, 5, 4, 7, 6],它依然是 图的无效邻接矩阵。所以能够创立所有可能的排列并将它们重叠在一起,这会使咱们有 1625702400 个可能的邻接矩阵(8!* 8!)。数据量太大了,所以应该找到更好的解决方案。

然而问题是,咱们如何整合空间信息并无效地做到这一点?下面的例子能够让咱们想到卷积的概念,但它应该在图上实现。

所以图卷积就呈现了

当对图像利用惯例卷积时会产生什么?相邻像素的值乘以过滤器权重并相加。咱们能够在图表上做相似的事件吗?是的,能够在矩阵 X 中重叠节点特征向量并将它们乘以邻接矩阵 A,而后失去了更新的特色 X`,它联合了无关节点最近街坊的信息。为简略起见,让咱们思考一个具备标量节点特色的示例:

标量值节点特色的示例。仅针对节点 0 阐明了 1 跳间隔,但对于所有其余节点也是一样的。

每个节点都会取得无关其最近街坊的信息(也称为 1 跳间隔)。邻接矩阵上的乘法将特色从一个节点流传到另一个节点。

在图像域中能够通过减少滤波器大小来扩大感触野。在图中则能够思考更远的街坊。如果将 A^2 乘以 X——对于 2 跳间隔节点的信息会流传到节点:

节点 0 当初具备对于节点 2 的信息,该信息位于 2 跳间隔内。该图仅针对节点 0 阐明了跃点,但对于所有其余节点也是如此。

矩阵 A 的更高幂的行为形式雷同:乘以 A^n 会导致特色从 n 跳间隔节点流传,所以能够通过将乘法增加到邻接矩阵的更高次方来扩大“感触野”。为了概括这一操作,能够将节点更新的函数定义为具备某些权重 w 的此类乘法之和:

多项式图卷积滤波器。A——图邻接矩阵,w——标量权重,x——初始节点特色,x’——更新节点特色。

新特色 x’ 是来自 n 跳间隔的节点的某种混合,相应间隔的影响由权重 w 管制。这样的操作能够被认为是一个图卷积,滤波器 P 由权重 w 参数化。与图像上的卷积相似,图卷积滤波器也能够具备不同的感触野并聚合无关节点街坊的信息,但街坊的构造不像图像中的卷积核那样规定。

这样的多项式与个别卷积一样是置换等变性的。能够应用图拉普拉斯算子而不是邻接矩阵来传递特色差别而不是节点之间的特征值(也能够应用标准化的邻接矩阵)。

将图卷积示意为多项式的能力能够从个别的谱图卷积(spectral graph convolutions)中推导进去。例如,利用带有图拉普拉斯算子的切比雪夫多项式的滤波器提供了间接谱图卷积的近似值 [1]。

并且能够轻松地将其推广到具备雷同方程的节点特色的任何维度上。但在更高维度的状况下,解决的是节点特色矩阵 X 而不是节点特征向量。例如,对于 N 个节点和节点中的 1 或 M 个特色,咱们失去:

x——节点特征向量,X——重叠节点特色,M——节点特征向量的维度,N——节点数量。

能够将特征向量的“深度”维度视为图像卷积中的“通道”。

消息传递

当初用另外一种不同的形式看看下面的探讨。持续采纳下面探讨的一个简略的多项式卷积,只有两个第一项,让 w 等于 1:

当初如果将图特色矩阵 X 乘以 (I + A) 能够失去以下后果:

对于每个节点,都增加了相邻节点的总和。因而该操作能够示意如下:

N(i) 示意节点 i 的一跳间隔街坊。

在这个例子中,“update”和“aggregate”只是简略的求和函数。

这种对于节点特色更新被称为消息传递机制。这样的消息传递的单次迭代等效于带有过滤器 P= I + A 的图卷积。那么如果想从更远的节点流传信息,咱们能够再次反复这样的操作几次,从而用更多的多项式项迫近图卷积。

然而须要留神的是:如果反复屡次图卷积,可能会导致图适度平滑,其中每个节点嵌入对于所有连贯的节点都变成雷同的均匀向量。

那么如何加强消息传递的表达能力?能够尝试聚合和更新函数,并额定转换节点特色:

W1——更新节点特色的权重矩阵,W2——更新相邻节点特色的权重矩阵。

能够应用任何排列不变函数进行聚合,例如 sum、max、mean 或更简单的函数,例如 DeepSets。

例如,评估消息传递的根本办法之一是 GCN 层:

第一眼看到这个公式可能并不相熟,但让咱们应用“更新”和“聚合”函数来看看它:

应用单个矩阵 W 代替两个权重矩阵 W1 和 W2。更新函数是求和,聚合函数是归一化节点特色的总和,包含节点特色 i。d——示意节点度。

这样就应用一个权重矩阵 W 而不是两个,并应用 Kipf 和 Welling 归一化求和作为聚合,还有一个求和作为更新函数。聚合操作评估街坊和节点 i 自身,这相当于将自循环(self-loops)增加到图中。

所以具备消息传递机制的 GNN 能够示意为多次重复的聚合和更新函数。消息传递的每次迭代都能够被视为一个新的 GNN 层。节点更新的所有操作都是可微的,并且能够应用能够学习的权重矩阵进行参数化。当初咱们能够构建一个图卷积网络并摸索它是如何执行的。

一个理论的例子

应用下面提到的 GCN 层构建和训练图神经网络。对于这个例子,我将应用 PyG 库和 [2] 中提供的 AIDS 图数据集。它由 2000 个代表分子化合物的图表组成:其中 1600 个被认为对 HIV 无活性,其中 400 个对 HIV 有活性。每个节点都有一个蕴含 38 个特色的特征向量。以下是数据集中分子图示意的示例:

应用 networkx 库可视化来自 AIDS 数据集的样本。

为简略起见,咱们将构建一个只有 3 个 GCN 层的模型。嵌入空间可视化的最终嵌入维度将是 2-d。为了取得图嵌入,将应用均值聚合。为了对分子进行分类,将在图嵌入之后应用一个简略的线性分类器。

具备三个 GCN 层、均匀池化和线性分类器的图神经网络。

对于第一次消息传递的迭代(第 1 层),初始特征向量被投影到 256 维空间。在第二个消息传递期间(第 2 层),特征向量在同一维度上更新。在第三次消息传递(第 3 层)期间,特色被投影到二维空间,而后对所有节点特色进行均匀以取得最终的图嵌入。最初,这些嵌入被输送到线性分类器。抉择二维维度只是为了可视化,更高的维度必定会更好。这样的模型能够应用 PyG 库来实现:

from torch import nn
from torch.nn import functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.nn import global_mean_pool

class GCNModel(nn.Module):
    def __init__(self, feature_node_dim=38, num_classes=2, hidden_dim=256, out_dim=2):
        super(GCNModel, self).__init__()
        torch.manual_seed(123)
        self.conv1 = GCNConv(feature_node_dim, hidden_dim)
        self.conv2 = GCNConv(hidden_dim, hidden_dim)
        self.conv3 = GCNConv(hidden_dim, out_dim)
        self.linear = nn.Linear(out_dim, num_classes)

    def forward(self, x, edge_index, batch):

        # Graph convolutions with nonlinearity:
        x = self.conv1(x, edge_index)
        x = F.relu(x)
        x = self.conv2(x, edge_index)
        x = F.relu(x)
        x = self.conv3(x, edge_index)

        # Graph embedding:
        x_embed = global_mean_pool(x, batch)

        # Linear classifier:
        x = self.linear(x_embed)

        return x, x_embed

在其训练期间,能够可视化图嵌入和分类器决策边界。能够看到消息传递操作如何使仅应用 3 个图卷积层的生成有意义的图嵌入的。这里应用随机初始化的模型嵌入并没有线性可分散布:

上图是对随机初始化的模型进行正向流传失去的分子嵌入

但在训练过程中,分子嵌入很快变成线性可分:

即便是 3 个图卷积层也能够生成有意义的二维分子嵌入,这些嵌入能够应用线性模型进行分类,在验证集上具备约 82% 的准确度。

总结

在本文中介绍了图卷积如何示意为多项式,以及如何应用消息传递机制来近似它。这种具备附加特色变换的办法具备弱小的示意能力。本文中仅仅涉及了图卷积和图神经网络的皮毛。图卷积层和聚合函数有十几种不同的体系结构。并且在图上可能实现的工作工作也很多,如节点分类、边缘重建等。所以如果想深刻开掘,PyG 教程是一个很好的开始。

https://www.overfit.cn/post/27a7eda1d1564d588c76bd24a70d426f

作者:Gleb Kumichev

正文完
 0