预训练GNN:GPT-GNN Generative Pre-Training of Graph Neural Networks

news2025/1/23 14:54:10

一.文章概述

本文提出了一种自监督属性图生成任务来预训练GNN,使得其能捕图的结构和语义属性。作者将图的生成分为两个部分:属性生成和边生成,即给定观测到的边,生成节点属性;给定观测到的边和生成的节点属性,生成剩余的边。通过这种方式使得模型能捕获每个节点属性和结构之间的依赖关系。对于每个节点,GPT-GNN可以同时计算其属性生成和边生成损失。另外,为了使得GPT-GNN可以处理大图,作者采用了子图采样技术,并提出自适应嵌入队列来缓解负采样带来的不准确损失。

二.预备知识

之前关于图上预训练的工作可以分为两类:

  • network/graph embedding:直接参数化节点嵌入向量,并通过保留一些相似度量来参数化的优化节点嵌入。但该种方式学到的嵌入不能用于初始化其他模型,以便对其他任务进行微调。
  • transfer learning setting:预训练一个可用于处理不同任务的通用GNN。

三.GNN的生成式预训练

3.1 GNN预训练问题

为什么需要预训练?

获取足够的标注数据通常具有挑战性,尤其是对于大图,这阻碍了通用GNN的训练。为此,有必要探索GNN的预训练,它能用很少的标签进行泛化。

GNN预训练的正式定义:GNN预训练的目标是完全基于单个(大规模)图 G = ( V , E , X ) G=(\mathcal{V}, \mathcal{E}, \mathcal{X}) G=(V,E,X) 学习一个通用的GNN模型 f θ f_\theta fθ,而不需要标注数据,这使得 f θ f_\theta fθ对于同一个图或同一领域的图上的各种下游任务是一个良好的初始化。

3.2 生成式预训练框架

作者提出GPT-GNN,它通过重建/生成输入图的结构或属性来预训练GNN。

给定输入图 G = ( V , E , X ) G=(\mathcal{V}, \mathcal{E}, \mathcal{X}) G=(V,E,X),GNN模型 f θ f_\theta fθ,作者用GNN f θ f_\theta fθ建模图上的似然(likelihood)为 p ( G ; θ ) p(G;\theta) p(G;θ),其表示图 G G G中的节点是如何归属(attributed)和连接(connected)的。GPT-GNN旨在预训练GNN来最大化图似然,即 θ ∗ = max θ   p ( G ; θ ) \theta^{*} = \text{max}_{\theta}\ p(G;\theta) θ=maxθ p(G;θ)

3.2.1 如何建模 p ( G ; θ ) p(G;\theta) p(G;θ)

现有的大多数图生成方式采用自回归的方式对概率目标进行因式分解,即按图中的节点顺序来,通过将每个新到达的节点连接到现有节点来生成边。类似地,作者用排列(permutation)向量 π \pi π来确定节点顺序,其中 i π i^{\pi} iπ表示排列 π \pi π中第 i i i个位置的节点id。因此,图分布 p ( G , θ ) p(G,\theta) p(G,θ)等价于所有可能排列的期望的可能性,即:
p ( G ; θ ) = E π [ p θ ( X π , E π ) ] , p(G ; \theta)=\mathbb{E}_\pi\left[p_\theta\left(X^\pi, E^\pi\right)\right], p(G;θ)=Eπ[pθ(Xπ,Eπ)],
其中 X π ∈ R ∣ V ∣ × d X^\pi \in \mathbb{R}|\mathcal{V}| \times d XπRV×d表示排列的节点属性, E E E是边集, E i π E_i^\pi Eiπ表示与 i π i^{\pi} iπ相连的所有边。为了简化,作者假设观察任何节点排列 π \pi π的概率相同。给定一个排列顺序,可以自回归分解log四让,每次迭代生成一个节点:
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}^{|\mathcal{V}|} \log p_\theta\left(X_i, E_i \mid X_{<i}, E_{<i}\right) logpθ(X,E)=i=1Vlogpθ(Xi,EiX<i,E<i)
在每一步 i i i,作者使用 i i i之前的所有生成的节点,以及其对应的属性 X < i X_{<i} X<i、节点间的结构 E < i E_{<i} E<i来生成新的节点 i i i,包括 i i i的属性 X i X_i Xi和与已有节点的连接 E i E_i Ei

3.3 分解属性图生成

对于条件概率 p θ ( X i , E i ∣ X < i , E < i ) p_\theta\left(X_i, E_i \mid X_{<i}, E_{<i}\right) pθ(Xi,EiX<i,E<i) 的建模,一个简单的解决方案是假设 X i X_i Xi E i E_i Ei是独立的,即:
p θ ( X i , E i ∣ X < i , E < i ) = p θ ( X i ∣ X < i , E < i ) ⋅ p θ ( E i ∣ X < i , E < i ) p_\theta\left(X_i, E_i \mid X_{<i}, E_{<i}\right)=p_\theta\left(X_i \mid X_{<i}, E_{<i}\right) \cdot p_\theta\left(E_i \mid X_{<i}, E_{<i}\right) pθ(Xi,EiX<i,E<i)=pθ(XiX<i,E<i)pθ(EiX<i,E<i)
采用该种方式时,对每个节点其属性和连接之间的依赖关系被完全忽略了,但这种忽略的依赖性确是属性图的核心属性,也是GNN中卷积聚合的基础,因此,这种朴素的分解不能为预训练GNN提供指导。

为了解决这一问题,作者提出了依赖感知(dependency-aware)分解机制来进行属性图的生成。具体来说,在估计一个新节点的属性时,其结构信息会被给定,反之亦然,即属性图的生成可以分为两步:

  • 给定观测到的边,生成节点属性;
  • 给定观察到的边和生成的节点属性,生成剩余的边。

通过这种方式,模型可以捕获每个节点的属性和结构之间的依赖关系。

o o o表示 E i E_i Ei中所有观察到的边的索引向量,则 E i , o E_{i,o} Ei,o表示观测到的边。 ¬ o \neg o ¬o表示所有掩去边的索引,即待生成的边。基于此,条件概率可以重写为所有观察到的边的期望可能性:
p θ ( X i , E i ∣ X < i , E < i ) = ∑ o p θ ( X i , E i , ¬ o ∣ E i , o , X < i , E < i ) ⋅ p θ ( E i , o ∣ 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 ) ⏟ 1) generate attributes  ⋅ p θ ( E i , ¬ o ∣ E i , o , X ≤ i , E < i ) ⏟ 2) generate edges  ] . \begin{aligned} & p_\theta\left(X_i, E_i \mid X_{<i}, E_{<i}\right) \\ = & \sum_o p_\theta\left(X_i, E_{i, \neg o} \mid E_{i, o}, X_{<i}, E_{<i}\right) \cdot p_\theta\left(E_{i, o} \mid X_{<i}, E_{<i}\right) \\ = & \mathbb{E}_o\left[p_\theta\left(X_i, E_{i, \neg o} \mid E_{i, o}, X_{<i}, E_{<i}\right)\right] \\ = & \mathbb{E}_o[\underbrace{p_\theta\left(X_i \mid E_{i, o}, X_{<i}, E_{<i}\right)}_{\text {1) generate attributes }} \cdot \underbrace{p_\theta\left(E_{i, \neg o} \mid E_{i, o}, X_{\leq i}, E_{<i}\right)}_{\text {2) generate edges }}] . \end{aligned} ===pθ(Xi,EiX<i,E<i)opθ(Xi,Ei,¬oEi,o,X<i,E<i)pθ(Ei,oX<i,E<i)Eo[pθ(Xi,Ei,¬oEi,o,X<i,E<i)]Eo[1) generate attributes  pθ(XiEi,o,X<i,E<i)2) generate edges  pθ(Ei,¬oEi,o,Xi,E<i)].
其中 p θ ( X i ∣ E i , o , X < i , E < i ) p_\theta\left(X_i \mid E_{i, o}, X_{<i}, E_{<i}\right) pθ(XiEi,o,X<i,E<i)表示节点 i i i的属性生成,基于观测到的边 E i , o E_{i, o} Ei,o,可以聚集目标节点 i i i的邻域信息来生成属性 X i X_i Xi p θ ( E i , ¬ o ∣ E i , o , X ≤ i , E < i ) p_\theta\left(E_{i, \neg o} \mid E_{i, o}, X_{\leq i}, E_{<i}\right) pθ(Ei,¬oEi,o,Xi,E<i)表示生成掩去的边,基于观测到的边 E i , o E_{i, o} Ei,o和生成的属性 X i X_i Xi,可以生成目标节点 i i i的表示,然后预测 E i , ¬ o E_{i, \neg o} Ei,¬o内的每条边是否存在。

3.4 高效的属性和边生成

作者希望同时进行属性生成和边生成,但边的生成需要节点属性作为输入,可以泄露给属性生成。为了避免信息泄露,作者将每个节点设计为两种类型:

  • Attribute Generation Nodes:作者将这些节点的属性掩去,并使用dummy token代替它们的属性,并学得一个共享的向量 X i n i t X^{init} Xinit来表示它。
  • Edge Generation Nodes:对这些节点保持其属性,并将其作为GNN的输入。

作者使用 h A t t r h^{A t t r} hAttr h E d g e h^{E d g e} hEdge来分别表示Attribute Generation和Edge Generation节点,由于Attribute Generation Nodes被掩去, h Attr  h^{\text {Attr }} hAttr  h E d g e h^{E d g e} hEdge包含更少的信息。因此,在进行GNN的消息传递的时候,仅使用Edge Generation Nodes的输出 h E d g e h^{E d g e} hEdge作为对外信息。然后,使用这两组节点的表示来生成具有不同解码器的属性和边。

对于属性生成,将其对应解码器表示为 Dec A t t r ( ⋅ ) \text{Dec}^{Attr}(\cdot) DecAttr(),它以 h Attr  h^{\text {Attr }} hAttr 作为输入,生成被掩去的属性。建模的选择取决于属性的类型。例如如果一个节点的输入属性是文本,则使用文本生成器模型(例如,LSTM)来生成它。此外,作者定义距离函数来作为生成属性和真实值间的度量,即属性生成损失定义为:
L i Attr  =  Distance  (  Dec  Attr  ( h i Attr  ) , X i ) . \mathcal{L}_i^{\text {Attr }}=\text { Distance }\left(\text { Dec }^{\text {Attr }}\left(h_i^{\text {Attr }}\right), X_i\right) . LiAttr = Distance ( Dec Attr (hiAttr ),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\left(E_{i, \neg o} \mid E_{i, o}, X_{\leq i}, E_{<i}\right)=\prod_{j^{+} \in E_{i, \neg o}} p_\theta\left(j^{+} \mid E_{i, o}, X_{\leq i}, E_{<i}\right) . pθ(Ei,¬oEi,o,Xi,E<i)=j+Ei,¬opθ(j+Ei,o,Xi,E<i).
在获取到Edge Generation node表示 h E d g e h^{E d g e} hEdge后,可以通过 Dec ⁡ E d g e ( h i E d g e , h j E d g e ) \operatorname{Dec}^{E d g e}\left(h_i^{E d g e}, h_j^{E d g e}\right) DecEdge(hiEdge,hjEdge)来建模节点 i i i与节点 j j j连接的可能性,其中 D e c E d g e Dec^{E d g e} DecEdge表示成对(pairwise)得分函数。最后,采用负对比估计(negative contrastive estimation)来计算每个链接节点 j + j^{+} j+的似然。作者将为连接的节点表示为 S i − S_i^{-} Si,对比损失计算公式如下:
L i E d g e = − ∑ j + ∈ E i , ¬ o log ⁡ exp ⁡ ( Dec ⁡ E d g e ( h i E d g e , h j + E d g e ) ) ∑ j ∈ S i − ∪ { j + } exp ⁡ ( Dec ⁡ E d g e ( h i E d g e , h j E d g e ) ) \mathcal{L}_i^{E d g e}=-\sum_{j^{+} \in E_{i, \neg o}} \log \frac{\exp \left(\operatorname{Dec}^{E d g e}\left(h_i^{E d g e}, h_{j^{+}}^{E d g e}\right)\right)}{\sum_{j \in S_i^{-} \cup\left\{j^{+}\right\}} \exp \left(\operatorname{Dec}^{E d g e}\left(h_i^{E d g e}, h_j^{E d g e}\right)\right)} LiEdge=j+Ei,¬ologjSi{j+}exp(DecEdge(hiEdge,hjEdge))exp(DecEdge(hiEdge,hj+Edge))
下图便展示了属性图生成的过程:

  • 确定输入图的节点排列顺序;
  • 随机选取目标节点边的一部分作为观测边 E i , o E_{i,o} Ei,o,剩下的边掩去作为 E i , ¬ o E_{i, \neg o} Ei,¬o,需要将被掩去的边从图中删除。
  • 将节点划分为Attribute Generation和Edge Generation节点。
  • 使用修改的邻接矩阵来计算节点3、4和5的表示,包括它们的Attribute和Edge Generation节点。
  • 通过每个节点的属性预测和掩去边预测任务并行训练GNN模型。

在这里插入图片描述

3.5 扩展到异配和大图

本节主要介绍如何在大图和异配图上应用GPT-GNN进行预训练。

异配图:对于异配图,所提出的GPT-GNN框架可以直接应用于预训练异构GNN。唯一的区别是每种类型的节点和边都可以有自己的解码器,这是由异构gnn指定的,而不是预训练框架。所有其他组件保持完全相同。

大图:对于大图,则需要使用子图采样进行训练。为了估计GPT-GNN提出的对比损失,需要遍历输入图的所有节点。然而,只能访问子图中的采样节点来估计这个损失,使得(自)监督只关注局部信号。为了缓解这个问题,作者提出了自适应队列(Adaptive Queue),它将之前采样的子图中的节点表示存储为负样本。每次处理一个新的子图,可以通过添加最新的节点表示并删除最旧的节点表示来逐步更新这个队列。自适应队列可以使用更大的负样本池 S i − S_i^{-} Si,此外,不同采样子图上的节点可以为对比学习带来全局结构指导。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/883266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第三阶段】kotlin中使用带let的安全调用

let常常和&#xff1f;.配合使用&#xff0c;如果前面的对象为null,let不执行&#xff0c;能够执行到let里面 对象一定不为null 1.不为null fun main() {var name:String?"kotlin" //name是一个可空类型&#xff0c;发出广播&#xff0c;调用的地方必须补救措施var…

WSL2 Ubuntu子系统安装cuda+cudnn+torch

文章目录 前言一、安装cudncudnn安装pytorch 前言 确保Windows系统版本高于windows10 21H2或Windows11&#xff0c;然后在Windows中将显卡驱动升级到最新即可&#xff0c;WSL2已支持对显卡的直接调用。 一、安装cudncudnn 配置cuda环境&#xff0c;WSL下的Ubuntu子系统的cu…

炬芯科技低延迟高音质无线麦克风解决方案

随着互联网技术的高速发展&#xff0c;诸多新兴产业被带动起来。就近十年来看&#xff0c;内容平台以及其载体在不断演变&#xff0c;从自媒体到短视频以及直播&#xff0c;一点一滴地渗透进大众生活。而这些平台的兴起&#xff0c;亦为普罗大众提供了广阔的分享空间&#xff0…

六十四卦-整体

前言&#xff1a;整理一下学习的卦&#xff0c;从整体上更好地了解六十四卦。 目录 八纯卦 难卦 消息卦 最吉的卦 六爻皆正位的卦 六爻皆不正位的卦 爻辞中含有“利涉大川”的卦 八纯卦 乾三连&#xff0c;坤六断&#xff0c;震仰盂&#xff0c;艮覆碗&#xff0c;离…

【免费分享 图书】《阿里云天池大赛赛题解析——机器学习篇》-PDF电子书-百度云...

找这本书的资源简直要把我找吐了&#xff0c;各种网站压缩包一下下来就开始各种套路(比如要你充钱) 为了防止还有我这样的受害者&#xff0c;这就把找到的PDF给大家分享一下。 链接在文章最后 如果这篇文章能够帮到您&#xff0c;麻烦帮我点个赞&#xff0c;并关注一下我&…

【uniapp】中 微信小程序实现echarts图表组件的封装

插件地址&#xff1a;echarts-for-uniapp - DCloud 插件市场 图例&#xff1a; 一、uniapp 安装 npm i uniapp-echarts --save 二、文件夹操作 将 node_modules 下的 uniapp-echarts 文件夹复制到 components 文件夹下 当前不操作此步骤的话&#xff0c;运行 -> 运行到小…

动手学深度学习—卷积神经网络LeNet(代码详解)

1. LeNet LeNet由两个部分组成&#xff1a; 卷积编码器&#xff1a;由两个卷积层组成&#xff1b;全连接层密集块&#xff1a;由三个全连接层组成。 每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均汇聚层&#xff1b;每个卷积层使用55卷积核和一个sigmoid激…

基于libevent的tcp服务器

libevent使用教程_evutil_make_socket_nonblocking_易方达蓝筹的博客-CSDN博客 一、准备 centos7下安装libevent库 yum install libevent yum install -y libevent-devel 二、代码 server.cpp /** You need libevent2 to compile this piece of code Please see: http://li…

分类预测 | MATLAB实现MTBO-CNN多输入分类预测

分类预测 | MATLAB实现MTBO-CNN多输入分类预测 目录 分类预测 | MATLAB实现MTBO-CNN多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现MTBO-CNN多输入分类预测 2.代码说明&#xff1a;基于登山队优化算法&#xff08;MTBO&#xff09;、卷积神经…

android 12系统加上TTS引擎

系统层修改&#xff1a; 1.frameworks/base/packages/SettingsProvider/res/values/defaults.xml <string name"def_tts"></string> 2.frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java loadString…

​五金件机器视觉定位​并获取外观轮廓软硬件视觉方案

【检测目的】 五金件机器视觉定位&#xff0c;视觉检测五金件轮廓并矫正五金件位置进行涂油 【客户要求】 FOV:540*400mm 【拍摄与处理效图一】 【拍摄与处理效图二】 【实验原理及说明】 【方案评估】 根据目前的图像和处理结果来看&#xff0c;可以检测出产品轮廓并进行位置…

Unity小项目__小球吃零食

// Player脚本文件源代码 public class Player : MonoBehaviour {public Rigidbody rd; // 定义了一个刚体组件public int score 0; // 定义了一个计分器public Text scoreText; // 定义了一个文本组件public GameObject winText; // 定义了一个游戏物体用于检验游戏结束// S…

征战2023跨境旺季,独立站如何实现新增长?

2023年出海赛道万象更新&#xff0c;行业重回正轨&#xff0c;跨境行业在经历过多轮洗牌过后&#xff0c;中国企业在全球化产业链中表现出了更强大的增长韧性。而随着跨境模式与消费需求的多样化与精细化。单一渠道的出海布局已经不能满足企业实现品牌出海的转型需求。 DTC独立…

前端工具的选择

目录 前端常见开发者工具 浏览器 开发者工具 VScode开发者工具快捷键 前端常见开发者工具 浏览器 浏览器是我们最重要的合作伙伴 关于浏览器的选择&#xff0c;我目前主要用主要是谷歌浏览器&#xff0c;我个人觉得谷歌浏览器使用起来比较方便、简洁&#xff0c;没有太多…

【TypeScript】tsc -v 报错 —— 在此系统上禁止运行脚本

在 VS Code 终端中执行 tsc -v &#xff0c;报错 —— 在此系统上禁止运行脚本 然后 windows x &#xff0c;打开终端管理员&#xff0c;出现同样的问题 解决方法&#xff1a; 终端&#xff08;管理员&#xff09;执行以下命令&#xff1a; 出现 RemoteSigned 则代表更改成功…

Flask-SQLAlchemy

认识Flask-SQLAlchemy Flask-SQLAlchemy 是一个为 Flask 应用增加 SQLAlchemy 支持的扩展。它致力于简化在 Flask 中 SQLAlchemy 的使用。SQLAlchemy 是目前python中最强大的 ORM框架, 功能全面, 使用简单。 ORM优缺点 优点 有语法提示, 省去自己拼写SQL&#xff0c;保证SQL…

誉天HCIP-Datacom课程简介

HCIP-Datacom课程介绍&#xff1a;HCIP-Datacom分为一个核心技术方向&#xff1a;HCIP-Datacom-Core Technology H12-821 &#xff08;核心技术&#xff09;六个可选子方向&#xff1a;HCIP-Datacom-Advanced Routing & Switching Technology H12-831 &#xff08;高级路…

ubuntu设置共享文件夹成功后却不显示找不到(已解决)

1.首先输下面命令查看是否真的设置成功共享文件夹 vmware-hgfsclient如果确实已经设置过共享文件夹将输出window下共享文件夹名字 2.确认自己已设置共享文件夹后输入下面的命令 //如果之前没有命令包则先执行sudo apt-get install open-vm-tools sudo vmhgfs-fuse .host:/ /mn…

Ubuntu18.04.4裸机配置

下载虚拟机Ubuntu18.04.4 链接&#xff1a;https://pan.baidu.com/s/1jyucyUSXa9-Fw9ctuU87hA 提取码&#xff1a;o42a –来自百度网盘超级会员V5的分享 VMware选择镜像安装 设置你的用户名&#xff0c;就像windows上登录用户一样简单 下一步……下一步……如此简单 下载…

《Effects of Graph Convolutions in Multi-layer Networks》阅读笔记

一.文章概述 本文研究了在XOR-CSBM数据模型的多层网络的第一层以上时&#xff0c;图卷积能力的基本极限&#xff0c;并为它们在数据中信号的不同状态下的性能提供了理论保证。在合成数据和真实世界数据上的实验表明a.卷积的数量是决定网络性能的一个更重要的因素&#xff0c;而…