主要是基于图深度学习的入门内容。讲述最基本的基础知识,其中包括深度学习、数学、图神经网络等相关内容。该教程由代码医生工作室出版的全部书籍混编节选而成。偏重完整的知识体系和学习指南。在实践方面不会涉及太多基础内容。
文章涉及使用到的框架以PyTorch和TensorFlow为主。默认读者已经掌握Python和TensorFlow基础。如有涉及到PyTorch的部分,会顺带介绍相关的入门使用。
本教程主要针对的人群:
已经掌握TensorFlow基础应用,并想系统学习的学者。
PyTorch学习者
正在从TensorFlow转型到PyTroch的学习者
已经掌握Python,并开始学习人工智能的学者。
本篇文章主要介绍简化图卷积模型的结构、原理以及在DGL中的实现。
在GCN中,如果抛开全连接部分的计算,在每一层中使用拉普拉斯矩阵与节点特征相乘的过程,可以理解为对该层各节点的邻居特征做一次平均值计算。每做一次计算代表对邻居节点1跳距离的信息聚合。
这种多层叠加的图卷积操作可以起到类似深度学习中的卷积作用——通过多次卷积的叠加操作,来增大模型的感受视野,实现高维特征的拟合,从而实现最终的特征分类。
SGC模型突破了GCN的层数限制,将GCN每层的激活函数去掉(不需要非线性变换)。利用图中的节点关系,直接计算图节点间局部邻居的平均值。通过多次计算节点间1跳距离的平均值来实现卷积叠加的效果。
这种简化版本的图卷积模型就叫做简化图卷积模型(Simple Graph Convolution 简称SGC)。该模型主要由两部分组成,见公式1-2、10-3。
公式1-3表示一个分类器,该过程与深度学习中的分类器完全一致。对特征提取后的数据进行全连接神经网络处理,然后再通过SoftMax进行分类。
由公式1-2和1-3可以看出SGC将图中节点关系的信息融合过程提到了样本处理环节,而不是像图卷积那样在模型的特征拟合过程中再去融合,从而简化了图神经网络模型逻辑也方面了模型训练。
GCN与SGC的处理关系见下图。
SGC之所以可以设计成这种结构,主要源于其固定的卷积核(图节点间的关系),在神经网络中,卷积核的权重是需要通过训练得到的。而在图神经网络中,卷积核的权重则是样本中自带的。这是二者的最大差异。即SGC使用了一个固定的低通滤波器,然后是线性分类器。这种结构大大简化了原有GCN的训练过程。其完整的网络结构图如图1-2所示。
直接使用DGL库中的简化图卷积层SGConv可以很方便的搭建SGC模型。在DGL库中,SGC的使用方法与注意力图卷积层GATConv非常相似,输入参数同样是样本特征和加入自环后的邻接矩阵图。
SGConv类的内部实现步骤如下:
(1)计算图中的度矩阵(获得求平均值的分母)。
(2)按照指定的次数k,循环计算每一跳节点特征的平均值。
(3)在每一次循环内,按照图的传播方式对每个节点除以该节点的边数,得到特征平均值。
(4)对k次特征计算之后的结果做全连接处理,输出分类结果。
实现SGConv类的主要代码如下:
代码文件:sgconv.py(片段)
该代码是DGL库中SGConv类的forward方法,代码第6行调用了in_degrees获取图graph中每个节点的被连接边数来作为该节点的度。此时,图对在象graph中,in_degrees与out_degrees的值都是相同的,这是因为在预处理阶段,已经将邻接矩阵转化成了无向图对称矩阵。
提示:
代码第6行中的clamp函数作用是对张量值按照指定的大小区间进行截断。代码clamp(min=1)的含义是将度矩阵中边长小于1的值都变为1。
利用这种方法可以很方便的为图中节点加入自环。
Clamp函数还可以用作梯度截断,通过对其参数min与 max进行指定,即可将梯度限定在指定范围之内。
代码第19行,对参数_cached进行判断,并根据该参数是否为True来决定是否保存处理特征抽取器的处理结果。如果_cached为True,则在多层SGConv中,只对初始的特征做一次基于图节点关系的特征抽取。剩下的计算与深度学习中的全连接网络完全一致。
想要更详细的了解SGConv实现过程,可以参考SGConv类的源码。具体位置在DGL安装库路径下的\nn\pytorch\conv\sgconv.py中。例如作者的本机路径为:
D:\ProgramData\Anaconda3\envs\pt13\Lib\site-packages\dgl\nn\pytorch\conv\sgconv.py
简化图卷积模型(SGC)通过依次消除非线性并折叠连续层之间的权重矩阵来减少这种过多的复杂性。消去了图卷积运算中不必要的复杂性和冗余计算。这些简化不会在许多下游应用中对准确性产生负面影响,同样可以扩展到更大的数据集。
虽然SGC模型在基准数据集上计算速度快、精度高。但该模型是建立在节点特征本身线性可分的基础之上的。如果原始的节点特征不是线性可分,则每个节点经过k次1跳传播之后的特征也不是线性可分(因为中间没有非线性变换)。
SGC只是在图结构信息与节点特征的融合部分对图卷积做了优化,而对于图卷积的非线性学习部分没有任何贡献。
为了弥补SGC模型无法拟合非线性数据的不足,可以在网络中加入更多深入学习的非线性拟合神经元。即,使用多层SGC,并在层与层之间加入非线性激活函数。或是使用GfNN模型。