嘉宾简介
亚马逊上海人工智能研究院工程师,Deep Graph Library作者之一。
DGL 框架是由纽约大学和 AWS 工程师共同开发的开源框架,旨在为大家提供一个在图上进行深度学习的工具,帮助大家更高效的实现算法。
图神经网络在这两年很热,学术论文从 2016 年开始,增长相当迅速。而今年,可以说是该研究方向集中爆发的一年,像 ICML 有 30~50 篇论文是专门研究图学习的。
关于图学习的一些基础知识,我们在之前的一些文章中都有详细的介绍,大家可以参考《浅析图卷积神经网络》。
图广泛的应用
我们来看一个具体的例子,在自然语言中有一个非常火的模型叫 Transformer ,Transformer 本身就可以看作是一个 Graph。通过在图上不断的操作来更新每个节点的信息。
如上图所示,左边是 Transformer 的整个流程,右图是将 Transformer 看成 Graph 后的拓扑结构。在 Transformer 中,它的 encoder 是一个全连接的神经网络,就是任意两个节点之间都有一条边,而且是一个有向图,会有双向的边。在 decoder 的部分,因为是一个一个 token 来解码的,所以前面的词不知道后面词的信息。所每个节点只有它之前的节点指向它的边,而没有它后面的节点指向它的边。
综合起来看,编码器和解码器之间是一个完全的二分图。
这里也涉及到了我们组的另外两个工作,一个叫 star transformer ,主要目的是减少原来的 Transformer 的计算代价。主要想法是通过一个中心节点聚合所有节点的信息,然后再通过这个中心节点将信息发出去。效果挺好,这篇论文被 NAACL 2019 收录。另外一项工作是 SegTree-Transformer 还在审稿中,后续如果有结果,会和大家详细分享。
Star-Transformer:
https://arxiv.org/pdf/1902.09113.pdf
DGL 框架设计理念
用现有的一些框架比如 TensorFlow、Pytorch、MXNet 等实现图神经网络模型都不太方便,同样现有框架实现图神经网络模型的速度不够快。
上面三个例子中都是速度不够或者内存有溢出的情况。为什么图神经网络模型在之前的一些框架中不容易编写呢?
因为很多图神经网络的模型,可以看作是消息传递的过程,每一个节点会发出它自己的消息,也会接受来自其它节点的消息。然后在得到所有信息之后做聚合,计算出节点新的表示。原有的深度学习框架都是进行张量运算,但是图很多时候并不能直接表示成一个完整的张量,需要手动补零,这其实很麻烦,不高效。
DGL
DGL 是基于现有框架,帮助用户更容易实现图神经网络模型。黑色框都是已经实现的,灰色框是还未实现的计划之中的。DGL 现在主要是以消息传递的接口作为核心,同时提供图采样以及批量处理图的接口。
使用 DGL 与没有使用的计算速度对比
如何使用 DGL
DGL 消息传递 API
DGL 的 API 主要有两部分,一是 message function(消息函数),二是 reduce function(累和函数)。
消息函数通过边获得变量,用 e.src.data 获得这条边出发节点的特征信息,通过 e.dst.data 获得目标节点的特征信息。边也拥有自己的特征信息,如上图中的 e.data。消息函数可以获得出发节点和目标节点的特征信息,描述了需要发给目标节点做下一步计算的信息。
上图描述了消息传递模型,消息函数把节点 1 和节点 2 的信息都发送给节点 3 ,可以发送的信息包括v1 、v2 和 v3 以及每条边上的信息。
目标节点在获得其他节点以及边的特征信息之后,通过累和函数计算出一个新的表示。通过上图可以看到,累和函数获得了消息函数传递过来的信息 M13、M23 同时还有自身的节点信息。上述的整个过程就是 DGL 现有的核心。
比如一个最简单的图神经网络案例。每个节点获得所有邻居节点的特征信息求和,并通过一个非线性函数得到该节点新的表示。
具体的实现过程
消息融合
graph data 有一个特点,就是它的边会远多于节点的数量,比如说节点有 100个,但是边可能有 2000,甚至更多。按照上面的方法处理,每一个节点的信息都要先拷贝到边上,再发给目标节点,在这个过程中,很多拷贝是重复的,因为一个节点可以有多条边。也即消息张量的大小会正比于图中边的数量。所以当图增大的时候,消息张量消耗的内存空间也会显著上升,可能是 O(n2)。
比如模型 GraphSage 中 Reddit 的数据:
内存使用量骤增 500 倍
DGL 的解决方法是消息融合(Fuse Message Passing)。
对所有邻居节点的特征信息求和等于邻接矩阵乘上特征张量。所以我们提供了一个矩阵乘法的优化,这样更加高效。
消息融合的不足之处:支持的函数有限。下一个版本的改进方案:
图批量功能
图批量功能(Batch Multiple Graphs),将 n 张小图打包在一起的操作可以看成是生成一张含 n 个不相连小图的大图。这个方法可以实现线性加速。
巨图训练
未来图神经网络计算量会很大,会需要采样和分布式。这个还在开发当中......
开发路线图
新版本发布地址:
https://github.com/dmlc/dgl/issues/450
问答
1. 感觉DGL这个框架没有pyG支持的model多,以后会支持更多模型吗?比如各类GAE现在基本没有?
回答:是的,但是大家目前都在忙于开发新功能。暑假会有实习生加入之后会添加更多模型,如果希望我们实现一些模型,可以直接在我们 issue 里提。
2. 可以处理构建的加权图吗?
回答:支持的,权重还可以是向量。因为 DGL 在边上也会存储数据。
3. 会支持 GraphSage 吗?
回答:已经提供了 GraphSage。
4. 请问您怎么看待GCN作者从谱的角度来考虑和DGL从消息发送和累和的角度的区别?
回答:GCN谱推导很有意思,我觉得是不同的角度,前两天有一篇说GCN都是low pass filter。
5. 异构图什么时候可以支持?
回答:异构图我们接口已经确定了,可以在仓库的pr 里找到,完全实现加测试可能还要两个月。
6. 有图分类的吗?
回答:图分类有,我们的tutorial里有个toy example。
7. mailbox['m']的size具体是什么?
回答:mailbox 第一维是 bucket size 我这里没写,就是 dgl 会把度一样的节点 batch 在一起。
8. 内建函数的功能是固定的吗,只能发送头节点信息和求和?
回答:内建函数支持 sum max min prod,发送支持copy_src,src_mul_edge,copy_edge。但是 reduce 其实能任意写,就是没有 builtin 那么快。你拿了邻居特征之后想怎么写都行。
9. 这样内建 message 函数是不是反而是一种限制?
回答:也可以不用内建的啊,内建的 message+reduce 会被 fuse 用我们自己写的kernel。
10. Star-Transformer 中的 Position Embedding 有 DGL 实现吗?
回答:transformer 的 positional encoding 就参考 transformer 的吧,我们 tutorial 里有提到,详细的可以看专门介绍 transformer 的教程。
参考资料:
https://arxiv.org/abs/1810.04805
https://arxiv.org/pdf/1706.03762.pdf
11. 百亿边的图, 能用DGL跑么?
回答:能,我上面有提到单机跑5亿点250亿边的情况。就是要内存很大的实例。