首先是看一下dgl的官网:https://docs.dgl.ai/index.html

里面的第二章https://docs.dgl.ai/guide/message.html#guide-message-passing,介绍了DGL数据结构的消息传递机制,这一机制便于我们去设计图神经网络,以及模型参数的传播。

里面的三个核心的方法分别是message function、reduce function和update function,

直接看官网给出来的式子不难理解,论文中的消息传递指的就是如何更新节点和边的表示,也就是节点周围的信息如何融入到当前节点本身。dgl的逻辑是先通过message function更新边信息,这里的message function在使用的时候可以进行手工设计——user-defined function(UDF-udf),里面可以使用神经网络去替换,那么这个时候每一条边所连接点两个顶点(出点和入点)的信息就全部融入到该边的新的表示中了,这个时候如果节点想要获取邻居信息,那么就可以通过边信息进行获取,从而将边信息和邻居信息传递到当前的节点中(传递的时候边选取的是更新的节点入边,也就是“入点-dst-目标”节点是该节点的边,当然如果是无向图则随意),这就是dgl的消息传递的设计思路。里面的t符号或许会让一些读者产生误解,比如我,下意识的以为和时间有关系,其实不然,这里的t其实指的就是消息传递的次数,执行一次消息传递t=1,t+1=2的意思是当前的边经过了一次消息传递,传递的信息是第一步更新时的节点和边的信息,传递后的信息记为t=2,意思是如果接下来要进行第二次消息传递,该信息将作为第二次消息传递的基础信息,这里是为了连续消息传递的理解而设计成这样子的,如果放到神经网络中就可以看做是图上的节点和边经过了一层神经网络更新了节点和边信息。

1、edge-wise步骤等效于message function,node-wise等效于reduce function,对整个图进行节点和边信息的更新等效于update function

2、在进行每一步的消息传递的时候,dgl为了更快的进行计算使用的是定义好的dgl.udf.EdgeBatch结构和dgl.udf.NodeBatch结构,其中EdgeBatch的目的是同时对边的信息进行计算,达到并行的效果,注意如果当前的图结构是异构图,那么batch操作的意义就显示出来了,dgl会保存不同类型的边的消息传递后的信息;其次是NodeBatch,与EdgeBatch类似如果是异构图会保存不同类型的节点的信息(有待求证,但是不影响理解),使用update function的时候是按照节点类型操作的,除此之外,在针对每种类型的节点进行聚合(消息传递)邻居信息的时候,会对这些节点根据入度的不同进行区分,入度相同的会在同一个batch下进行计算,目的应该也是为了并行的要求,提升计算速度(Degree Bucketing for Message Passing with User Defined Functions,是一种机制)。

3、在设计message function和reduce function的时候一定要注意reduce function中nodebatch要获取它对应的邻边的信息,是通过mailbox得到的,mailbox相当于是获取当前nodebatch中的各个节点的入边的消息,注意mailbox['特征a'],这一特征a必须要和message function返回的值中的边的特征一致,此外message function的返回值的特征又要和已存在的边的特征一致,只有这样才能不断地进行消息传递更新节点和边的信息。

4、下面给一个例子来说明:(homogeneous graoh例子)

import dgl
import torch
import dgl.function as fn
g = dgl.graph(([1, 3, 5, 0, 4, 2, 3, 3, 4, 5], [1, 1, 0, 0, 1, 2, 2, 0, 3, 3]))
g.edata['eid'] = torch.arange(10)
g.ndata['node']=torch.ones(6,1)#有6个节点
#方法一:
def reducer(nodes):print(nodes.mailbox['eid'])#消息传递使用的是边的eid特征,因为message function是针对#eid特征进行传递的,当然也可以设计到多个特征的一个传递,然后将其村放入一个新的特征#但是mailbox['']中使用的特征只能有一个return {'n': nodes.data['node']+nodes.mailbox['eid'].sum(1)}def message_func(edges):src,dst,_=edges.edges()print(src,dst)#因为这里没有定义异构图,因此所有的边都在同一个edgebatch中return{'eid':torch.stack([src,dst],dim=1).float()}#return的目的是对边的特征eid进行消息传递后的更新#这里return也可以不使用eid,比如#方法二:
def message_func(edges):src,dst,_=edges.edges()print(src,dst)#因为这里没有定义异构图,因此所有的边都在同一个edgebatch中return{'h':torch.stack([src,dst],dim=1).float()}#return的目的是对边的特征eid进行消息传递后的更新#这里return也可以不使用eid,但是同步reduce function也要更改def reducer(nodes):print(nodes.mailbox['h'])#消息传递使用的是边的eid特征,因为message function是针对#eid特征进行传递的,当然也可以设计到多个特征的一个传递,然后将其村放入一个新的特征#但是mailbox['']中使用的特征只能有一个return {'n': nodes.data['node']+nodes.mailbox['h'].sum(1)}g.update_all(message_func, reducer)
print(g.ndata['n'])

很显然,message function返回的更新的内容的名称要和reduce function中mailbox[' ']去选取的特征保持一致,否则无法进行消息的扩散。注意,message function中返回的属性不论是eid,还是h,它们都不会改变原始的图结构中边的eid特征的内容,eid只是为了便于理解代码,message function的本质是对边两端及其自身的信息进行消息传递,也可以理解为聚合,聚合的信息/内容将作为节点更新(reduce functin)的依据。也就是最后update function执行后节点会有一个新的特征'n',而message function中出现的返回的特征‘h’或‘eid’将不会出现在边的特征中,这就是区别,这就很好的阐明了dgl图结构的整体的消息传递过程。下面是补充,对异构图的处理:

import dgl
import torch
import dgl.function as fn
g = dgl.graph(([1, 3, 5, 0, 4, 2, 3, 3, 4, 5], [1, 1, 0, 0, 1, 2, 2, 0, 3, 3]))
g.edata['eid'] = torch.arange(10)
def reducer(nodes):print(nodes.mailbox['eid'])return {'n': nodes.mailbox['eid'].sum(1)}
g.update_all(fn.copy_e('eid', 'eid'), reducer)
#fn.copy_e()是dgl中已经设计好的message function,如果dgl中已有的message function能用,就不建议自己去设计udf(user-defined function)
#tensor([[5, 6],
#        [8, 9]])
#tensor([[3, 7, 2],
#        [0, 1, 4]])

Deep Graph Library消息传递机制-Message Passing详解相关推荐

  1. pythonmessage用法_django 消息框架 message使用详解

    前言 在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证 ...

  2. WCF技术剖析之十七:消息(Message)详解(下篇)

    <WCF技术剖析(卷1)>自出版近20天以来,得到了园子里的朋友和广大WCF爱好者的一致好评,并被卓越网计算机书店作为首页推荐,在这里对大家的支持表示感谢.同时我将一直坚持这个博文系列,与 ...

  3. 第二章 Message组成详解

     Message组成详解 1.1JMS message组成说明 JMS message包含两部分,头和承载体. 头中提供被客户端和provider使用的元数据, 承载体包含着实际的数据. 客户端sen ...

  4. Android-Binder进程间通讯机制-多图详解

    本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据?​​​​​​​ 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...

  5. jdbc mysql 自动重连_JDBC实现Mysql自动重连机制的方法详解

    JDBC是Java程序连接和访问各种数据库的API,它可以提供Java程序和各种数据库之间的连接服务,下面是爱站技术频道小编为大家带来的JDBC实现Mysql自动重连机制的方法详解. 日志:using ...

  6. 四叶草剧场服务器维修价格,四叶草剧场不合理报酬机制是什么-不合理报酬机制和收益详解-Appfound...

    四叶草剧场不合理报酬机制是什么?不合理报酬的增益效果怎么样?在四叶草剧场手游中,有一种剧照效果是不合理的报酬,会使敌方角色被施加减益效果时还会失去5%最大生命,下面就为大家详细介绍不合理报酬的机制和收 ...

  7. 图卷积和消息传递理论的可视化详解

    来源:Deephub Imba 本文共3500字,建议阅读5分钟本文中将研究如何基于消息传递机制构建图卷积神经网络,并创建一个模型来对具有嵌入可视化的分子进行分类. 假设现在需要设计治疗某些疾病的药物 ...

  8. android Handler机制之ThreadLocal详解

    概述 我们在谈Handler机制的时候,其实也就是谈Handler.Message.Looper.MessageQueue之间的关系,对于其工作原理我们不做详解(Handler机制详解). Messa ...

  9. PHP观察者通知机制,观察者模式-通知详解

    观察者模式也叫发布/订阅模式,是软件设计模式中的一种.在这种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通 ...

  10. Hadoop框架:HDFS读写机制与API详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.读写机制 1.数据写入 客户端访问NameNode请求上传文件: NameNode检查目标文件和目录是否已经存在: NameNode响应客 ...

最新文章

  1. python简单代码 春节集五福-新年福利来一波之Python轻松集齐五福(demo)
  2. .QT-制作最强电压电阻表盘,可以自定义阴影效果,渐变颜色,图标,文字标签等-附带demo程序
  3. http --- 共享加密(对称加密)的几个概念
  4. 动态规划训练23 [Making the Grade POJ - 3666 ]
  5. q7goodies事例_Java 8 Friday Goodies:Lambda和SQL
  6. git 拉取远端仓库_git命令-远程仓库拉取、本地仓库更新、工作空间提交等等
  7. html5元件的作用,寄存器的作用是什么
  8. innodb事务锁的一些常见数据结构
  9. PHPMailer 报错:SMTP ERROR: Password command failed: 535 Login Fail
  10. 华为的哪个字体像苹果的_华为手机手写怎么变字体 苹果手写字体怎么变粗
  11. Access数据库实用教程-----创建更新查询
  12. qq三国2015最新服务器,合服服务器查询
  13. Linux设置串口波特率等参数
  14. Android Studio Design界面不显示控件的解决方法
  15. 路虎:独到所处,揽胜极致.
  16. #483(div.2) B. Minesweeper
  17. 海图水深点的标注方法
  18. 没有计算的推理和基于推理的计算 逻辑与算法之五
  19. 数学归纳法及例题分析
  20. 罗切斯特大学计算机科学硕士介绍,罗切斯特大学计算机科学专业

热门文章

  1. IDEA2018全局搜索中搜索jar包/lib
  2. ASP.NET WebApi 图片上传
  3. Codeforces Round #439 (Div. 2)题解
  4. css3mediaquery移动端网页字体适应屏幕代码
  5. Java nextInt()函数
  6. 1.2顺序线性表的归并
  7. 网页制作,改变你的思维方式
  8. 21.Shiro在springboot与vue前后端分离项目里的session管理
  9. Spring - DI循环依赖
  10. Java基础Lambda表达式【四】