论文题目: PyTorch-BigGraph: A Large-scale Graph Embedding Framework
论文地址: https://arxiv.org/abs/1903.12287
论文发表于: SysML 2019
论文大体内容:
本文主要实现了大规模数据下的graph embedding,在效果微涨的情况下,训练性能有显著的提升,对于工业界大规模图网络的embedding学习,有实际的应用价值。
Motivation:
大规模图网络主要有2个挑战:①性能,计算量大;②存储,内存过大。而往往工业界图网络会特别巨大,所以训练起来没有特别有效的方法或工程实现。
Contribution:
本文作者实现了大规模图网络的embedding学习方法,通过多机并行,轻松训练万亿级别规模的边的网络。
1. 目前工业界用到的实体节点数量和边数量如下:
①Facebook 20亿用户节点和万亿级别的边;
②阿里有10亿用户节点和20亿的商品;
③Pinterest有20亿的实体和170亿的边;
2. PBG主要部分包括:
①邻接矩阵分为N个bucket,每次只取1个bucket的边来训练,训练出来的embedding存储到硬盘,或者分布式训练来减少内存消耗;
②PS架构用于全局参数和embedding;
③对节点进行均匀的负采样,每个batch重用负采样来降低内存消耗;
④支持多实体多关系的图;
3. 实验发现:
①内存消耗降低88%;
②8台机器分布式训练,速度提升4倍;
4. PGB的节点划分方式如下图,对于所有节点,shuffle后进行随机划分到bucket。节点划分后,每一条边被会放到一个partition,那么该partition必然变为横跨两个bucket,或者在同一个bucket以内。这样就可以对不重叠的partition并行化;
5. PBG最重要的一点在于其负采样的方法;
负采样一般有2种方法:
①根据数据分布采样,这样对于稀疏节点基本无效;
②均匀负采样,模型会学习出边的分数与两个点之间的连接边数量成正比;
PGB采用α的概率①,(1-α)概率②,默认α=0.5;
本文采用的是Batched Negative Sampling,即批负采样;
主要方法如下图:
①B是每个batch的边数量(正样本边);Bn是每个batch的负样本边数量(负采样生成);
②B个正样本边,则有2B个节点的embedding(B个src节点,B个dest节点),同时随机采样另外B个src节点,B个dest节点,进行交叉生成负样本;
Batched Negative Sampling的效果如下,增加负采样数量,训练速度下降也不会很快。
实验
6. Dataset
①user-user interaction graph from LiveJournal;
②user-user follow graph from Twitter;
③user-user interaction graph from YouTube;
④Freebase knowledge graph;
7. Baseline
①DeepWalk;
②MILE;
③TransE;
④ComplEx;
等等;
8. 实验结果
参考资料:
[1] https://github.com/facebookresearch/PyTorch-BigGraph
以上均为个人见解,因本人水平有限,如发现有所错漏,敬请指出,谢谢!