GraphSage:大型图上的表示学习 [git项目地址]

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 为基于这项工作的课程项目做出了贡献。请参阅论文了解资金详情和其他(与代码无关的)致谢。

Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk