5.5 边权重的使用
在加权图中,每条边都与一个有语义意义的标量权重相关联。例如,边的权重可以是连接强度或置信度分数。自然地,人们可能希望在模型开发中利用边的权重。
带边权重的消息传递
大多数图神经网络(GNNs)在前向计算中通过且仅通过消息传递机制整合图拓扑信息。消息传递操作可以看作是一个函数,它以邻接矩阵和额外的输入特征作为输入参数。对于一个未加权的图,邻接矩阵中的条目可以是零或一,其中值为一的条目表示一条边。如果这个图是加权的,非零条目可以取任意标量值。这相当于将每条消息乘以其对应的边权重,如GAT中所示。
使用DGL,可以通过以下方式实现:
将边权重保存为边特征
将原始消息乘以消息函数中的边缘特征
考虑下面使用DGL的消息传递示例。
import dgl.function as fn
# Suppose graph.ndata['ft'] stores the input node features
graph.update_all(fn.copy_u('ft', 'm'), fn.sum('m', 'ft'))
可以按如下方式修改以支持边权重。
import dgl.function as fn
# Save edge weights as an edge feature, which is a tensor of shape (E, *)
# E is the number of edges
graph.edata['w'] = eweight
# Suppose graph.ndata['ft'] stores the input node features
graph.update_all(fn.u_mul_e('ft', 'w', 'm'), fn.sum('m', 'ft'))
使用带有边权重的NN模块
可以通过修改其中的所有消息传递操作来修改NN模块以支持边权重。以下代码片段是支持边权重的NN模块的示例。
DGL 的内置神经网络模块支持边权重,如果它们在 forward 函数中接受一个可选的 edge_weight
参数。
可能需要规范化原始边权重。在这方面,DGL提供了
EdgeWeightNorm()
。