|训练超大规模图模型,PyTorchBigGraph如何做到?( 二 )


|训练超大规模图模型,PyTorchBigGraph如何做到?
本文插图
在上图中 , 机器 2 中的 Trainer 模块向机器 1 上的锁服务器请求了一个 bucket , 这会锁定该 bucket 的分区 。 然后该 trainer 会保存它不再使用的所有分区并从共享分区服务器载入它需要的新分区 , 此时它可以将自己的旧分区释放回锁服务器 。 然后边会从一个共享文件系统载入 , 并在没有线程内同步的情况下在多个线程上进行训练 。 在一个单独的线程中 , 仅有少量共享参数会与一个共享参数服务器持续同步 。 模型检查点偶尔会从 trainer 写入到共享文件系统中 。 这个模型允许使用至多 P/2 台机器时 , 让一组 P 个 bucket 并行化 。
PBG 一项不那么直接的创新是使用了分批负采样技术 。 传统的图嵌入模型会沿真正例边将随机的「错误」边构建成负训练样本 。 这能显著提升训练速度 , 因为仅有一小部分权重必须使用每个新样本进行更新 。 但是 , 负例样本最终会为图的处理引入性能开销 , 并最终会通过随机的源或目标节点「损害」真正的边 。 PBG 引入了一种方法 , 即复用单批 N 个随机节点以得到 N 个训练边的受损负例样本 。 相比于其它嵌入方法 , 这项技术让我们能以很低的计算成本在每条边对应的许多负例上进行训练 。
要增加在大型图上的内存效率和计算资源 , PBG 利用了单批 Bn 个采样的源或目标节点来构建多个负例 。 在典型的设置中 , PBG 会从训练集取一批 B=1000 个正例 , 然后将其分为 50 条边一个的块 。 来自每个块的目标(与源等效)嵌入会与从尾部实体类型均匀采样的 50 个嵌入相连 。 50 个正例与 200 个采样节点的外积等于 9900 个负例 。
|训练超大规模图模型,PyTorchBigGraph如何做到?
本文插图
分批负采样方法可直接影响模型的训练速度 。 如果没有分批 , 训练的速度就与负例的数量成反比 。 分批训练可改善方程 , 得到稳定的训练速度 。
|训练超大规模图模型,PyTorchBigGraph如何做到?
本文插图
Facebook 使用 LiveJournal、Twitter 数据和 YouTube 用户互动数据等不同的数据集评估了 PBG 。 此外 , PBG 还使用 Freebase 知识图谱进行了基准测试 , 该知识图谱包含超过 1.2 亿个节点和 27 亿条边 。 另外还使用 Freebase 的一个小子集 FB15k 进行了测试 , FB15k 包含 15000 个节点和 600000 条边 , 常被用作多关系嵌入方法的基准 。 FB15k 实验表明 PBG 的表现与当前最佳的图嵌入模型相近 。 但是 , 当在完整的 Freebase 数据集上评估时 , PBG 的内存消耗得到了 88% 的改善 。
|训练超大规模图模型,PyTorchBigGraph如何做到?
本文插图
【|训练超大规模图模型,PyTorchBigGraph如何做到?】
PBG 是首个可扩展的、能训练和处理包含数十亿节点和数万亿边的图数据的方法 。 PBG 的首个实现已经开源 , 未来应该还会有更有意思的贡献 。
原文链接:https://medium.com/dataseries/facebooks-pygraph-is-an-open-source-framework-for-capturing-knowledge-in-large-graphs-b52c0fb902e8