DotGatConv

class dgl.nn.pytorch.conv.DotGatConv(in_feats, out_feats, num_heads, allow_zero_in_degree=False)[source]

基类: Module

图注意力网络 (Graph Attention Network) 中应用点积版本的自注意力机制

\[h_i^{(l+1)} = \sum_{j\in \mathcal{N}(i)} \alpha_{i, j} h_j^{(l)}\]

其中 \(\alpha_{ij}\) 是节点 \(i\) 和节点 \(j\) 之间的注意力得分

\[ \begin{align}\begin{aligned}\alpha_{i, j} &= \mathrm{softmax_i}(e_{ij}^{l})\\e_{ij}^{l} &= ({W_i^{(l)} h_i^{(l)}})^T \cdot {W_j^{(l)} h_j^{(l)}}\end{aligned}\end{align} \]

其中 \(W_i\)\(W_j\) 将节点 \(i\) 和节点 \(j\) 的特征转换到相同的维度,以便在计算节点特征相似度时可以使用点积。

参数:
  • in_feats (int, 或 int 的对) – 输入特征大小;即 \(h_i^{(l)}\) 的维度数量。DotGatConv 可以应用于同构图和单向 二分图。如果该层应用于单向二分图,in_feats 指定了源节点和目标节点的输入特征大小。如果给定一个标量,则源节点和目标节点的特征大小将取相同的值。

  • out_feats (int) – 输出特征大小;即 \(h_i^{(l+1)}\) 的维度数量。

  • num_heads (int) – 多头注意力 (Multi-Head Attention) 中的头数

  • allow_zero_in_degree (bool, 可选) – 如果图中存在入度为 0 的节点,则这些节点的输出将无效,因为没有消息会传递给这些节点。这对于某些应用程序是有害的,会导致静默的性能退化。如果输入图中检测到入度为 0 的节点,此模块将引发 DGLError。通过设置为 True,它将抑制检查并让用户自行处理。默认值: False

注意

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

>>> 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 DotGatConv
>>> # Case 1: Homogeneous graph
>>> g = dgl.graph(([0,1,2,3,2,5], [1,2,3,4,0,3]))
>>> g = dgl.add_self_loop(g)
>>> feat = th.ones(6, 10)
>>> dotgatconv = DotGatConv(10, 2, num_heads=3)
>>> res = dotgatconv(g, feat)
>>> res
tensor([[[ 3.4570,  1.8634],
        [ 1.3805, -0.0762],
        [ 1.0390, -1.1479]],
        [[ 3.4570,  1.8634],
        [ 1.3805, -0.0762],
        [ 1.0390, -1.1479]],
        [[ 3.4570,  1.8634],
        [ 1.3805, -0.0762],
        [ 1.0390, -1.1479]],
        [[ 3.4570,  1.8634],
        [ 1.3805, -0.0762],
        [ 1.0390, -1.1479]],
        [[ 3.4570,  1.8634],
        [ 1.3805, -0.0762],
        [ 1.0390, -1.1479]],
        [[ 3.4570,  1.8634],
        [ 1.3805, -0.0762],
        [ 1.0390, -1.1479]]], grad_fn=<BinaryReduceBackward>)
>>> # Case 2: Unidirectional bipartite graph
>>> u = [0, 1, 0, 0, 1]
>>> v = [0, 1, 2, 3, 2]
>>> g = dgl.heterograph({('_N', '_E', '_N'):(u, v)})
>>> u_feat = th.tensor(np.random.rand(2, 5).astype(np.float32))
>>> v_feat = th.tensor(np.random.rand(4, 10).astype(np.float32))
>>> dotgatconv = DotGatConv((5,10), 2, 3)
>>> res = dotgatconv(g, (u_feat, v_feat))
>>> res
tensor([[[-0.6066,  1.0268],
        [-0.5945, -0.4801],
        [ 0.1594,  0.3825]],
        [[ 0.0268,  1.0783],
        [ 0.5041, -1.3025],
        [ 0.6568,  0.7048]],
        [[-0.2688,  1.0543],
        [-0.0315, -0.9016],
        [ 0.3943,  0.5347]],
        [[-0.6066,  1.0268],
        [-0.5945, -0.4801],
        [ 0.1594,  0.3825]]], grad_fn=<BinaryReduceBackward>)
forward(graph, feat, get_attention=False)[source]

描述

在 GCN 中应用点积版本的自注意力机制。

参数 graph:

类型 graph:

DGLGraph 或 二分图

参数 feat:

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

类型 feat:

torch.Tensor 或 torch.Tensor 对

参数 get_attention:

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

类型 get_attention:

bool, 可选

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

  • torch.Tensor, 可选 – 注意力值,形状为 \((E, 1)\),其中 \(E\) 是边数。仅当 get_attentionTrue 时返回。

抛出 DGLError:

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