用 Pytorch 实现一个简单的图卷积神经网络
深度学习在序列化数据的处理上取得了良好的效果, 但对于非欧空间中的数据处理问题却长时间难以突破. 在 2017 年, Kipf 等人在图神经网络上利用信号处理中的谱方法成功实现了卷积操作, 将卷积神经网络成功应用在图上, 即图卷积神经网络 (Graph Convolutional Network) 开启了在图上进行深度学习的新时代.
本文通过利用 GCN 实现一个简单的图数据集的分类问题展示图神经网络的效果
本文不会涉及到任何 GCN 的理论知识, 仅适用于想体验 GCN 的效果的朋友们尝鲜.
数据集介绍
Zachary karate club 是一个美国大学空手道俱乐部的社会网络图, 网络中包含 34 34 34 个节点和 78 78 78 条边, 分别表示 34 34 34 位成员和他们之间的关系, 若两成员间有边存在, 则该两位成员存在友谊关系. 详细信息可以在这里看到. 在该网络中, 俱乐部的成员最终分化为由管理员和教练带头的两个组织.
本文使用 networkx 导入数据集.
import networkx as nx
G = nx.karate_club_graph()
print(G.number_of_nodes()) # 34
print(G.number_of_edges()) # 78
GCN 介绍
与普通的卷积神经网络一样, GCN 的原理也是利用堆叠一定卷积层来实现, 层与层之间同样有激活函数.
首先介绍拉普拉斯矩阵 (Laplacian matrix), 定义为
L = D − A L = D - A L=D−A
其中, A A A 为图的邻阶矩阵, D D D 为图的度矩阵, D D D 的定义为
D = { 结 点 i 的 度 , i = j 0 , o t h e r w i s e \begin{aligned} D = \left\{\begin{matrix} 结点 i 的度 &, \space i=j\\ 0 &, \space otherwise \end{matrix}\right. \end{aligned} D={