HGTConv

class dgl.nn.pytorch.conv.HGTConv(in_size, head_size, num_heads, num_ntypes, num_etypes, dropout=0.2, use_norm=False)[源代码]

基类: Module

来自 Heterogeneous Graph Transformer 的异构图 transformer 卷积

给定图 \(G(V, E)\) 和输入节点特征 \(H^{(l-1)}\),它按如下方式计算新的节点特征

计算图中每条边 \((s, e, t)\) 的多头注意力分数

\[\begin{split}Attention(s, e, t) = \text{Softmax}\left(||_{i\in[1,h]}ATT-head^i(s, e, t)\right) \\ ATT-head^i(s, e, t) = \left(K^i(s)W^{ATT}_{\phi(e)}Q^i(t)^{\top}\right)\cdot \frac{\mu_{(\tau(s),\phi(e),\tau(t)}}{\sqrt{d}} \\ K^i(s) = \text{K-Linear}^i_{\tau(s)}(H^{(l-1)}[s]) \\ Q^i(t) = \text{Q-Linear}^i_{\tau(t)}(H^{(l-1)}[t]) \\\end{split}\]

计算在每条边 \((s, e, t)\) 上发送的消息

\[\begin{split}Message(s, e, t) = ||_{i\in[1, h]} MSG-head^i(s, e, t) \\ MSG-head^i(s, e, t) = \text{M-Linear}^i_{\tau(s)}(H^{(l-1)}[s])W^{MSG}_{\phi(e)} \\\end{split}\]

将消息发送到目标节点 \(t\) 并进行聚合

\[\tilde{H}^{(l)}[t] = \sum_{\forall s\in \mathcal{N}(t)}\left( Attention(s,e,t) \cdot Message(s,e,t)\right)\]

计算新的节点特征

\[H^{(l)}[t]=\text{A-Linear}_{\tau(t)}(\sigma(\tilde(H)^{(l)}[t])) + H^{(l-1)}[t]\]
参数:
  • in_size (int) – 输入节点特征的大小。

  • head_size (int) – 输出头的尺寸。输出节点特征的大小为 head_size * num_heads

  • num_heads (int) – 头数。输出节点特征的大小为 head_size * num_heads

  • num_ntypes (int) – 节点类型数。

  • num_etypes (int) – 边类型数。

  • dropout (可选, float) – Dropout 比率。

  • use_norm (可选, bool) – 如果为 True,则对输出节点特征应用层归一化。

示例

forward(g, x, ntype, etype, *, presorted=False)[源代码]

前向计算。

参数:
  • g (DGLGraph) – 输入图。

  • x (torch.Tensor) – 节点特征的二维张量。形状: \((|V|, D_{in})\)

  • ntype (torch.Tensor) – 节点类型的一维整数张量。形状: \((|V|,)\)

  • etype (torch.Tensor) – 边类型的一维整数张量。形状: \((|E|,)\)

  • presorted (bool, 可选) – 输入图的节点和边是否均已按类型排序。在预排序的图上进行前向计算可能更快。由 to_homogeneous() 创建的图会自动满足此条件。另请参阅 reorder_graph() 以手动重新排序节点和边。

返回值:

新的节点特征。形状: \((|V|, D_{head} * N_{head})\)

返回类型:

torch.Tensor