Neo-GNNs: Neighborhood Overlap-aware Graph Neural Networks for Link Prediction

Neo-GNNs: Neighborhood overlap-aware graph neural networks for link prediction. NeurIPS, 2021.

一种计算上相对高效的, 同时利用结构信息和特征信息的链接预测模型.

符号说明

  • \(\mathcal{G} = (\mathcal{V}, \mathcal{E})\), graph;
  • \(\mathcal{V} = \{v_1, v_2, \ldots, v_N\}\), \(N\) nodes;
  • \(\mathcal{E} = \{e_{ij} | v_i, v_j \in \mathcal{V}\}\), edges;
  • \(A \in \mathbb{R}^{N \times N}\), adjacency matrix;
  • \(D \in \mathbb{R}^{N \times N}\), diagonal matrix \(D_{ii} = \sum_{j} A_{ij}\);
  • \(X \in \mathbb{R}^{N \times F}\), node features

Motivation

  • link prediction 有很多启发式的方法, 比如利用

    \[S_{CN}(u, v) = |\mathcal{N}(u) \cap \mathcal{N}(v) | = \sum_{k \in \mathcal{N}(u) \cap \mathcal{N}(v)} 1, \\ S_{RA}(u, v) = \sum_{k \in \mathcal{N}(u) \cap \mathcal{N}(v)} \frac{1}{d_k}, \\ S_{AA}(u, v) = \sum_{k \in \mathcal{N}(u) \cap \mathcal{N}(v)} \frac{1}{\log d_k}. \]

  • 作者的做法是将它一般化, 即

    \[S(u, v) = \sum_{k \in \mathcal{N}(u) \cap \mathcal{N}(v)} x_k. \]

Neo-GNN

  • \(x_k\) 是这般设计的:

    \[x_i^{struct} = \mathcal{F}_{\theta}(A_i) = f_{\theta_{node}} \bigg( \sum_{j \in \mathcal{N}_i} f_{\theta_{edge}} (A_{ij}) \bigg), \]

    通过可学习的参数从邻接矩阵 \(A\) 中获得有用的结构信息.

  • 有更一般的计算方式. 我们令

    \[X^{struct} = \text{diag}(x^{struct}) \in \mathbb{R}^{N \times N}, \]

    则当 \(f_{\theta_{edge}}(x) = x\)\(f_{\theta_{edge}}(x) = 1 / \sqrt{\log x}\) 的时候,

    \[S(u, v) = z_u^T z_v, \: Z = AX^{struct}. \]

  • 更为一般的, 为了利用更高阶的信息, 作者实际上采用如下的形式:

    \[Z = g_{\Phi} (\sum_{l=1}^L \beta^{l-1} A^l X^{struct}), \]

    其中 \(\beta\) 是用来控制高阶信息的一个超参数.

  • 除此之外, 通过一个普通的 GNN 得到传统的 (smoothed) 节点特征:

    \[H = \text{GNN}(X, \tilde{A}_{GNN}; W) \in \mathbb{R}^{N \times d'}. \]

  • 最后两个结点存在边的概率通过如下的方式得到:

    \[\hat{y}_{ij} = \alpha \cdot \sigma (z_i^T z_j) + (1 - \alpha) \cdot \sigma (s(h_i, h_j)), \]

    其中 \(\alpha\) 是可训练的参数.

  • 训练的时候, 两个分支也要单独参与训练:

    \[\mathcal{L} = \sum_{(i, j) \in D} (\lambda_1 BCE(\hat{y}_{ij}, y_{ij})) + \lambda_2 BCE(\sigma(z_i^T z_j), y_{ij}) + \lambda_3 BCE(\sigma(s(h_i, h_j)), y_{ij}). \]

代码

[official]

posted @ 2024-08-25 15:08  馒头and花卷  阅读(40)  评论(0编辑  收藏  举报