GATv2Conv

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

基类: Module

来自 How Attentive are Graph Attention Networks? 的 GATv2。

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

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

\[ \begin{align}\begin{aligned}\alpha_{ij}^{(l)} &= \mathrm{softmax_i} (e_{ij}^{(l)})\\e_{ij}^{(l)} &= {\vec{a}^T}^{(l)}\mathrm{LeakyReLU}\left( W^{(l)}_{left} h_{i} + W^{(l)}_{right} h_{j}\right)\end{aligned}\end{align} \]
参数:
  • in_feats (int, or pair of ints) – 输入特征大小;即 \(h_i^{(l)}\) 的维度数量。如果该层应用于单向二分图,则 in_feats 指定源节点和目标节点上的输入特征大小。如果给定一个标量,则源节点和目标节点的特征大小取相同的值。

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

  • 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 (可调用激活函数/层 or None, optional.) – 如果不为 None,则将激活函数应用于更新后的节点特征。默认值: None

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

  • bias (bool, optional) – 如果设置为 False,该层将不学习加性偏置。(默认值: True)

  • share_weights (bool, optional) – 如果设置为 True,则上述方程中的 \(W_{left}\)\(W_{right}\) 将使用相同的矩阵应用于每条边的源节点和目标节点。(默认值: 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 GATv2Conv
>>> # 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)
>>> gatv2conv = GATv2Conv(10, 2, num_heads=3)
>>> res = gatv2conv(g, feat)
>>> res
tensor([[[ 1.9599,  1.0239],
        [ 3.2015, -0.5512],
        [ 2.3700, -2.2182]],
        [[ 1.9599,  1.0239],
        [ 3.2015, -0.5512],
        [ 2.3700, -2.2182]],
        [[ 1.9599,  1.0239],
        [ 3.2015, -0.5512],
        [ 2.3700, -2.2182]],
        [[ 1.9599,  1.0239],
        [ 3.2015, -0.5512],
        [ 2.3700, -2.2182]],
        [[ 1.9599,  1.0239],
        [ 3.2015, -0.5512],
        [ 2.3700, -2.2182]],
        [[ 1.9599,  1.0239],
        [ 3.2015, -0.5512],
        [ 2.3700, -2.2182]]], grad_fn=<GSpMMBackward>)
>>> # 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, 5).astype(np.float32))
>>> v_feat = th.tensor(np.random.rand(4, 10).astype(np.float32))
>>> gatv2conv = GATv2Conv((5,10), 2, 3)
>>> res = gatv2conv(g, (u_feat, v_feat))
>>> res
tensor([[[-0.0935, -0.4273],
        [-1.1850,  0.1123],
        [-0.2002,  0.1155]],
        [[ 0.1908, -1.2095],
        [-0.0129,  0.6408],
        [-0.8135,  0.1157]],
        [[ 0.0596, -0.8487],
        [-0.5421,  0.4022],
        [-0.4805,  0.1156]],
        [[-0.0935, -0.4273],
        [-1.1850,  0.1123],
        [-0.2002,  0.1155]]], grad_fn=<GSpMMBackward>)
forward(graph, 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 或 pair of torch.Tensor

param get_attention:

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

type get_attention:

bool, optional

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

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

raises DGLError:

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

reset_parameters()[source]

描述

重新初始化可学习参数。

注意

fc 权重 \(W^{(l)}\) 使用 Glorot 均匀初始化。注意力权重使用 xavier 初始化方法。