Paper : GPT-GNN: Generative Pre-Training of Graph Neural Networks
Code : official
GPT-GNN引入了自监督的属性图生成任务来预训练GNN,以便捕获图的结构和语义属性。 我们将图生成分为两个部分:属性生成和边生成。通过对两个部分进行建模,GPT-GNN可以在生成过程中捕获节点属性与图结构之间的固有依赖性。
GPT-GNN通过最大化图的似然函数来预训练 GNN,也就是说
θ ∗ = max θ p ( G ; θ ) \theta^* = \max_\theta p(G;\theta) θ∗=θmaxp(G;θ)
图的生成过程是迭代生成过程,假定对图中的点进行排列 π \pi π,在 π \pi π 的排列顺序下定义图的似然函数
p ( G ; θ ) = E π [ p θ ( X π , E π ) ] p(G;\theta) = \mathbb E_\pi [p_\theta(X^\pi,E^\pi)] p(G;θ)=Eπ[pθ(Xπ,Eπ)]
其中 X π X^\pi Xπ 定义了节点向量 X π ∈ R ∣ V ∣ × d X^\pi \in \mathbb R^{|V|\times d} Xπ∈R∣V∣×d, E i π E^\pi_i Eiπ 表示所有与节点 i π i^\pi iπ 相连的边。对数似然函数定义为
log p θ ( X , E ) = ∑ i = 1 ∣ V ∣ log p θ ( X i , E i ∣ X < i , E < i ) \log p_{\theta}(X,E) = \sum_{i=1}^{|V|} \log p_\theta (X_i,E_i|X_{logpθ(X,E)=i=1∑∣V∣logpθ(Xi,Ei∣X<i,E<i)
下一个问题是如何计算 p θ ( X i , E i ∣ X < i , E < i ) p_\theta (X_i,E_i|X_{pθ(Xi,Ei∣X<i,E<i), 假定我们提前可以观察到部分的边,GPT-GNN算法可以将节点特征的生成和边的生成分成两部分
假设 E i , o E_{i,o} Ei,o 表示与 i i i 相连的可以观察到的边
p θ ( X i , E i ∣ X < i , E < i ) = E o [ p θ ( X i , E i , o ‾ ∣ E i , o , X < i , E < i ) ] = E o [ p θ ( X i ∣ E i , o , X < i , E < i ) ⋅ p θ ( E i , o ‾ ∣ E i , o , X ≤ i , E < i ) ] p_\theta (X_i,E_i|X_{pθ(Xi,Ei∣X<i,E<i)=Eo[pθ(Xi,Ei,o∣Ei,o,X<i,E<i)]=Eo[pθ(Xi∣Ei,o,X<i,E<i)⋅pθ(Ei,o∣Ei,o,X≤i,E<i)]
为了对两步生成过程进行建模,将当前阶段的节点的节点拆分成两个点,分别用来进行属性生成和边生成。对于属性生成节点,使用共享的表示dummy的初始化向量 X init X_\text{init} Xinit 表示。对于边生成节点,我们将该点上的属性作为输入传进去。
假定 h Attr h^\text{Attr} hAttr 和 h Edge h^\text{Edge} hEdge 分别表示属性生成节点和边生成节点的输出向量,在GNN进行消息传递时,只是用 h Edge h^\text{Edge} hEdge 进行消息传递。定义节点属性的解码器为 Dec Attr ( ⋅ ) \text{Dec}^\text{Attr}(\cdot) DecAttr(⋅),属性损失函数定义为
L i Attr = Distance ( Dec Attr ( h i Addr , X i ) ) \mathcal L_i^\text{Attr} = \text{Distance}(\text{Dec}^\text{Attr}(h_i^\text{Addr},X_i)) LiAttr=Distance(DecAttr(hiAddr,Xi))
对于边生成模型,假定边与边之间时相互独立的,即
p θ ( E i , o ‾ ∣ E i , o , X ≤ i , E < i ) = ∏ j + ∈ E i , o ‾ p θ ( j + ∣ E i , o , X ≤ i , E < i ) p_{\theta}(E_{i,\overline o}|E_{i,o},X_{\leq i},E_{pθ(Ei,o∣Ei,o,X≤i,E<i)=j+∈Ei,o∏pθ(j+∣Ei,o,X≤i,E<i)
损失函数定义为
L i edge = − ∑ j + ∈ E i , o ‾ log exp ( Dec edge ( h i edge , h j + edge ) ) ∑ j ∈ S i − ∪ j + exp ( Dec edge ( h i edge , h j edge ) ) \mathcal L_i^\text{edge} = -\sum_{j^+\in E_{i,\overline o}}\log \frac{\exp (\text{Dec}^{\text{edge}}(h_i^\text{edge},h_{j^+}^\text{edge}))}{\sum_{j\in S_i^-\cup{j^+}}\exp (\text{Dec}^{\text{edge}}(h_i^\text{edge},h_{j}^\text{edge}))} Liedge=−j+∈Ei,o∑log∑j∈Si−∪j+exp(Decedge(hiedge,hjedge))exp(Decedge(hiedge,hj+edge))
其中 S i − S_i^- Si− 表示不与 i i i 相邻的节点。算法的整体流程如下所示
异质网络:异构图意味着包含不同类型的节点和边。对于异构图,唯一的区别是每种类型的节点和边都可以具有自己的解码器,该解码器由异构GNN指定。
大型网络:对图进行子图采样以进行训练。 特别的,建议分别使用LADIES算法和其异构版本HGSampling 从同构图和异构图采样密集子图。 从理论上讲,这两种方法都保证了采样节点之间的高度互连,并最大程度地保留了结构信息。估计边生成等式中的对比损失,需要遍历输入图的所有节点。但是,我们只能访问子图中的采样节点以估计此损失,从而使自监督仅关注本地信号。 为了缓解此问题,提出了“自适应队列”,它在先前采样的子图中将节点表示形式存储为负采样。每次处理新的子图时,我们都会通过添加新的节点表示并删除旧的节点表示来逐步更新此队列。由于不会严格更新模型参数,因此队列中存储的负样本是一致且准确的。自适应队列使我们能够使用更大的负样本池 S i − S_i^- Si−。此外,跨不同样本子图的节点可以引入用于对比学习的全局结构指导。
作者除了常规的性能实验、消融实验以外,提出了三种迁移实验的设置
个人感觉实验部分存在一些问题,作者做的实验除了迁移鲁棒性以外只有两个常规实验,缺乏pretrain方法之间的比较,算法的有效性应该是前提条件,而算法效果比同类更好才是创新点。