GNN MessagePassing类消息传递范式作业
1… 请总结MessagePassing类的运行流程以及继承MessagePassing类的
规范。
Pytorch Geometric(PyG)提供了MessagePassing基类,它实现了消息传
播的自动处理,继承该基类可使我们方便地构造消息传递图神经网络,我
们只需定义函数 ,即message() 函数,和函数 ,即 update()函数,以
及使用的消息聚合方案,即aggr=“add” 、aggr="mean"或 aggr=“max” 。
这些是在以下方法的帮助下完成的:
MessagePassing(aggr=“add”, flow=“source_to_target”,
node_dim=-2) :
aggr:定义要使用的聚合方案(“add”、"mean "或 “max”);
flow:定义消息传递的流向("source_to_target "或
“target_to_source”);
node_dim:定义沿着哪个轴线传播。
MessagePassing.propagate(edge_index, size=None,
**kwargs) :
开始传播消息的起始调用。它以edge_index (边的端点的索引)
和flow(消息的流向)以及一些额外的数据为参数。
请注意,propagate()不仅限于在形状为 [N, N] 的对称邻接矩阵
中交换消息,还可以通过传递size=(N, M)作为额外参数。例如,
在二部图的形状为[N, M] 的一般稀疏分配矩阵中交换消息。
如果设置size=None ,则假定邻接矩阵是对称的。对于有两个独立的节点集合和索引集合的二部图,并且每个集合都
持有自己的信息,我们可以传递一个元组参数,即x=(x_N,
x_M),来标记信息的区分。
MessagePassing.message(…) :
首先确定要给节点 传递消息的边的集合,如果
flow=“source_to_target” ,则是 的边的集合;
如果flow=“target_to_source” ,则是 的边的集合。
接着为各条边创建要传递给节点 的消息,即实现 函数。
MessagePassing.message(…) 函数接受最初传递给
MessagePassing.propagate(edge_index, size=None,
**kwargs) 函数的所有参数。
此外,传递给propagate()的张量可以被映射到各自的节点 和
上,只需在变量名后面加上_i 或_j 。我们把 称为消息传递的目标
中心节点,把 称为邻接节点。
MessagePassing.aggregate(…):
将从源节点传递过来的消息聚合在目标节点上,一般可选的聚合方
式有sum , mean和max 。
MessagePassing.message_and_aggregate(…) :
在一些场景里,邻接节点信息变换和邻接节点信息聚合这两项操作
可以融合在一起,那么我们可以在此函数里定义这两项操作,从而
让程序运行更加高效。
MessagePassing.update(aggr_out, …) :
为每个节点 更新节点表征,即实现 函数。该函数以聚合函数
的输出为第一个参数,并接收所有传递给propagate()函数的参数。
(1)class GCNConv(MessagePassing):
def forward(self, x, d):
return self.propagate( x=x, d=d)
def message(self, x,d):
return x,d
(2) class GCNConv(MessagePassing):
def init(self, in_channels, out_channels):
super(GCNConv, self).init(aggr=‘add’, flow=‘source_to_target’)
def forward(self, x, d):
return self.propagate( x=x, d=d)
def aggregate(self, x=x,d=d):
return np.mean(x),np.mean(d)
(3) class GCNConv(MessagePassing):
def init(self, in_channels, out_channels):
super(GCNConv, self).init(aggr=‘add’, flow=‘source_to_target’)
def forward(self, x, d):
return self.propagate( x=x, d=d)
def aggregate(self, x=x,d=d):
return np.mean(x),np.mean(d)
def update(self, inputs: Tensor) -> Tensor:
return torch.nn.linear(inputs)
(4) class GCNConv(MessagePassing):
def __init__(self, in_channels, out_channels):
super(GCNConv, self).__init__(aggr='add', flow='source_to_target')
def forward(self, x, d):
return self.propagate( x=x, d=d)
def aggregate(self, x=x,d=d):
return np.mean(x),np.mean(d)
def update(self, inputs: Tensor) -> Tensor:
return torch.nn.linear(inputs)
def message_and_aggregate(self, x,d):
return np.mean(x),np.mean(d)