【PyG入门学习】三:信息传递机制

article/2025/7/6 15:56:04

1.理论基础

将普通的卷积过程推广到非规则数据领域一般是通过邻域聚合或者信息传递机制。 x i ( k − 1 ) ∈ R F x^{(k-1)}_i∈R^F xi(k1)RF表示在第k-1层节点i的节点特征, e j , i ∈ R D e_{j,i}∈R^D ej,iRD表示从节点j到节点i的边的特征(可选参数),那么图神经网络中的信息传递机制就可以表示为:
在这里插入图片描述
其中□ 表示一种可微的、置换不变的函数(也就是后面的聚合模式),比如求和、取均值或者最大值, γ \gamma γ ϕ \phi ϕ均为可微的函数,比如MLP多层感知机。上述公式相当于就是把一个节点的邻域节点的特征聚合到当前节点上面,最外层的 γ \gamma γ函数就类似于我们常见的非线性激活函数,聚合的信息分为两部分,第一部分是上一层中该节点自身的特征信息,第二部分是上一层中,该节点和邻域节点边上的传递信息。

2.“信息传递”基类

Pytorch-Geometric中提供了一个基类torch_geometric.nn.MessagePassing,它自身已经实现了信息传递机制来更有效的创建信息传递机制的图神经网络,只要将其作为一个基类继承创建自己的类即可。使用的时候只需要定义函数 ϕ \phi ϕ
比如message(),和函数 γ \gamma γ比如update();同时需要指定聚合方式比如aggr='add'aggr='mean'或者aggr='max'。在这个基类中比较重要的几个地方如下:
(1)torch_geometric.nn.MessagePassing(aggr="add", flow="source_to_target")
定义三种聚合模式中的一种以及信息传递的方向,默认是从源节点到目标节点,比如一个有向边1->2,源节点是1,目标节点是2。
(2)torch_geometric.nn.MessagePassing.propagate(edge_index, size=None, dim=0, **kwargs)
调用该函数会进行信息的传播计算过程,参数为边的数据以及其他在构建信息传递过程和更新节点嵌入向量的数据参数(这里的额外的数据参数并不会在这该函数用到,而是传递到之后的函数中)。值得注意的是该方法不仅限于shape=[N, N]的邻接矩阵,也可以用于一些稀疏化的矩阵,对于稀疏化矩阵如果创建完整的邻接矩阵对于空间浪费比较大,所以只会存储其中非0元素(存储该元素的行坐标和列坐标),比如二分图;对于矩阵格式shape=[N, M]需要传递参数size=(N, M),如果该参数为None,就会默认为是规则的邻接矩阵。对于二分图而言,含有两个独立的节点索引,所以传递参数的方式可以类似于x=(x_N, x_M)的形式。
(3)torch_geometric.nn.MessagePassing.message()
对到达节点i的信息进行构建,相当于函数 ϕ \phi ϕ,也就是计算出所有邻居节点的应该传递过来的信息量为多少;根据信息传递方向的不同(详见(1)中的参数flow),节点对的选取方式也不同。值得注意的是,该函数所需的参数是来自于最初传递给propagate()函数的参数中的任何参数,换句话说,你要想在message中使用图的某些属性参数,必须在propagate()中先传递。另外,传递给propagate()tensor会通过增加_i_j的方式来创建新的变量名,该变量作为tensor分别映射到节点i和节点j的值。
(4)torch_geometric.nn.MessagePassing.update()
将聚合函数后的结果作为输入计算出更新值。接受聚合过程的输出结果作为第一个参数,和其他任意之前传递给propagate()的参数。

3.GCN层的实现

从数学角度看,GCN层即:
在这里插入图片描述
邻居节点的特征首先通过一个权重矩阵的转换,然后通过它们的度进行标准化,最后进行求和。具体步骤如下:
1.在邻接矩阵中增加自环
2.对节点特征进行一次线性转化(利用linear层实现)
3.计算标准化系数
4.对节点特征进行标准化(函数 ϕ \phi ϕ
5.对相邻节点特征进行求和("add"聚合方式)
6.得到新的节点嵌入

import torch
from torch_geometric.nn import MessagePassing
from torch_geometric.utils import add_self_loops, degree
from torch_geometric.datasets import TUDatasetclass GCNConv(MessagePassing):def __init__(self, in_channels, out_channels):super(GCNConv, self).__init__(aggr='add')self.lin = torch.nn.Linear(in_channels, out_channels)def forward(self, x, edge_index):# X: [N, in_channels]# edge_index: [2, E]# 1.在邻接矩阵中增加自环edge_index, _ = add_self_loops(edge_index, num_nodes=x.size(0))# 2.对节点特征进行一个非线性转换# x的维度会由[N, in_channels]转换为[N, out_channels]x = self.lin(x)# 3.计算标准化系数# edge_index的第一个向量作为行坐标,第二个向量作为列坐标row, col = edge_indexdeg = degree(row, x.size(0), dtype=x.dtype)deg_inv_sqrt = deg.pow(-1/2)# norm的第一个元素就是edge_index中的第一列(第一条边)上的标准化系数# tensor的乘法为对应元素乘法,tensor1[tensor2]后的维度与tensor2一致norm = deg_inv_sqrt[row] * deg_inv_sqrt[col]# 4-6步的开始标志,内部实现了message-AGGREGATE-updatereturn self.propagate(edge_index, size=(x.size(0), x.size(1)), x=x, norm=norm)def message(self, x_j, norm):# x_j的维度为[E, out_channels]# 4.进行传递消息的构造,将标准化系数乘以邻域节点的特征信息得到传递信息return norm.view(-1, 1) * x_jdef update(self, aggr_out):# aggr_out的维度为[N, out_channels]# 6.更新新的节点嵌入,这里没有做任何多余的映射过程return aggr_out# 实例化对象
conv = GCNConv(16, 32)
# 默认为调用对象的forward函数
x = conv(x, edge_index)

对于上面的代码,GCNConv全部的计算流程都在forward()函数中,在该函数中,前三步是明确计算出来,但是第4-6步是隐含在propagate()函数中进行调用,propagate()函数会调用重载后message()函数和update()函数,并且自身实现了聚合过程。下面测试一下x_j的取值:
(1)取消linear过程
(2)在message函数中输出x_j
初始化信息为:

# 构建数据
edge_index = torch.tensor([[0, 1, 1, 2],[1, 0, 2, 1]
], dtype=torch.long)
x = torch.tensor([[0, 0, 0],[1, 1, 1],[2, 2, 2]
], dtype=torch.float)

输出的x_j为:

tensor([[0., 0., 0.],[1., 1., 1.],[1., 1., 1.],[2., 2., 2.],[0., 0., 0.],[1., 1., 1.],[2., 2., 2.]])

所以x_j对应的节点序列为[0,1,1,2,0,1,2],而egde_index增加自环之后,是:

tensor([[0, 1, 1, 2, 0, 1, 2],[1, 0, 2, 1, 0, 1, 2]])

所以x_j对应第一行节点的特征信息。

【注】后面将会对PyG自带的例子进行分析以及相关API。


http://chatgpt.dhexx.cn/article/eXM7mn6h.shtml

相关文章

[易飞]录入信息传递设置信息

通常我们在查询相关单据单身中会有附带上一个单别的关联单据,比如采购发票单身有进货单单别、单号。系统默认做了超连接。 可有些时候我想查看这个品号信息的参数呢?是否可以自定义呢? 今天是礼拜一,打开某聊天群:就显…

100种思维模型之信息传递思维模型-028

人与人之间存有 认知偏差和理解偏差 ,信息在传递过程中会 衰减、失真以及再加工 ! 信息传递思维模型 ,一个有助于 提高信息传递质量 的思维模型。下面从三个方面进行介绍, 何谓信息传递思维模型、信息传递思模型生活中的运…

沟通管理--关于信息的有效传递和维护

沟通管理作为项目管理核心知识领域之一,在项目管理和团队协作中的作用毋庸置疑。沟通管理涉及的范围很广,本文从沟通的重要性和模型出发,主要从信息传递和信息维护这两个方面对沟通管理进行阐述。 一. 关于沟通 下面这张图描绘了西方文化中…

HC官方资料介绍

中国区市场招商联系方式:13867974424

HC-SR04驱动记录

文章目录 1、工作原理2、读取数据方式3、驱动记录 1、工作原理 常用的HC-SR04模块如下所示: 引脚说明: 引脚说明VCC电源,常用5vTrig控制端Echo接收端GND地 使用说明: 控制端发送一个10us的高电平脉冲,之后再接收口…

【STM32篇】驱动HC_SR04超声波测距模块

CH_SR04 一、简介 1.产品特点 HC_SR04超声波测距模块可提供2cm-400cm的非接触式测距感测功能,测距精度高达3mm;模块包括超声波发射器,接收器与控制电路。 基本工作原理: (1)采用IO口TRIG触发测距&#xff0…

HC-05蓝牙模块配置

目录 1、连接蓝牙模块a.蓝牙模块通过USB转TTL连接电脑b.打开串口助手,波特率设置为38400c.检验是否连接成功 2、配置波特率3、修改密码4、设置主从模式5、设置蓝牙连接模式6、查询自身地址7、添加配对蓝牙地址8、测试 1、连接蓝牙模块 a.蓝牙模块通过USB转TTL连接电…

HC-06蓝牙模块使用方法

接线方式: 配套资料: 链接:https://pan.baidu.com/s/1_8-d1LoHuhpIBC9Ygu4aJQ 参考: (1272条消息) HC-05/06蓝牙模块的原理及使用方法_hc-05蓝牙模块原理图_小小少年123的博客-CSDN博客 注意:蓝牙灯闪烁分析 如果…

初次使用HC-08蓝牙模块01

基础连接 1.接线 2.测试,手机APP和测试架,成功互发AT指令即成功 3.完整教学 测试结果 起初手机APP搜索不到蓝牙,以测试架为主,另一个为从,从上面的蓝灯不亮, 后面重新恢复出厂设置(在串口…

HC-05的基本使用(STM32)

目录 一、HC-05 1、HC-05简介 2、接线方式 二、AT指令 1.基本指令 2、基本的使用 3、手机连接HC-05 三、CubuMX配置(基于stm32f407zgt6) 总结 一、HC-05 1、HC-05简介 HC-05 蓝牙串口通信模块,是基于 Bluetooth Specification V2.0 带 EDR 蓝…

智慧小区 HC 系统安装配置简单流程(V2022-09-28)

首先感谢官方 HC 开发(一纸荒年)的指导 ------------- 我的系统为: conetos 8.2(官方建议 7.6 版本较稳定) 登陆空间系统打开 SSH 终端# 第一步骤 1:先安装梓豪平台 1.1:梓豪平台安装是非常简单的,我们可以通过以…

Media Player Classic - HC 源代码分析 1:整体结构

Media Player Classic - HC 源代码分析系列文章列表: Media Player Classic - HC 源代码分析 1:整体结构 Media Player Classic - HC 源代码分析 2:核心类 (CMainFrame)(1) Media Player Cla…

HC-08蓝牙模块与电脑进行蓝牙远程通信! 支持HC-02、HC-08、HC-42蓝牙

因项目接触HC-08蓝牙模块,一直想电脑与STM32上接的HC-08蓝牙模块进行远程通信!在网上未能找到解决办法,此方式为广州汇承公司提供(蓝牙生产厂家),亲测有效! 一、适用型号及PC条件: 1…

蓝牙模块(HC-05/HC-06)详解

这里写目录标题 0. 蓝牙概述蓝牙技术的特点 1. 常见的蓝牙模块2. HC-05/HC-062.1 概念2.2 区别 3. STM32使用HC-05通信3.1 方法3.2 示例代码 0. 蓝牙概述 蓝牙(Bluetooth)是一种用于无线通信的技术标准,允许设备在短距离内进行数据交换和通信…

经验分享帖 汇承HC-12无线模块的简单使用说明

** 汇承HC-12无线模块的简单使用说明 ** 无意间在网上看到HC-12的功能介绍,最吸引我的是他的通信距离。于是我从网上买了两个,想着替代两个蓝牙,实现远距离通信控制。 这两张图是我手上的HC-12无线模块,其他引脚我就不多说了,与…

HC-05主从模式蓝牙配对说明v1.0

HC-05主从模式蓝牙配对说明 在参加电赛或者做毕业设计的时候,可能需要进行无线通信传输数据。 无线通信的方案有NRF24L01的射频传输。 有esp8266的wifi。 使用HC-05蓝牙的方式进行无线透传使用简单,延时较低,用于调试场景非常方便&#xff0c…

【51】HC-06蓝牙模块使用

说到蓝牙模块,就不得不说下主、从机: 主机 : 用于向从机下发指令,能够搜索从机并主动建立连接的一方。 从机 : 用于接收主机下发的命令,不能主动建立连接,只能等别人连接自己。 主从一体 : 能够在主机和从机模式间切换…

hc-05 模块教程2 (两个hc-05连接)

http://www.arduino.cn/thread-21735-1-1.html 最近在做项目需要建立两个hc-05通讯,但网上教程有限和有很多都不是很清楚所以整合了下资料重新做了一份个人认为比较详细的教程和大家一起分享学习。 这个教程说明怎么样用hc-05查找附近的hc-05模块并与它建立通讯。 …

面向对象在python中的实践---如何定义类、对象?

一、如何定义一个类 1.1基本语法 class Money:pass 类可以分为经典类和新式类 注意点: 类名Money中的首字母必须要大写 二、怎样通过类,创建一个对象 2.1根据类创建一个对象 #定义一个类 class Money:pass #根据这个类来实例化出一个对象 oneMon…

python的安装教程

Python 是这两年来比较流行的一门编程语言,主要的特点是其相对简单的语法以及丰富的第三方库。下面是python的下载安装过程。 1.python的官方下载网站: Welcome to Python.orghttps://www.python.org/ 选择自己适合的版本进行下载 * 我们以最新的3X为例…