写点什么

PGL 图学习项目合集 & 数据集分享 & 技术归纳业务落地技巧 [系列十]

作者:汀丶
  • 2022-12-02
    浙江
  • 本文字数:11738 字

    阅读完需:约 39 分钟

PGL 图学习项目合集 &数据集分享 &技术归纳业务落地技巧[系列十]

1.PGL 图学习项目合集

1.1 关于图计算 &图学习的基础知识概览:前置知识点学习(PGL)[系列一]https://aistudio.baidu.com/aistudio/projectdetail/4982973?contributionType=1


本项目对图基本概念、关键技术(表示方法、存储方式、经典算法),应用等都进行详细讲解,并在最后用程序实现各类算法方便大家更好的理解。当然之后所有图计算相关都是为了知识图谱构建的前置条件


1.2 图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二)https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1


现在已经覆盖了图的介绍,图的主要类型,不同的图算法,在 Python 中使用 Networkx 来实现它们,以及用于节点标记,链接预测和图嵌入的图学习技术,最后讲了 GNN 分类应用以及未来发展方向!


1.3 图学习初探 Paddle Graph Learning 构建属于自己的图【系列三】 https://aistudio.baidu.com/aistudio/projectdetail/5000517?contributionType=1


本项目主要讲解了图学习的基本概念、图的应用场景、以及图算法,最后介绍了 PGL 图学习框架并给出 demo 实践,过程中把老项目 demo 修正版本兼容问题等小坑,并在最新版本运行便于后续同学更有体验感


1.4 PGL 图学习之图游走类 node2vec、deepwalk 模型[系列四]https://aistudio.baidu.com/aistudio/projectdetail/5002782?contributionType=1


介绍了图嵌入原理以及了图嵌入中的 DeepWalk、node2vec 算法,利用 pgl 对 DeepWalk、node2vec 进行了实现,并给出了多个框架版本的 demo 满足个性化需求。



介绍词向量 word2evc 概念,及 CBOW 和 Skip-gram 的算法实现。



主要引入基本的同构图、异构图知识以及基本概念;同时对 deepWalk 代码的注解以及 node2vec、word2vec 的说明总结;(以及作业代码注解)


1.5 PGL 图学习之图游走类 metapath2vec 模型[系列五]https://aistudio.baidu.com/aistudio/projectdetail/5009827?contributionType=1


介绍了异质图,利用 pgl 对 metapath2vec 以及 metapath2vec 变种算法进行了实现,同时讲解实现图分布式引擎训练,并给出了多个框架版本的 demo 满足个性化需求。


1.6 PGL 图学习之图神经网络 GNN 模型 GCN、GAT[系列六] [https://aistudio.baidu.com/aistudio/projectdetail/5054122?contributionType=1](https://aistudio.baidu.com/aistudio/projectdetail/5054122?contributionType=1)


本次项目讲解了图神经网络的原理并对 GCN、GAT 实现方式进行讲解,最后基于 PGL 实现了两个算法在数据集 Cora、Pubmed、Citeseer 的表现,在引文网络基准测试中达到了与论文同等水平的指标。


1.7 PGL 图学习之图神经网络 GraphSAGE、GIN 图采样算法[系列七] https://aistudio.baidu.com/aistudio/projectdetail/5061984?contributionType=1


本项目主要讲解了 GraphSage、PinSage、GIN 算法的原理和实践,并在多个数据集上进行仿真实验,基于 PGl 实现原论文复现和对比,也从多个角度探讨当前算法的异同以及在工业落地的技巧等。


1.8 PGL 图学习之图神经网络 ERNIESage、UniMP 进阶模型[系列八]https://aistudio.baidu.com/aistudio/projectdetail/5096910?contributionType=1


ErnieSage 可以同时建模文本语义与图结构信息,有效提升 Text Graph 的应用效果;UniMP 在概念上统一了特征传播和标签传播, 在 OGB 取得了优异的半监督分类结果。



ERNIESage 运行实例介绍(1.8x 版本),提供多个版本 pgl 代码实现


1.9 PGL 图学习之项目实践(UniMP 算法实现论文节点分类、新冠疫苗项目)[系列九]https://aistudio.baidu.com/aistudio/projectdetail/5100049?contributionType=1


本项目借鉴了百度高研黄正杰大佬对图神经网络技术分析以及图算法在业务侧应用落地;实现了论文节点分类和新冠疫苗项目的实践帮助大家更好理解学习图的魅力。



图神经网络 7 日打卡营的新冠疫苗项目拔高实战



基于 UniMP 算法的论文引用网络节点分类,在调通 UniMP 之后,后续尝试的技巧对于其精度的提升效力微乎其微,所以不得不再次感叹百度 PGL 团队的强大!


༄ℳ持续更新中ꦿོ࿐

2.图网络开放数据集

按照任务分类,可以把数据集分成以下几类:


  • 引文网络

  • 生物化学图

  • 社交网络

  • 知识图谱

  • 开源数据集仓库

2.1 引文网络

1. Pubmed/Cora/Citeseer|


这三个数据集均来自于:《Collective classification in network data》


引文网络,节点为论文、边为论文间的引用关系。这三个数据集通常用于链路预测或节点分类。


数据下载链接:


https://aistudio.baidu.com/aistudio/datasetdetail/177587


https://aistudio.baidu.com/aistudio/datasetdetail/177589


https://aistudio.baidu.com/aistudio/datasetdetail/177591


INQS 实验室使用的数据集和所有展示的关系结构,数据集链接:https://linqs.org/datasets/


2. DBLP


DBLP 是大型的计算机类文献索引库。原始的 DBLP 只是 XML 格式,清华唐杰教授的一篇论文将其进行处理并获得引文网络数据集。到目前为止已经发展到了第 13 个版本。


DBLP 引用网络论文:《ArnetMiner: Extraction and Mining of Academic Social Networks》


原始数据可以从这里获得:https://dblp.uni-trier.de/xml/


如果是想找处理过的 DBLP 引文网络数据集,可以从这里获得:https://www.aminer.cn/citation


2.2 生物化学图

1. PPI


蛋白质-蛋白质相互作用(protein-protein interaction, PPI)是指两个或两个以上的蛋白质分子通过非共价键形成 蛋白质复合体(protein complex)的过程。


PPI 数据集中共有 24 张图,其中训练用 20 张,验证/测试分别 2 张。


节点最多可以有 121 种标签(比如蛋白质的一些性质、所处位置等)。每个节点有 50 个特征,包含定位基因集合、特征基因集合以及免疫特征。


PPI 论文:《Predicting multicellular function through multi-layer tissue networks》PPI 下载链接:http://snap.stanford.edu/graph


2. NCI-1


NCI-1 是关于化学分子和化合物的数据集,节点代表原子,边代表化学键。NCI-1 包含 4100 个化合物,任务是判断该化合物是否有阻碍癌细胞增长的性质。


NCI-1 论文:《Comparison of descriptor spaces for chemical compound retrieval and classification》


Graph Kernel Datasets 提供下载


3. MUTAG


MUTAG 数据集包含 188 个硝基化合物,标签是判断化合物是芳香族还是杂芳族。


MUTAG 论文:《Structure-activity relationship of mutagenic aromatic and heteroaromatic nitro compounds. correlation with molecular orbital energies and hydrophobicity》


https://aistudio.baidu.com/aistudio/datasetdetail/177591


4. D&D/PROTEIN


D&D 在蛋白质数据库的非冗余子集中抽取了了 1178 个高分辨率蛋白质,使用简单的特征,如二次结构含量、氨基酸倾向、表面性质和配体;其中节点是氨基酸,如果两个节点之间的距离少于 6 埃(Angstroms),则用一条边连接。


PROTEIN 则是另一个蛋白质网络。任务是判断这类分子是否酶类。


D&D 论文:《Distinguishing enzyme structures from non-enzymes without alignments》D&D 下载链接:https://github.com/snap-stanford/GraphRNN/tree/master/dataset/DD


PROTEIN 论文:《Protein function prediction via graph kernels》


Graph Kernel Datasets 提供下载


5. PTC


PTC 全称是预测毒理学挑战,用来发展先进的 SAR 技术预测毒理学模型。这个数据集包含了针对啮齿动物的致癌性标记的化合物。


根据实验的啮齿动物种类,一共有 4 个数据集:


PTC_FM(雌性小鼠)PTC_FR(雌性大鼠)PTC_MM(雄性小鼠)PTC_MR(雄性大鼠)


PTC 论文:《Statistical evaluation of the predictive toxicology challenge 2000-2001》


Graph Kernel Datasets 提供下载


6. QM9


这个数据集有 133,885 个有机分子,包含几何、能量、电子等 13 个特征,最多有 9 个非氢原子(重原子)。来自 GDB-17 数据库。


QM9 论文:《Quantum chemistry structures and properties of 134 kilo molecules》QM9 下载链接:http://quantum-machine.org/datasets/


7. Alchemy


Alchemy 包含 119,487 个有机分子,其有 12 个量子力学特征(quantum mechanical properties),最多 14 个重原子(heavy atoms),从 GDB MedChem 数据库中取样。扩展了现有分子数据集多样性和容量。


Alchemy 论文:《Alchemy: A quantum chemistry dataset for benchmarking ai models》Alchemy 下载链接:https://alchemy.tencent.com/

2.3 社交网络

1. Reddit


Reddit 数据集是由来自 Reddit 论坛的帖子组成,如果两个帖子被同一人评论,那么在构图的时候,就认为这两个帖子是相关联的,标签是每个帖子对应的社区分类。


Reddit 论文:《Inductive representation learning on large graphs》


Reddit 下载链接:


https://aistudio.baidu.com/aistudio/datasetdetail/177810


https://github.com/linanqiu/reddit-dataset


BlogCatalogBlogCatalog 数据集是一个社会关系网络,图是由博主及其社会关系(比如好友)组成,标签是博主的兴趣爱好。


2.BlogCatalog 论文:


《Relational learning via latent social dimensions》BlogCatalog 下载链接:http://socialcomputing.asu.edu

2.4 知识图谱

1.FB13/FB15K/FB15K237


这三个数据集是 Freebase 的子集。其中:


FB13:包含 13 种关系、75043 个实体。FB15K:包含 1345 种关系、14951 个实体 FB15K237:包含 237 种关系、14951 个实体


如果希望找到 entity id 对应的实体数据,可以通过以下渠道(并不是所有的实体都能找到):


https://developers.google.com/freebase/#freebase-wikidata-mappingshttp://sameas.org/


2.WN11/WN18/WN18RR


这三个是 WordNet 的子集:


WN11:包含 11 种关系、38696 个实体 WN18:包含 18 种关系、40943 个实体 WN18RR:包含 11 种关系、40943 个实体


为了避免在评估模型时出现 inverse relation test leakage,建议使用 FB15K237/WN18RR 来替代 FB15K/WN18。更多建议阅读《Convolutional 2D Knowledge Graph Embeddings》


FB15K/WN8 论文:《Translating Embeddings for Modeling Multi-relational Data》FB13/WN11 论文:《Reasoning With Neural Tensor Networks for Knowledge Base Completion》WN18RR 论文:《Convolutional 2D Knowledge Graph Embeddings》


以上 6 个知识图谱数据集均可从这里下载:https://github.com/thunlp/OpenKE/tree/master/benchmarks

2.5 开源数据仓库

1. Network Repository


具有交互式可视化和挖掘工具的图数据仓库。具有以下特点:


  • 用表格的形式展示每一个图数据集的节点数、遍数、平均度数、最大度数等。

  • 可视化对比图数据集之间的参数。

  • 在线 GraphVis,可视化图结构和详细参数。



2. Graph Kernel Datasets


图核的基准数据集。提供了一个表格,可以快速得到每个数据集的节点数量、类别数量、是否有节点/边标签、节点/边特征。


https://ls11-www.cs.tu-dortmund.de/staff/morris/graphkerneldatasets


https://chrsmrrs.github.io/datasets/



3. Relational Dataset Repository


关系机器学习的数据集集合。能够以数据集大小、领域、数据类型等条件来检索数据集。


https://relational.fit.cvut.cz


https://relational.fit.cvut.cz/search?domain%5B%5D=Industry



4. Stanford Large Network Dataset Collection


SNAP 库用于大型社交、信息网络。包括:图分类数据库、社交网络、引用网络、亚马逊网络等等,非常丰富。


https://snap.stanford.edu/data/



5.Open Graph Benchmark


OGB 是真实基准数据集的集合,同时提供数据加载器和评估器(PyTorch)。可以自动下载、处理和切割;完全兼容 PyG 和 DGL。


https://ogb.stanford.edu/



这个大家就比较熟悉了,基本最先进的图算法都是依赖 OGB 的数据集验证的。


௸持续更新敬请期待~ೄ೨✿

3.图学习相关技术归纳

3.1 GraphSAGE 为例技术归纳

  • GCN 和 GraphSAGE 区别


GCN 灵活性差、为新节点产生 embedding 要求 额外的操作 ,比如“对齐”:


GCN 是 直推式(transductive) 学习,无法直接泛化到新加入(未见过)的节点;GraphSAGE 是 归纳式(inductive) 学习,可以为新节点输出节点特征。


GCN 输出固定:


GCN 输出的是节点 唯一确定 的 embedding;GraphSAGE 学习的是节点和邻接节点之间的关系,学习到的是一种映射关系 ,节点的 embedding 可以随着其邻接节点的变化而变化。


GCN 很难应用在超大图上:


无论是拉普拉斯计算还是图卷积过程,因为 GCN 其需要对 整张图 进行计算,所以计算量会随着节点数的增加而递增。GraphSAGE 通过采样,能够形成 minibatch 来进行批训练,能用在超大图上。


2.GraphSAGE 等模型优点:


  • 采用 归纳学习 的方式,学习邻居节点特征关系,得到泛化性更强的 embedding;

  • 采样技术,降低空间复杂度,便于构建 minibatch 用于 批训练 ,还让模型具有更好的泛化性;

  • 多样的聚合函数 ,对于不同的数据集/场景可以选用不同的聚合方式,使得模型更加灵活。


GraphSAGE 的基本思路是:利用一个 聚合函数 ,通过 采样 和学习聚合节点的局部邻居特征,来为节点产生 embedding。


  • 3.跳数(hops)、搜索深度(search depth)、阶数(order)有啥区别?


我们经常听到一阶邻居、二阶邻居,1-hops、2-hops等等,其实他们都是一个概念,就是该节点和目标节点的路径长度,如果路径长度是1,那就是一阶邻接节点、1-hops node。
搜索深度其实和深度搜索的深度的概念相似,也是用路径长度来衡量。
简单来说,这几个概念某种程度上是等价。
在GraphSAGE中,还有聚合层数\迭代次数,比如说只考虑了一阶邻接节点,那就只有一层聚合(迭代了一次),以此类推。
复制代码


  • 4.采样有什么好处


于对计算效率的考虑,对每个节点采样一定数量的邻接节点作为待聚合信息的节点。


从训练效率考虑:通过采样,可以得到一个 固定大小 的领域集,可以拼成一个 batch,送到 GPU 中进行批训练。


从复杂度角度考虑:如果没有采样,单个 batch 的内存使用和预期运行时间是 不可预测 的;最坏的情况是,即所有的节点都是目标节点的邻接节点。而 GraphSAGE 的每个 batch 的空间和时间复杂度都是 固定 的其中 K 是指层数,也就是要考虑多少阶的邻接节点,是在第 i 层采样的数量。


  • 5.采样数大于邻接节点数怎么办?


设采样数量为 K:若节点邻居数少于 K,则采用 有放回 的抽样方法,直到采样出 K 个节点。若节点邻居数大于 K,则采用 无放回 的抽样。


关于邻居的个数,文中提到,即两次扩展的邻居数之积小于 500,大约每次只需要扩展 20 来个邻居时获得较高的性能。


实验中也有关于邻居采样数量的对比,如下图,随着邻居抽样数量的递增,边际效益递减,而且计算时间也会增大。



  • 6.每一跳采样需要一样吗?


不需要,可以分别设置每一跳的采样数量,来进一步缓解因 阶数越高涉及到的节点越多 的问题。


原文中,一阶采样数是 25,二阶采样数是 10。这时候二阶的节点总数是 250 个节点,计算量大大增加。


  • 7.聚合函数的选取有什么要求?


由于在图中节点的邻居是 天然无序 的,所以我们希望构造出的聚合函数是 对称 的(即改变输入的顺序,函数的输出结果不变),同时具有 较强的表达能力 (比如可以参数学习)。


  • 8.GraphSAGE 论文中提供多少种聚合函数?


原文中提供三种聚合函数:


  • 均值聚合

  • pooling 聚合(max-pooling/mean-pooling)

  • LSTM 聚合


均值聚合的操作:


把目标节点和邻居节点的特征 纵向拼接 起来 ;对拼接起来的向量进行 纵向均值化 操作 将得到的结果做一次 非线性变换 产生目标节点的向量表征。


pooling 聚合的操作:先对邻接节点的特征向量进行一次非线性变换;之后进行一次 pooling 操作(max-pooling or mean-pooling) ;将得到结果与第 k-1 层的目标节点的表示向量拼接 ;最后再经过一次非线性变换得到目标节点的第 k 层表示向量。


使用 LSTM 聚合时需要注意什么?


复杂结构的 LSTM 相比简单的均值操作具有更强的表达能力,然而由于 LSTM 函数 不是关于输入对称 的,所以在使用时需要对节点的邻居进行 乱序操作 。


  • 9.均值聚合和其他聚合函数有啥区别?


除了聚合方式,最大的区别在于均值聚合 没有拼接操作 (算法 1 的第五行),也就是均值聚合不需要把 当前节点上一层的表征 拼接到 已聚合的邻居表征上。


这一拼接操作可以简单看成不同“搜索深度”之间的“ skip connection ”(残差结构),并且能够提供显著的性能提升。


  • 10 这三种聚合方法,哪种比较好?


如果按照其学习参数数量来看,LSTM > Pooling > 均值聚合。


而在实验中也发现,在 Reddit 数据集中,LSTM 和 max-pooling 的效果确实比均值聚合要好一些。


  • 11.一般聚合多少层?层数越多越好吗?


和 GCN 一样,一般只需要 1~2 层 就能获得比较好的结果;如果聚合 3 层及以上,其时间复杂度也会随着层数的增加而大幅提升,而且效果并没有什么变化。


在 GraphSAGE,两层比一层有 10-15%的提升;但将层数设置超过 2,边际效果上只有 0-5%的提升,但是计算时间却变大了 10-100 倍。


  • 12.什么时候和 GCN 的聚合形式“等价”?


聚合函数为 均值聚合 时,其聚合形式与 GCN“近似等价”,也就是论文中提到的 GraphSAGE-GCN。


  • 13.GraphSAGE 怎样进行无监督学习?


基本思想是:希望 邻近 的节点具有相似的向量表征,同时让 远处 的节点的表示尽可能区分。


通过负采样的方法,把邻近节点作为正样本,把远处节点作为负样本,使用类似 word2vec 的方法进行无监督训练。


GraphSAGE 远近节点定义:从 节点 u 出发,能够通过 随机游走 到达的节点,则是邻近节点 v;其他则是远处节点 。


  • 13.GraphSAGE 是怎么随机游走的?


在原文中,为每个节点进行 50 次步长为 5 的随机游走,随机游走的实现方式是直接使用 DeepWalk 的 Python 代码。


至于具体的实现,可以针对数据集来设计你的随机游走算法,比如考虑了权重的有偏游走。


GraphSAGE 在采样的时候和(带权)随机游走进行负采样的时候,考虑边的权重了。


  • 14.如果只有图、没有节点特征,能否使用 GraphSAGE?


原文里有一段描述:our approach can also make use of structural features that are present in all graphs (e.g., node degrees). Thus, our algorithm can also be applied to graphs without node features.


所以就节点没有特征,但也可以根据其结构信息为其构建特征,比如说节点的度数等等


  • 15.训练好的 GraphSAGE 如何得到节点 Embedding?


假设 GraphSAGE 已经训练好,我们可以通过以下步骤来获得节点 embedding


训练过程则只需要将其产生的 embedding 扔进损失函数计算并反向梯度传播即可。


  • 对图中每个节点的邻接节点进行 采样 ,输入节点及其 n 阶邻接节点的特征向量

  • 根据 K 层的 聚合函数 聚合邻接节点的信息

  • 就产生了各节点的 embedding

  • 16.minibatch 的子图是怎么得到的?


其实这部分看一下源码就容易理解了。下图的伪代码,就是在其前向传播之前,多了个 minibatch 的操作。


  • 先对所有需要计算的节点进行采样(算法 2 中的 2~7 行)。用一个字典来保存节点及其对应的邻接节点。

  • 然后训练时随机挑选 n 个节点作为一个 batch,然后通过字典找到对应的一阶节点,进而找到二阶甚至更高阶的节点。这样一阶节点就形成一个 batch,K=2 时就有三个 batch。

  • 抽样时的顺序是:k-->k-1--->k-2;训练时,使用迭代的方式来聚合,其顺序是:k-2-->k-1--->k。简单来说,从上到下采样,形成每一层的 batch;每一次迭代都从下到上,计算 k-1 层 batch 来获得 k 层的节点 embedding,如此类推。

  • 每一个 minibatch 只考虑 batch 里的节点的计算,不在的不考虑,所以这也是节省计算方法。

  • 在算法 2 的第 3 行中,k-1<----k,也就是说采样邻居节点时,也考虑了自身节点的信息。相当于 GCN 中邻接矩阵增加单位矩阵。



增加了新的节点来训练,需要为所有“旧”节点重新输出 embeding 吗?


需要。因为 GraphSAGE 学习到的是节点间的关系,而增加了新节点的训练,这会使得关系参数发生变化,所以旧节点也需要重新输出 embedding。


GraphSAGE 有监督学习有什么不一样的地方吗?


没有。监督学习形式根据任务的不同,直接设置目标函数即可,如最常用的节点分类任务使用交叉熵损失函数。


  • 17.那和 DeepWalk、Node2vec 这些有什么不一样?


DeepWalk、Node2Vec 这些 embedding 算法直接训练每个节点的 embedding,本质上依然是直推式学习,而且需要大量的额外训练才能使他们能预测新的节点。同时,对于 embedding 的正交变换(orthogonal transformations),这些方法的目标函数是不变的,这意味着生成的向量空间在不同的图之间不是天然泛化的,在再次训练(re-training)时会产生漂移(drift)。


与 DeepWalk 不同的是,GraphSAGE 是通过聚合节点的邻接节点特征产生 embedding 的,而不是简单的进行一个 embedding lookup 操作得到。

3.2 PinSAGE 为例技术归纳

  • 1.PinSAGE 论文中的数据集有多大?


论文中涉及到的数据为 20 亿图片(pins),10 亿画板(boards),180 亿边(pins 与 boards 连接关系)。


用于训练、评估的完整数据集大概有 18TB,而完整的输出 embedding 有 4TB。


  • 2.PinSAGE 使用的是什么图?


在论文中,pins 集合(用 I 表示)和 boards 集合(用 C 表示)构成了 二分图 ,即 pins 仅与 boards 相连接,pins 或 boards 内部无连接。


同时,这二分图可以更加通用:


I 可以表示为 样本集 (a set of items),C 可以表示为 用户定义的上下文或集合 (a set of user-defined contexts or collections)。


  • 3.PinSAGE 的任务是什么?


利用 pin-board 二分图的结构与节点特征 ,为 pin 生成高质量的 embedding 用于下游任务,比如 pins 推荐。


  • 4.和 GraphSAGE 相比,PinSAGE 改进了什么?

  • 采样 :使用重要性采样替代 GraphSAGE 的均匀采样;

  • 聚合函数 :聚合函数考虑了边的权重;

  • 生产者-消费者模式的 minibatch 构建 :在 CPU 端采样节点和构建特征,构建计算图;在 GPU 端在这些子图上进行卷积运算;从而可以低延迟地随机游走构建子图,而不需要把整个图存在显存中。

  • 高效的 MapReduce 推理 :可以分布式地为百万以上的节点生成 embedding,最大化地减少重复计算。

  • 这里的计算图,指的是用于卷积运算的局部图(或者叫子图),通过采样来形成;与 TensorFlow 等框架的计算图不是一个概念。

  • 4.PinSAGE 使用多大的计算资源?


训练时,PinSAGE 使用 32 核 CPU、16 张 Tesla K80 显卡、500GB 内存;


推理时,MapReduce 运行在 378 个 d2.8xlarge Amazon AWS 节点的 Hadoop2 集群。


落地业务真的可怕:


  • PinSAGE 和 node2vec、DeepWalk 这些有啥区别?


node2vec,DeepWalk 是无监督训练;PinSAGE 是有监督训练;


node2vec,DeepWalk 不能利用节点特征;PinSAGE 可以;


node2vec,DeepWalk 这些模型的参数和节点数呈线性关系,很难应用在超大型的图上;


  • 6.PinSAGE 的单层聚合过程是怎样的?


和 GraphSAGE 一样,PinSAGE 的核心就是一个 局部卷积算子 ,用来学习如何聚合邻居节点信息。PinSAGE 的聚合函数叫做 CONVOLVE。


主要分为 3 部分:


  • 聚合 (第 1 行):k-1 层邻居节点的表征经过一层 DNN,然后聚合(可以考虑边的权重),是聚合函数符号,聚合函数可以是 max/mean-pooling、加权求和、求平均;

  • 更新 (第 2 行): 拼接 第 k-1 层目标节点的 embedding,然后再经过另一层 DNN,形成目标节点新的 embedding;

  • 归一化 (第 3 行): 归一化 目标节点新的 embedding,使得训练更加稳定;而且归一化后,使用近似最近邻居搜索的效率更高。

  • 为什么要将邻居节点的聚合 embedding 和当前节点的拼接?


因为根据 T.N Kipf 的 GCN 论文,concat 的效果要比直接取平均更好。


  • 7.PinSAGE 是如何采样的?


如何采样这个问题从另一个角度来看就是:如何为目标节点构建邻居节点。和 GraphSAGE 的均匀采样不一样的是,PinSAGE 使用的是重要性采样。PinSAGE 对邻居节点的定义是:对目标节点 影响力最大 的 T 个节点。


PinSAGE 的邻居节点的重要性其影响力的计算方法有以下步骤:


  • 从目标节点开始随机游走;

  • 使用 正则 来计算节点的“访问次数”,得到重要性分数;

  • 目标节点的邻居节点,则是重要性分数最高的前 T 个节点。


这个重要性分数,其实可以近似看成 Personalized PageRank 分数。


  • 8.重要性采样的好处是什么?


和 GraphSAGE 一样,可以使得 邻居节点的数量固定 ,便于控制内存/显存的使用。在聚合邻居节点时,可以考虑节点的重要性;在 PinSAGE 实践中,使用的就是 加权平均 (weighted-mean),原文把它称作 importance pooling 。


  • 9.采样的大小是多少比较好?


从 PinSAGE 的实验可以看出,随着邻居节点的增加,而收益会递减;


并且两层 GCN 在 邻居数为 50 时能够更好的抓取节点的邻居信息,同时保持运算效率。



  • 10.PinSAGE 的 minibatch 和 GraphSAGE 区别:


基本一致,但细节上有所区别。比如说:GraphSAGE 聚合时就更新了 embedding;PinSAGE 则在聚合后需要再经过一层 DNN 才更新目标 embedding。


batch 应该选多大


毕竟要在大量的样本上进行训练(有上亿个节点),所以原文里使用的 batch 比较大,大小为 512~4096。


从下面表格可以看到, batch 的大小为 2048 时,能够在每次迭代时间、迭代次数和总训练时间上取得一个不错的综合性能。



更多的就不展开了

4.业务落地技巧

  • 负样本生成 首先是简单采样:在每个 minibatch 包含节点的范围之外随机采样 500 个 item 作为 minibatch 所有正样本共享的负样本集合。但考虑到实际场景中模型需要从 20 亿的物品 item 集合中识别出最相似的 1000 个,即要从 2 百万中识别出最相似的那一个,只是简单采样会导致模型分辨的粒度过粗,分辨率只到 500 分之一,因此增加一种“hard”负样本,即对于每个 对,和物品 q 有些相似但和物品 i 不相关的物品集合。这种样本的生成方式是将图中节点根据相对节点 q 的个性化 PageRank 分值排序,随机选取排序位置在 2000~5000 的物品作为“hard”负样本,以此提高模型分辨正负样本的难度。

  • 渐进式训练(Curriculum training):如果训练全程都使用 hard 负样本,会导致模型收敛速度减半,训练时长加倍,因此 PinSage 采用了一种 Curriculum 训练的方式,这里我理解是一种渐进式训练方法,即第一轮训练只使用简单负样本,帮助模型参数快速收敛到一个 loss 比较低的范围;后续训练中逐步加入 hard 负样本,让模型学会将很相似的物品与些微相似的区分开,方式是第 n 轮训练时给每个物品的负样本集合中增加 n-1 个 hard 负样本。

  • 样本的特征信息:Pinterest 的业务场景中每个 pin 通常有一张图片和一系列的文字标注(标题,描述等),因此原始图中每个节点的特征表示由图片 Embedding(4096 维),文字标注 Embedding(256 维),以及节点在图中的度的 log 值拼接而成。其中图片 Embedding 由 6 层全连接的 VGG-16 生成,文字标注 Embedding 由 Word2Vec 训练得到。

  • 基于 random walk 的重要性采样:用于邻居节点采样,这一技巧在上面的算法理解部分已经讲解过,此处不再赘述。

  • 基于重要性的池化操作:这一技巧用于上一节 Convolve 算法中的 函数中,聚合经过一层 dense 层之后的邻居节点 Embedding 时,基于 random walk 计算出的节点权重做聚合操作。据论文描述,这一技巧在离线评估指标中提升了 46%。

  • on-the-fly convolutions:快速卷积操作,这个技巧主要是相对原始 GCN 中的卷积操作:特征矩阵与全图拉普拉斯矩阵的幂相乘。涉及到全图的都是计算量超高,这里 GraphSage 和 PinSage 都是一致地使用采样邻居节点动态构建局部计算图的方法提升训练效率,只是二者采样的方式不同。

  • 生产者消费者模式构建 minibatch:这个点主要是为了提高模型训练时 GPU 的利用率。保存原始图结构的邻居表和数十亿节点的特征矩阵只能放在 CPU 内存中,GPU 执行 convolve 卷积操作时每次从 CPU 取数据是很耗时的。为了解决这个问题,PinSage 使用 re-index 技术创建当前 minibatch 内节点及其邻居组成的子图,同时从数十亿节点的特征矩阵中提取出该子图节点对应的特征矩阵,注意提取后的特征矩阵中的节点索引要与前面子图中的索引保持一致。这个子图的邻接列表和特征矩阵作为一个 minibatch 送入 GPU 训练,这样一来,convolve 操作过程中就没有 GPU 与 CPU 的通信需求了。训练过程中 CPU 使用 OpenMP 并设计了一个 producer-consumer 模式,CPU 负责提取特征,re-index,负采样等计算,GPU 只负责模型计算。这个技巧降低了一半的训练耗时。

  • 多 GPU 训练超大 batch:前向传播过程中,各个 GPU 等分 minibatch,共享一套参数,反向传播时,将每个 GPU 中的参数梯度都聚合到一起,执行同步 SGD。为了适应海量训练数据的需要,增大 batchsize 从 512 到 4096。为了在超大 batchsize 下快速收敛保证泛化精度,采用 warmup 过程:在第一个 epoch 中将学习率线性提升到最高,后面的 epoch 中再逐步指数下降。

  • 使用 MapReduce 高效推断:模型训练完成后生成图中各个节点的 Embedding 过程中,如果直接使用上述 PinSage 的 minibatch 算法生成 Embedding,会有大量的重复计算,如计算当前 target 节点的时候,其相当一部分邻居节点已经计算过 Embedding 了,而当这些邻居节点作为 target 节点的时候,当前 target 节点极有可能需要再重新计算一遍,这一部分的重复计算既耗时又浪费。

5.总结

本项目对 PGL 图学习系列项目进行整合方便大家后续学习,同时对图学习相关技术和业务落地侧进行归纳总结,以及对图网络开放数据集很多学者和机构发布了许多与图相关的任务。


༄ℳ后续将持续更新 PGL 以及前沿算法和应用,敬请期待! ꦿོ࿐


个人主页:https://aistudio.baidu.com/aistudio/usercenter 欢迎关注


发布于: 刚刚阅读数: 3
用户头像

汀丶

关注

本博客将不定期更新关于NLP等领域相关知识 2022-01-06 加入

本博客将不定期更新关于机器学习、强化学习、数据挖掘以及NLP等领域相关知识,以及分享自己学习到的知识技能,感谢大家关注!

评论

发布
暂无评论
PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十]_神经网络_汀丶_InfoQ写作社区