https://zhuanlan.zhihu.com/p/112477513git
“ 图神经网络火了这么久,是时候掌握它了。”github
本文包括如下内容,阅读时间10min算法
- 图神经网络是什么意思
- 文本如何构建图
- 图卷积神经网络
- 源代码实现
- 图卷积神经网络最新进展
本文阅读基础网络
- 神经网络基础
- 本文不包含拉普拉斯矩阵的数学推导
01“图神经网络”是什么
过去几年,神经网络在机器学习领域大行其道。好比说卷积神经网络(CNN)在图像识别领域的成功以及循环神经网络(LSTM)在文本识别领域的成功。对于图像来讲,计算机将其量化为多维矩阵;对于文本来讲,经过词嵌入(word embedding)的方法也能够将文档句子量化为规则的矩阵表示。以神经网络为表明的深度学习技术在这些规范化的数据上应用的比较成功。可是现实生活中还存在不少不规则的以图的形式存在的数据。好比说社交关系图谱中人与人之间的链接关系,又好比说电子商务系统中的人与货物的关系等等,这些数据结构像下面这样:数据结构


图神经网络(Graph Neural Network, GNN)是指神经网络在图上应用的模型的统称,图神经网络有五大类别:分别是:图卷积网络(Graph Convolution Networks,GCN)、 图注意力网络(Graph Attention Networks)、图自编码器( Graph Autoencoders)、图生成网络( Graph Generative Networks) 和图时空网络(Graph Spatial-temporal Networks)。本文只重点介绍最经典和最有意义的基础模型GCN。机器学习
【清华大学孙茂松教授组在 arXiv 发布了论文Graph Neural Networks: A Review of Methods and Applications,做者对现有的 GNN 模型作了详尽且全面的综述】。函数
02 文本如何构建图
咱们要构建一个具备定义好n个节点,m条边的图。性能
以经典的分类任务为例。我抽屉里有5本不一样的机器学习书,里面一共有a个章节,同时全部书里面一共有b种不一样的单词(不是单词个数,是全部的单词种类)。而后咱们就能够给a个章节和b个单词标记惟一的id,一共n=a+b个节点,这是咱们图的节点。学习
-边的建立-优化
咱们有两种节点,章节和单词。而后边的构建则来源于章节-单词 关系和 单词-单词 关系。对于边章节-单词 来讲,边的权重用的是单词在这个章节的TF-IDF算法,能够较好地表示这个单词和这个章节的关系。这个算法比直接用单词频率效果要好[1]。单词-单词 关系的边的权重则依赖于单词的共现关系。咱们能够用固定宽度的滑窗对5本书的内容进行平滑,相似于word2vector的训练取样本过程,以此计算两个单词的关系。具体的算法则有PMI算法实现。
point-wise mutual information(PMI)是一个很流行的计算两个单词关系的算法。咱们能够用它来计算两个单词节点的权重。节点 i 和节点 j 的权重计算公式以下:


PMI(i, j)的计算方式以下:


#W(i) 表示全部的滑窗中包含单词节点 i 的个数。
#W(i; j) 表示全部的滑窗中同时包含单词节点 i 和单词节点 j 的个数。
#W 是总的滑窗次数
PMI值为正则说明两个单词语义高度相关,为负则说明相关性不高。所以最后的图构造过程当中只保留了具备正值的单词节点对组成的边。
图的节点和边肯定了,接下来介绍如何应用图卷积神经网络进行一些学习应用。
【2019年AAAI有一篇论文使用了此方法进行章节分类。题目“Graph Convolutional Networks for Text Classification”】
03 图卷积神经网络
图卷积神经网络(Graph Convolutional Network, GCN)是一类采用图卷积的神经网络,发展到如今已经有基于最简单的图卷积改进的无数版本,在图网络领域的地位正如同卷积操做在图像处理里的地位。
什么是卷积
离散卷积的本质是一种加权求和。[1]


CNN中卷积的本质就是利用共享参数的过滤器 kernel,经过计算中心像素点及相邻像素点的加权和来构成feature map实现空间特征的提取,加权系数就是卷积核的权重系数。卷积核的权重系数经过BP算法获得迭代优化。卷积核的参数正是经过优化才能实现特征提取的做用,GCN的理论很重要一点就是引入能够优化的卷积参数来实现对图结构数据特征的获取。


图卷积的目的相似,寄但愿学习到一种节点表示,该节点表示依赖于每一个节点及其周边相邻的节点。而后该节点表示就能够输出用做分类任务了,就是咱们常说的节点分类。
那么有什么东西来度量节点的邻居节点这个关系呢?拉普拉斯矩阵。举个简单的例子,对于下图中的左图而言,它的度矩阵 ,邻接矩阵 和拉普拉斯矩阵 分别以下图所示,度矩阵(degree matrix) 只有对角线上有值,为对应节点的度,其他为0;邻接矩阵只有在有边链接的两个节点之间为1,其他地方为0;拉普拉斯矩阵 为 。这是比较简单的拉普拉斯矩阵。


如下是重点
图卷积网络(GCN)第一层的传播公式以下:


ρ是激活函数,好比ReLU。
上式的 咱们暂时理解等同于邻接矩阵A,表明图的拓扑结构,维度N*N,N表示节点个数;
X是第一层输入的特征矩阵,维度N*M,M表示每一个节点的特征向量维度;
Wo是权重参数矩阵,维度M*K,K表明转给下一层的向量维度。
所以第一层输出L1的向量维度就是 N*K。
在上面介绍的文本分类任务中,
X是原始输入,咱们用对角线为1的单位矩阵来表示,维度N*N;能够理解为是对节点的one-hot表示。Wo采用的参数是N*K随机初始化(K=200),。
XWo 的维度就是N*200,至关于对每一个输入节点作了embedding,维度为200。
A * XWo 这个矩阵乘法怎么理解?这才是理解图卷积的关键。复习一下矩阵乘法公式,发现新生成的L1这个N*K矩阵的每个节点的K个维度,都是对应该节点的相邻节点邻接权重乘以相邻节点在这个维度上的值的累加和。从而实现了经过一次卷积,GCN可让每一个节点都拥有其邻居节点的信息。
(不许确的讲,图的邻接矩阵乘以图节点embedding,就至关因而作一次卷积)
下面我画了一个示意图


结论:新生成的0号节点的向量所有由相邻的1号节点和3号节点的向量等加权求和获得。从而实现了周边节点卷积(加权求和)获得新的自身的目的。
(邻接矩阵A第一行0 1 0 1表示0号节点和1,3号节点相连,和2号不链接)
若是要让节点拥有周边更普遍的节点信息,能够屡次进行卷积。


上面的 若是用邻接矩阵替代的话有两个缺点。
- 没有考虑节点自身对本身的影响,由于邻接矩阵对角线为0;
- 邻接矩阵没有被规范化,这在提取图特征时可能存在问题,好比邻居节点多的节点倾向于有更大的影响力。
所以更经常使用的公式是:


又称为规范化对称邻接矩阵(normalized symmetric adjacency matrix)。关于这个公式理解,能够参考[1]
04 pytorch代码实现
有的人看代码更能理解。下面介绍了两层图卷积网络的模型定义:
class gcn(nn.Module):
def __init__(self, X_size, A_hat, args, bias=True): # X_size = num features
super(gcn, self).__init__()
self.A_hat = torch.tensor(A_hat, requires_grad=False).float()
self.weight = nn.parameter.Parameter(torch.FloatTensor(X_size, args.hidden_size_1))
var = 2./(self.weight.size(1)+self.weight.size(0))
self.weight.data.normal_(0,var)
self.weight2 = nn.parameter.Parameter(torch.FloatTensor(args.hidden_size_1, args.hidden_size_2))
var2 = 2./(self.weight2.size(1)+self.weight2.size(0))
self.weight2.data.normal_(0,var2)
if bias:
self.bias = nn.parameter.Parameter(torch.FloatTensor(args.hidden_size_1))
self.bias.data.normal_(0,var)
self.bias2 = nn.parameter.Parameter(torch.FloatTensor(args.hidden_size_2))
self.bias2.data.normal_(0,var2)
else:
self.register_parameter("bias", None)
self.fc1 = nn.Linear(args.hidden_size_2, args.num_classes)
def forward(self, X): ### 2-layer GCN architecture
X = torch.mm(X, self.weight)
if self.bias is not None:
X = (X + self.bias)
X = F.relu(torch.mm(self.A_hat, X))
X = torch.mm(X, self.weight2)
if self.bias2 is not None:
X = (X + self.bias2)
X = F.relu(torch.mm(self.A_hat, X))
return self.fc1(X)
# 第一层权重维度 args.hidden_size_1取200,
# 第二层权重维度args.hidden_size_2取20;
# args.num_classes=5
最开始介绍的5本书的章节和单词构成的图,一共有100个章节节点和5000个单词节点。每一个章节节点的标签是属于哪本书。一共五类。但愿经过对其中50个章节的标签进行标记和训练,让网络学会剩下50个章节属于哪本书。属于半监督学习。
05 图卷积神经网络最新进展
本文的写做基础是来源于AAAI2019的一篇论文Graph Convolutional Networks for Text Classification,用GCN作文本分类。在AAAI2020上,清华大学科大讯飞的学者提出张量卷积神经网络在文本分类的应用Tensor Graph Convolutional Networks for Text Classification,经过利用文本构成多种图结构,进一步提升文本分类的性能。
在崭新的的2020年,图神经网络GNN又有哪些崭新的发展可能呢?分享一个AAAI2020详细讲解GNN的ppt,很好的回答了这些问题。


连接 http://cse.msu.edu/~mayao4/tutorials/aaai2020/
参考阅读:
[1] 另类解读 https://zhuanlan.zhihu.com/p/89503068
[2] 另类解读 https://www.zhihu.com/question/54504471/answer/332657604
[3] 挖坑好文
Yao, Liang, Chengsheng Mao, and Yuan Luo. "Graph convolutional networks for text classification." Proceedings of the AAAI Conference on Artificial Intelligence. Vol. 33. 2019.
[4] 一个图卷积分类的项目代码 https://github.com/plkmo/Bible_Text_GCN
推荐阅读
- 能跟你聊DOTA的神经对话模型:Meena&DialoGPT
- LaserTagger: 文本生成任务的序列标注解决方案
- [CLS]预训练语言模型的前世此生[SEP]萌芽时代[SEP]
- 打造专属对话机器人,百度UNIT平台任务型对话体验
- REALM: Retrieval-Augmented Language Model Pre Training
- REALM后续:最近邻搜索,MIPS,LSH和ALSH
http://weixin.qq.com/r/SkistK3Eu-DErenX9x1Y (二维码自动识别)
参考
- ^离散卷积的本质是一种加权求和 https://www.zhihu.com/question/22298352