DGL用户指南--第二章 消息传递范式

消息传递范式

 先由边和两端的节点生成消息,再由聚合函数聚合受到的消息,节点+受到的消息更新自己

2.1 内置函数和消息传递API

消息函数 接受一个参数 edges,这是一个 EdgeBatch 的实例, 在消息传递时,它被DGL在内部生成以表示一批边。 edges 有 src、 dst 和 data 共3个成员属性, 分别用于访问源节点、目标节点和边的特征

聚合函数 接受一个参数 nodes,这是一个 NodeBatch 的实例, 在消息传递时,它被DGL在内部生成以表示一批节点。 nodes 的成员属性 mailbox 可以用来访问节点收到的消息。 一些最常见的聚合操作包括 summaxmin 等。

聚合函数 接受一个参数 nodes,这是一个 NodeBatch 的实例, 在消息传递时,它被DGL在内部生成以表示一批节点。 nodes 的成员属性 mailbox 可以用来访问节点收到的消息。 一些最常见的聚合操作包括 summaxmin 等。

内置消息函数可以是一元函数或二元函数。对于一元函数,DGL支持 copy 函数。对于二元函数, DGL现在支持 add、 sub、 mul、 div、 dot 函数。消息的内置函数的命名约定是 u 表示  节点, v 表示 目标 节点,e 表示 

内置函数链接:dgl.function — DGL 1.1 documentation

用户自定义函数的高阶用法:dgl.function — DGL 1.1 documentation

 在DGL中,也可以在不涉及消息传递的情况下,通过 apply_edges() 单独调用逐边计算。 apply_edges() 的参数是一个消息函数。并且在默认情况下,这个接口将更新所有的边

2.2 编写高效的消息传递代码

考虑到某些图边的数量远远大于节点的数量,DGL建议避免不必要的从点到边的内存拷贝。

(10个点,至多可以用9X10X2=180条边)

尽量减少边的特征维度,尽量使用内置函数进行运算

2.3 在图的一部分上进行消息传递

小批量训练的常见方法:将想要更新的节点,创建为一个子图,在子图上 update_all()

2.5 在异构图上进行消息传递

 异构图包含不同类型的节点和边的图。 不同类型的节点和边常常具有不同类型的属性。这些属性旨在刻画每一种节点和边的特征。需要使用不同维度的表示来对不同类型的节点和边进行建模。

异构图上的消息传递可以分为两个部分:

  1. 对每个关系计算和聚合消息。

  2. 对每个结点聚合来自不同关系的消息。

 

posted @ 2023-05-08 11:02  化繁为简,弃快从慢  阅读(163)  评论(0)    收藏  举报