EdgeGATConv

class dgl.nn.pytorch.conv.EdgeGATConv(in_feats, edge_feats, out_feats, num_heads, feat_drop=0.0, attn_drop=0.0, negative_slope=0.2, residual=True, activation=None, allow_zero_in_degree=False, bias=True)[source]

基类: Module

来自 SCENE 的带边特征的图注意力层

\[\mathbf{v}_i^\prime = \mathbf{\Theta}_\mathrm{s} \cdot \mathbf{v}_i + \sum\limits_{j \in \mathcal{N}(v_i)} \alpha_{j, i} \left( \mathbf{\Theta}_\mathrm{n} \cdot \mathbf{v}_j + \mathbf{\Theta}_\mathrm{e} \cdot \mathbf{e}_{j,i} \right)\]

其中 \(\mathbf{\Theta}\) 表示用于转换待更新节点 (s=self)、邻居节点 (n=neighbor) 和边 (e=edge) 特征的可学习权重矩阵。注意力权重通过以下公式获得:

\[\alpha_{j, i} = \mathrm{softmax}_i \Big( \mathrm{LeakyReLU} \big( \mathbf{a}^T [ \mathbf{\Theta}_\mathrm{n} \cdot \mathbf{v}_i || \mathbf{\Theta}_\mathrm{n} \cdot \mathbf{v}_j || \mathbf{\Theta}_\mathrm{e} \cdot \mathbf{e}_{j,i} ] \big) \Big)\]

其中 \(\mathbf{a}\) 对应一个可学习向量。\(\mathrm{softmax_i}\) 表示对节点 \(i\) 的所有传入边进行归一化。

参数:
  • in_feats (int, or pair of ints) – 输入特征尺寸;即 \(\mathbf{v}_i\) 的维度数量。GATConv 可以应用于同构图和单向二分图。如果该层应用于单向二分图,in_feats 指定源节点和目标节点的输入特征尺寸。如果给定一个标量,源节点和目标节点的特征尺寸将采用相同的值。

  • edge_feats (int) – 边特征尺寸;即 :math:mathbf{e}_{j,i}` 的维度数量。

  • out_feats (int) – 输出特征尺寸;即 \(\mathbf{v}_i^\prime\) 的维度数量。

  • num_heads (int) – 多头注意力的头数。

  • feat_drop (float, optional) – 特征上的 Dropout 比率。默认为 0

  • attn_drop (float, optional) – 注意力权重上的 Dropout 比率。默认为 0

  • negative_slope (float, optional) – LeakyReLU 负斜率的角度。默认为 0.2

  • residual (bool, optional) – 如果为 True,使用残差连接。默认为 False

  • activation (callable activation function/layer or None, optional.) – 如果不为 None,则对更新后的节点特征应用激活函数。默认为 None

  • allow_zero_in_degree (bool, optional) – 如果图中有入度为 0 的节点,这些节点的输出将无效,因为没有消息传递到这些节点。这对于某些应用有害,会导致静默的性能下降。如果检测到输入图中有入度为 0 的节点,此模块将引发 DGLError。通过设置为 True,将抑制此检查并允许用户自行处理。默认为 False

  • bias (bool, optional) – 如果为 True,学习一个偏置项。默认为 True

注意

入度为零的节点将导致输出值无效。这是因为没有消息会传递到这些节点,聚合函数将应用于空输入。避免这种情况的常见做法是,如果图是同构图,为每个节点添加自环,这可以通过以下方式实现:

>>> g = ... # a DGLGraph
>>> g = dgl.add_self_loop(g)

对于某些图,例如异构图,调用 add_self_loop 不起作用,因为无法确定自环边的类型。对于这些情况,将 allow_zero_in_degree 设置为 True 以解除代码阻塞并手动处理入度为零的节点。常见的处理方法是在卷积后使用时过滤掉入度为零的节点。

示例

>>> import dgl
>>> import numpy as np
>>> import torch as th
>>> from dgl.nn import EdgeGATConv
>>> # Case 1: Homogeneous graph.
>>> num_nodes, num_edges = 8, 30
>>> # Generate a graph.
>>> graph = dgl.rand_graph(num_nodes,num_edges)
>>> node_feats = th.rand((num_nodes, 20))
>>> edge_feats = th.rand((num_edges, 12))
>>> edge_gat = EdgeGATConv(
...     in_feats=20,
...     edge_feats=12,
...     out_feats=15,
...     num_heads=3,
... )
>>> # Forward pass.
>>> new_node_feats = edge_gat(graph, node_feats, edge_feats)
>>> new_node_feats.shape
torch.Size([8, 3, 15]) torch.Size([30, 3, 10])
>>> # Case 2: Unidirectional bipartite graph.
>>> u = [0, 1, 0, 0, 1]
>>> v = [0, 1, 2, 3, 2]
>>> g = dgl.heterograph({('A', 'r', 'B'): (u, v)})
>>> u_feat = th.tensor(np.random.rand(2, 25).astype(np.float32))
>>> v_feat = th.tensor(np.random.rand(4, 30).astype(np.float32))
>>> nfeats = (u_feat,v_feat)
>>> efeats = th.tensor(np.random.rand(5, 15).astype(np.float32))
>>> in_feats = (25,30)
>>> edge_feats = 15
>>> out_feats = 10
>>> num_heads = 3
>>> egat_model =  EdgeGATConv(
...     in_feats,
...     edge_feats,
...     out_feats,
...     num_heads,
... )
>>> # Forward pass.
>>> new_node_feats, attention_weights = egat_model(g, nfeats, efeats, get_attention=True)
>>> new_node_feats.shape, attention_weights.shape
(torch.Size([4, 3, 10]), torch.Size([5, 3, 1]))
forward(graph, feat, edge_feat, get_attention=False)[source]

说明

计算图注意力网络层。

param graph:

图。

type graph:

DGLGraph

param feat:

如果给定一个 torch.Tensor,则是形状为 \((N, *, D_{in})\) 的输入特征,其中 \(D_{in}\) 是输入特征的大小,\(N\) 是节点数。如果给定一对 torch.Tensor,该对必须包含两个形状分别为 \((N_{in}, *, D_{in_{src}})\)\((N_{out}, *, D_{in_{dst}})\) 的张量。

type feat:

torch.Tensor 或 一对 torch.Tensor

param edge_feat:

形状为 \((E, D_{in_{edge}})\) 的输入边特征,其中 \(E\) 是边数,\(D_{in_{edge}}\) 是边特征的大小。

type edge_feat:

torch.Tensor

param get_attention:

是否返回注意力值。默认为 False。

type get_attention:

bool, optional

返回值:
  • torch.Tensor – 形状为 \((N, *, H, D_{out})\) 的输出特征,其中 \(H\) 是头的数量,\(D_{out}\) 是输出特征的大小。

  • torch.Tensor, optional – 形状为 \((E, *, H, 1)\) 的注意力值。仅当 get_attentionTrue 时返回。

抛出 DGLError:

如果输入图中有入度为 0 的节点,将抛出 DGLError,因为没有消息会传递到这些节点。这将导致输出无效。通过将 allow_zero_in_degree 参数设置为 True 可以忽略此错误。

reset_parameters()[source]

说明

重新初始化可学习参数。

注意

fc 权重 \(\mathbf{\Theta}\) 和注意力权重使用 xavier 初始化方法。