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_attention
为True
时返回。
- 抛出 DGLError:
如果输入图中存在入度为 0 的节点,它将引发 DGLError,因为没有消息会传递到这些节点。这将导致无效输出。可以通过将
allow_zero_in_degree
参数设置为True
来忽略此错误。