本文使用 Zhihu On VSCode 创作并发布

本文一作实在是太大佬了,让我和小伙伴焦虑了好一阵子。作者主页送你们,将这份焦虑传递下去。

Introduction
图生成有很多用处:
- 建模physical and social interactions
- 发现新的化学和分子结构
- 构建知识图谱
本文摘要直接指出了图生成问题的难点:
图生成模型需要学习到图的结构分布,然而图具有非唯一 (non-unique),高维以及给定图的边之间存在复杂、非局部的依存关系。
因此直接对复杂的图分布直接进行建模,并从这些分布中进行有效采样是一项挑战。
目前,图生成面临的挑战有:
- 要让模型在没有图结构假设的情况下,从一组观察到的图中直接学习生成模型;
- 具备从多个图以及大图中学习生成的能力;
- Large and variable output spaces:
个节点的图需要输出
的值才能完整表示,且每个图的边和节点也不是固定的数值;
- Non-unique representations:如果我们想学习一个有
个节点的图的结构,然而它最多可以表示为
个等效邻接矩阵,这会让训练变得很难。
- Complex dependencies:很明显,图中的边关系不可能简单地看作相互独立的,它们之间有复杂的依存关系。
GraphRNN
为解决上述问题,本文提出了 GraphRNN,以 autoregressive (or recurrent) 作为一系列新节点和边的添加方式绘制 graph,来捕获图中所有节点和边的复杂联合概率。
GraphRNN 可以视作一种级联形式,由两个RNN组成:
- graph-level RNN:维护图的状态并生成新节点;
- edge-level RNN:为新生成的节点生成新的边。
符号定义

GraphRNN 思路

Key Idea: 将不同节点顺序下的图表示为序列,并在这些序列上构建一个自回归的生成模型。
将graph建模成序列
定义从graphs到sequences的映射
其中,每个元素
由此,
在此基础上,对于图分布
这时,我们只需要学习
定义最后一个元素
GraphRNN 框架
即使
是一个编码了到目前为止生成的图的状态的向量;
是最近一个生成节点的邻接向量;
指定了下一个节点邻接向量的分布
。
文中指出,
算法总结为:

利用 BFS 处理变长度的序列
由于RNNs需要固定长度的输入向量,然而
将式1改为
BFS 以一个随机顺序
好处如下:
BFS 是一对多的,一个 BFS 序列可以转化为多个节点排序。因此我们需要训练的数量少了。
BFS排序通过减少 edge-level RNN 中进行的边缘预测的数量,来使学习变得更容易。因为如果我们新加入一个节点,那么它的连接边只能处在BFS搜索前沿的节点(当搜索完成时,可以想象成树的叶子节点)定义描述就是:
Proposition 1. Suppose
is a BFS ordering of
nodes in graph
, and
but
for some
then
and
这个性质是我们可以将可变长度的
,表示节点定义为固定长度的 M 维向量
与当前BFS队列中最大大小为M的节点之间的连通性:
至于这个 M 怎么去估计,见本文附录吧。
扩展到具有节点、边特征的Graph
GraphRNN可以扩展到具有节点和边特征的Graph生成,在节点顺序
作者的开源代码好像并没有这部分,我已经在github上发了issues。