GraphSage:大型图上的表示学习 [git项目地址]
GraphSage:大型图上的表示学习
作者:(),()
概述
此目录包含运行 GraphSage 算法所需的代码。GraphSage 可视为图卷积的随机泛化,它对于包含丰富特征信息的大规模动态图尤其有用。有关该算法的详细信息,请参阅我们的
注意: GraphSage 现在还更好地支持对较小的静态图和没有节点特征的图进行训练。原始算法和论文专注于归纳泛化任务(即为训练期间不存在的节点生成嵌入),但许多基准/任务使用不一定具有特征的简单静态图。为了支持这种用例,GraphSage 现在包含可选的“身份特征”,可以与其他节点属性一起使用或单独使用。包括身份特征会增加运行时间,但也可能提高性能(通常存在过度拟合的风险)。请参阅下面的“运行代码”部分。
注意: GraphSage 适用于大型图(>100,000 个节点)。子采样的开销将开始超过其在较小图上的优势。
example_data 子目录包含蛋白质-蛋白质相互作用数据的小示例,其中包括 3 个训练图 + 一个验证图和一个测试图。完整的 Reddit 和 PPI 数据集(论文中描述)可在项目上找到。
如果您在工作中使用此代码或 GraphSage 算法,请引用以下论文:
<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code> @inproceedings{hamilton2017inductive,
author = {Hamilton, William L. and Ying, Rex and Leskovec, Jure},
title = {Inductive Representation Learning on Large Graphs},
booktitle = {NIPS},
year = {2017}
}
</code></span></span></span></span>
要求
需要最新版本的 TensorFlow、numpy、scipy、sklearn 和 networkx(但 networkx 必须 <=1.11)。您可以使用以下命令安装所有必需的软件包:
<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>$ pip install -r requirements.txt
</code></span></span></span></span>
为了保证您拥有正确的软件包版本,您可以使用轻松设置虚拟环境。有关更多信息,请参阅下面的 Docker 小节。
Docker
如果你还没有安装,那么你需要安装它。(只需点击前面的链接,安装过程非常简单)。
您可以在镜像中运行 GraphSage。克隆项目后,按如下方式构建并运行镜像:
<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>$ docker build -t graphsage .
$ docker run -it graphsage bash
</code></span></span></span></span>
或者启动 Jupyter Notebook 而不是 bash:
<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>$ docker run -it -p 8888:8888 graphsage
</code></span></span></span></span>
运行 GPU 映像:
<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>$ docker build -t graphsage:gpu -f Dockerfile.gpu .
$ nvidia-docker run -it graphsage:gpu bash
</code></span></span></span></span>
运行代码
example_unsupervised.sh 和 example_supervised.sh 文件包含代码的示例用法,分别使用 GraphSage 的无监督和监督变体。
如果您的基准/任务不需要推广到未见过的数据,我们建议您尝试将“--identity_dim”标志设置为 [64,256] 范围内的值。此标志将使模型嵌入唯一节点 ID 作为属性,这将增加运行时间和参数数量,但也可能会提高性能。请注意,您应该设置此标志,而不是尝试将密集的独热向量作为特征传递(由于稀疏性)。身份特征的“维度”指定稀疏身份特征查找表中每个节点有多少个参数。
请注意,example_unsupervised.sh 设置了一个非常小的最大迭代次数,可以增加该次数以提高性能。我们通常发现,即使损失非常接近收敛(即,即使损失以非常缓慢的速度下降),性能仍会继续提高。
注意:对于 PPI 数据以及允许单个节点属于多个类别的任何其他多输出数据集,需要--sigmoid
在监督训练期间设置标志。默认情况下,模型假定数据集处于“独热”分类设置中。
输入格式
作为输入,代码至少需要指定一个 --train_prefix 选项,该选项指定以下数据文件:
- <train_prefix>-G.json -- networkx 指定的 json 文件,用于描述输入图。节点具有“val”和“test”属性,分别指定它们是否是验证集和测试集的一部分。
- <train_prefix>-id_map.json——将图节点 id 映射到连续整数的 json 存储字典。
- <train_prefix>-class_map.json——将图节点 ID 映射到类的 json 存储字典。
- <train_prefix>-feats.npy [可选] --- 一个 numpy 存储的节点特征数组;排序由 id_map.json 给出。可以省略,并且只使用身份特征。
- <train_prefix>-walks.txt [可选] --- 指定随机游走共现的文本文件(每行一对)(*仅适用于 graphsage 的无监督版本)
要在新数据集上运行模型,您需要制作上述格式的数据文件。要为无监督模型运行随机游走并生成 -walks.txt 文件,您可以使用run_walks
中的函数graphsage.utils
。
模型变体
用户还必须指定--model,其变体在论文中有详细描述:
- graphsage_mean——基于均值的聚合器的 GraphSage
- graphsage_seq——基于 LSTM 的聚合器的 GraphSage
- graphsage_maxpool——带有最大池化聚合器的 GraphSage(如 NIPS 2017 论文中所述)
- graphsage_meanpool——带有均值池化聚合器的 GraphSage(池化聚合器的一种变体,其中元素均值取代了元素最大值)。
- gcn——基于 GCN 的聚合器的 GraphSage
- 的一个实现(在代码中简称为 n2v)。
日志目录
最后,应指定 --base_log_dir(默认为当前目录)。模型和日志文件的输出将存储在 base_log_dir 的子目录中。记录数据的路径将采用以下形式<sup/unsup>-<data_prefix>/graphsage-<model_description>/
。监督模型将输出 F1 分数,而无监督模型将训练嵌入并存储它们。无监督嵌入将存储在名为 val.npy 的 numpy 格式文件中,其中 val.txt 将嵌入的顺序指定为每行节点 ID 列表。请注意,完整的日志输出和存储的嵌入大小可能为 5-10Gb(在使用无监督变体运行时的完整数据)。
使用无监督模型的输出
GraphSage 的无监督变体将如上所述将嵌入输出到日志目录。然后,这些嵌入可用于下游机器学习应用程序。该eval_scripts
目录包含将嵌入输入简单逻辑分类器的示例。
致谢
该代码库的原始版本最初是从中分叉出来的,我们非常感谢 Thomas Kipf 提供他的代码。我们还要感谢 Yuanfang Li 和 Xin Li 为基于这项工作的课程项目做出了贡献。请参阅论文了解资金详情和其他(与代码无关的)致谢。