Graph Representation 图神经网络html
图表示学习(representation learning)——图神经网络框架,主要涉及PyG、DGL、Euler、NeuGraph和AliGraph五个框架。除了NeuGraph没有开源外,其它框架都已开源。node
PyGgit |
DGLgithub |
Euler算法 |
NeuGraph数据库 |
AliGraph编程 |
Dortmund缓存 |
NYU网络 |
Alibaba架构 |
PKU |
Alibaba |
ICLR workshop’19 |
ICLR’19 |
N/A |
ATC’19 |
VLDB’19 |
2018.5 |
2018.12 |
2019.1 |
2019 |
2019 |
PyG在PyTorch上实现,最核心的类是torch_geometric.nn.MessagePassing
,用户只需定义消息传递$\phi$(message()
)、更新函数$\gamma$(update()
)和聚合函数$Agg$便可。
GCN的传播规则用向量可表成
\[\mathbf{x}_i^{(k)} = \sum_{j \in \mathcal{N}(i) \cup \{ i \}} \frac{1}{\sqrt{\deg(i)} \cdot \sqrt{\deg(j)}} \cdot \left( \mathbf{\Theta} \cdot \mathbf{x}_j^{(k-1)} \right)\]
进而可表示成gather
和scatter
的两个过程。
PyTorch Geometric 使实现图神经网络变得简单。例如,edge convolutional layer实现边缘卷积层:
import torch
from torch.nn import Sequential as Seq, Linear as Lin, ReLU
from torch_geometric.nn import MessagePassing
class EdgeConv(MessagePassing):
def __init__(self, F_in, F_out):
super(EdgeConv, self).__init__(aggr='max') # "Max" aggregation.
self.mlp = Seq(Lin(2 * F_in, F_out), ReLU(), Lin(F_out, F_out))
def forward(self, x, edge_index):
# x has shape [N, F_in]
# edge_index has shape [2, E]
return self.propagate(edge_index, x=x) # shape [N, F_out]
def message(self, x_i, x_j):
# x_i has shape [E, F_in]
# x_j has shape [E, F_in]
edge_features = torch.cat([x_i, x_j - x_i], dim=1) # shape [E, 2 * F_in]
return self.mlp(edge_features) # shape [E, F_out]
DGL和PyG都是目前运用得最普遍的图神经网络库,原理都差很少,但各有优劣。好比DGL是无关平台(platform-agnostic)的,只要底层是深度学习库,均可以灵活支持;支持随机游走和随机采样。
DGL将消息传递的式子拆分红对边应用(edge-wise)和对结点应用(node-wise)
\[\begin{cases}
\mathbf{m}_i^{(k+1)} = \phi^e\left(\mathbf{v}_i^{(k)},\mathbf{v}_j^{(k)},\mathbf{e}_{j,i}^{(k)}\right)\\\\
\mathbf{v}_i^{(k+1)} = \phi^v\left(\mathbf{v}_i^{(k)},\mathop{Agg}_{j\in\mathcal{N}_i}\mathbf{m}_i^{(k+1)}\right)
\end{cases}\]
其中$\phi^e$是消息函数,$\phi^v$是更新函数。
先前的库都须要用户用稀疏矩阵(CSR/COO)存储图,稠密张量存储特征,大量的底层设施会暴露给用户;而DGL底层设施都交由runtime系统进行管理。
深度学习系统最大问题在于没有办法高效表示图数据,而图系统最大的问题在于无法自动微分!
现有用得最普遍的框架是前面两个框架DGL和PyG,但(早期版本的)DGL和PyG只是提供了一个编程框架(面向图的消息传递模型),并无深度解决计算的问题(这很大程度也是GCN很难火起来的缘由,由于没法作到很高的可扩展性)。在GCN的原做实现和GraphSAGE的原做实现中,都使用了TensorFlow进行编程,所采用的方法都是简单暴力的矩阵乘,这样其实很大程度忽略了图计算框架这些年取得的成果。所以NeuGraph的出现也正是为了弥合这二者,将图计算与深度学习有机地融合起来。(这也是matrix-based和matrix-free两种方法的对碰。)
NeuGraph把常见的GNN分为三类:图卷积、图循环、图注意力网络。
进而提出了SAGA-NN (Scatter-ApplyEdge-Gather-ApplyVertex with Neural Networks)编程模型,其中SAGA部分属于图计算的消息传递,而两个A则是深度学习神经网络的应用。
因为GCN相比起传统的图算法(在图计算层面上)要简单不少,就是对全图不断进行遍历,所以Scatter和Gather是肯定的,而两个Apply阶段则是用户自定义的函数。(因此彷佛NeuGraph无法实现GraphSAGE,由于GraphSAGE的邻域是由必定策略采样出来的,而不是取所有邻域)。
目前的深度学习框架都很难处理大图,由于GPU的内存没法存储这么大规模的图,所以NeuGraph在数据流抽象的基础上进行了图划分。
(关于计算硬件,这里是值得考虑的。GPU在稠密矩阵计算上具备先天优点,但若是换成稀疏阵优点是否还存在呢。图处理框架的发展证实了CPU集群有办法承担大规模的图计算任务,从这种角度来看的话是否CPU在GNN的处理上也更存在优点呢?或者更加激进地,利用FPGA实现这样既能高效遍历又能高效算矩阵的架构是否有办法呢?)
按边划分为chunk(准确来讲是把邻接矩阵按列划分),而后送到不一样的GPU上进行计算,优化方法(streaming out of GPU core):
AliGraph是Alibaba内部的图计算系统,已经商用在淘宝各类预测任务上,而且取得了很好的效果。
提出目前GNN面临着四个问题:大规模、异构、属性、动态图。
关于GNN的抽象,AliGraph就比NeuGraph要作得更好一些,考虑到了采样过程。
系统架构从上到下包括应用层、算法层、算子层、采样层和存储层,以下图。
Storage Level
参考连接:
https://www.h5w3.com/128316.html
https://github.com/rusty1s/pytorch_geometric