toch_geometric 笔记:message passing & GCNConv

 1 message passing介绍

        将卷积算子推广到不规则域通常表示为一个邻域聚合(neighborhood aggregation)或消息传递(message passing )方案

        给定第(k-1)层点的特征,以及可能有的点与点之间边的特征,依靠信息传递的GNN可以被描述成:

 

 其中表示一个可微分的可微,置换不变的函数(比如sum、mean或者max),γ和Φ表示可微分方程(比如MLP)

2 message passing 类  

        PyG提供了message passing基类,它通过自动处理消息传播来帮助创建这类消息传递图神经网络。

        使用者只需要定义γ(update函数)和Φ(message函数),以及聚合方式aggr(即)【aggr="add"aggr="mean" or aggr="max"】即可

2.1 MessagePassing

MessagePassing(
    aggr="add", 
    flow="source_to_target", 
    node_dim=-2)

 定义了聚合方式(这里是’add‘)

信息传递的流方向("source_to_target" 【默认】or "target_to_source")

node_dim表示了沿着哪个轴进行传递

2.2 MessagePassing.propagate

MessagePassing.propagate(
    edge_index, 
    size=None, 
    **kwargs)

        开始传播消息的初始调用。

        获取边索引(edge index)和所有额外的数据,这些数据是构造消息和更新节点嵌入所需要的。

        propagate()不仅可以在[N,N]的邻接方阵中传递消息,还可以在非方阵中传递消息,(比如二部图[N,M],此时设置size=(N,M)作为额外的形参)

        如果size参数设置为None,那么矩阵默认是一个方阵。

        对于二部图[N,M]来说,它有两组互相独立的点集,我们还需要设置x=(x_N,x_M)

2.3 MessagePassing.message(...)

        类似于Φ。将信息传递到节点i上。 如果flow="source_to_target",那么是找所有(j,i)∈E;如果flow="target_to_source",那么找所有(i,j)属于E。

        可以接受最初传递给propagate()的任何参数。

        此外,传递给propagate()的张量可以通过在变量名后面附加_i或_j,映射到各自的节点。例如,x_i(表示中心节点)、 x_j(表示邻居节点)。

        注意,我们通常将i称为汇聚信息的中心节点,将j称为相邻节点,因为这是最常见的表示法。

2.4 MessagePassing.update(aggr_out, ...)

        类比γ,对每个点i∈ V,更新它的node embedding

        第一个参数是聚合输出,同时将所有传递给propagate()的参数作为后续参数

3 举例: GCN

3.1 GCN回顾

GCN层可以表示为:

         k-1层的邻居节点先通过权重矩阵Θ加权,然后用中心节点和这个邻居节点的度来进行归一化,最后求和聚合 。

3.2 message passing 实现过程

        这个方程可以划分成以下几个步骤

  1. 在邻接矩阵中添加自环(因为上式Σ的下标中,除了i的邻居,还有i本身)
  2. 线性变换特征矩阵
  3. 计算归一化系数
  4. 归一化邻居/上一层的自己的点特征 (Φ,即message操作) 
  5. 求和邻居节点、自身的点特征(“add”,γ操作)

        步骤1~3在message passing开始前就已经计算完毕了;步骤4,5则可以用MessagePassing操作来进行处理 。

3.3 代码解析

import torch
from torch_geometric.nn import MessagePassing
from torch_geometric.utils import add_self_loops, degree

class GCNConv(MessagePassing):
    def __init__(self, in_channels, out_channels):
        super().__init__(aggr='add') 
        # "Add" aggregation (Step 5).
        #GCN类从MessagePssing中继承得到的聚合方式:“add”
        self.lin = torch.nn.Linear(in_channels, out_channels)

    def forward(self, x, edge_index):
        # x has shape [N, in_channels] ——N个点,每个点in_channels维属性
        # edge_index has shape [2, E]——E条边,每条边有出边和入边

        # Step 1: Add self-loops to the adjacency matrix.
        edge_index, _ = add_self_loops(edge_index, num_nodes=x.size(0))
        #添加自环

        # Step 2: Linearly transform node feature matrix.
        x = self.lin(x)
        #对X进行线性变化

        # Step 3: Compute normalization.
        row, col = edge_index
        #出边和入边
        deg = degree(col, x.size(0), dtype=x.dtype)
        #各个点的入度(无向图,所以入读和出度相同)
        deg_inv_sqrt = deg.pow(-0.5)
        deg_inv_sqrt[deg_inv_sqrt == float('inf')] = 0
        norm = deg_inv_sqrt[row] * deg_inv_sqrt[col]
        #1/sqrt(di) *1/sqrt(dj)

        # Step 4-5: Start propagating messages.
        return self.propagate(edge_index, x=x, norm=norm)
        #进行propagate
        #propagate的内部会调用message(),aggregate()和update()
        #作为消息传播的附加参数,我们传递节点嵌入x和标准化系数norm。    

    def message(self, x_j, norm):
        # x_j has shape [E, out_channels]
        #我们需要对相邻节点特征x_j进行norm标准化
        #这里x_j为一个张量,其中包含每条边的源节点特征,即每个节点的邻居。

        # Step 4: Normalize node features.
        return norm.view(-1, 1) * x_j
        #1/sqrt(di) *1/sqrt(dj) *X_j

  之后,我们就可以用这种方法轻松调用了:

conv = GCNConv(16, 32)
x = conv(x, edge_index)

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当我们讨论图结构和图神经网络时,通常是指在处理非欧几里得数据、如社交网络、推荐系统、蛋白质相互作用网络等时使用的一种数据表示和学习方法。 图结构是由节点(vertices)和边(edges)组成的数据结构。节点代表实体,边代表节点之间的关系。图可以是有向的(边有方向)或无向的(边没有方向),可以是带权重的(边有权重)或无权重的(边没有权重)。图可以用邻接矩阵或邻接表等方式来表示。 图神经网络(Graph Neural Network,GNN)是一类用于处理图结构数据的神经网络模型。GNN通过学习节点和边的表示,可以对整个图进行学习和推理。GNN模型通常由多个层组成,每一层都会更新节点的表示,并且节点的表示会考虑周围节点的信息。 GNN的核心操作是消息传递(message passing)。在每一个GNN层中,节点会接收并聚合来自邻居节点的信息,然后通过一个更新函数来更新自身的表示。这样,节点的表示会考虑到其周围节点的信息,并且这个过程可以迭代多次以增强表示的能力。 通过多个GNN层的堆叠,GNN可以逐渐聚合全局和局部信息,从而对整个图进行学习和推理。GNN在图分类、节点分类、链接预测、图生成等任务上都取得了令人瞩目的成果。 需要注意的是,图神经网络有许多变种和扩展,如Graph Convolutional Network (GCN)、GraphSAGE、GAT等,它们在消息传递、聚合方式以及节点更新函数等方面有所不同。 希望这个简要的介绍对您有帮助。如果您有更多关于图结构和图神经网络的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值