本教程是一个系列免费教程,争取每月更新2到4篇。(由于精力有限,近期停止了一段时间,在此向大家道个歉)。
主要是基于图深度学习的入门内容。讲述最基本的基础知识,其中包括深度学习、数学、图神经网络等相关内容。该教程由代码医生工作室出版的全部书籍混编节选而成。偏重完整的知识体系和学习指南。在实践方面不会涉及太多基础内容 (实践和经验方面的内容,请参看原书)。
文章涉及使用到的框架以PyTorch和TensorFlow为主。默认读者已经掌握Python和TensorFlow基础。如有涉及到PyTorch的部分,会顺带介绍相关的入门使用。
本教程主要针对的人群:
- 已经掌握TensorFlow基础应用,并想系统学习的学者。
- PyTorch学习者
- 正在从TensorFlow转型到PyTroch的学习者
- 已经掌握Python,并开始学习人工智能的学者。
在上一篇的结尾出介绍了GfNN模型可以SGC网络可以弥补SGC模型无法拟合非线性数据的不足。本篇就来介绍下GfNN模型的结构、原理以及在DGL中的实现。
1 了解GfNN的网络结构
图滤波神经网络 (Graph filter Neural Network, GfNN)模型的主要思想就是在SGC模型后面加入深度学习中的非线性拟合功能。通过这种方式来弥补SGC网络无法拟合非线性数据的不足。
在掌握了SGC和深度神经网络的基础上,会很容易理解GfNN的结构。GfNN的结构只是在SGC后面加了1层全连接网络而已。如图10-17所示。
从图中,可以看到GfNN和GCN具有相似的高性能。由于GfNN在学习阶段不需要邻接矩阵的乘法,因此它比GCN要快得多。此外,GfNN对噪声的容忍度也更高。
GfNN模型更像是一个框架。框架中包含了两部分:
(1)通过多跳的方式,将图信息融合到图解点特征中。
(2)用深度学习的方法,对融合后的图节点特征进行拟合。
基于这个框架,可以不仅仅限于图10-17中的全连接神经网络结构。在实际应用中,可以像普通的深度学习任务一样,根据数据的特征和任务的特点,选用适合的神经网络来搭建模型。
有关GfNN的更多详细信息可以参考论文(arXiv: 1905.09550,2019)
2 了解DGL库中GfNN的实现方式
在SGConv代码的基础稍加修改就可以实现一个带有全连接的GfNN模型。
2.1. DGL库中GfNN的代码实现
实现SGConv类的主要代码如下:
代码文件: dglGfNN.py(片段)
代码语言:javascript复制01 class GfNN(nn.Module): #定义GfNN类
02 def __init__(self,in_feats, n_hidden, n_classes,
03 k, activation, dropout, cached=True,bias=False):
04 super(GfNN, self).__init__()
05 self.activation = activation #激活函数
06 self.sgc = SGConv(in_feats, n_hidden, k,cached, bias)
07 self.fc = nn.Linear(n_hidden, n_classes)
08 self.dropout = nn.Dropout(p=dropout)
09 def forward(self, g,features):
10 x = self.activation(self.sgc(g,features))#对SGC结果进行非线性变换
11 x = self.dropout(x)
12 return self.fc(x) #对变换后的特征进行全连接处理
13
14 model = GfNN(feats_dim,n_hidden=512,n_classes=n_classes, #实例化GfNN模型
15 k=2,activation= nn.PReLU(512) ,dropout = 0.2)
代码第14行演示了实例化GfNN模型的过程。一般使用激活函数PReLU效果会更好一些。
2.2. 技术细节:什么是PReLU激活函数
PReLU:是一个ReLU激活函数的变种,其数学公式如下。
其中, a是一个调节参数,该参数可以通过自学习得来。
在PyTorch中,PReLU的原形定义如下:
代码语言:javascript复制torch.nn.PReLU(num_parameters=1, init=0.25)
其中参数num_parameters代表可学习参数的个数,init代表可学习参数的初始值。
2.3. GfNN模型的思想
GfNN模型的思想会比模型本身的意义更大。该模型提供了一个非常好的思路,可以使非欧数据与深度学习技术更好的结合到一起。