GCC笔记

简介

Graph Contrastive Coding (GCC) 是一个通过 对比学习 来进行 图神经网络(GNN)预训练 的方法,旨在捕捉跨多个图的通用结构模式。该框架解决了传统的图表示学习模型通常只针对特定领域的图数据进行训练,并且不能有效迁移到其他领域图数据的问题。

框架

  • 预训练任务:GCC 的预训练任务被设计为 子图实例区分(subgraph instance discrimination),也就是说,模型通过区分图中不同节点的局部结构来学习图的表示。具体来说,对于每个节点,模型从其多跳的 自我网络(ego network) 中采样子图,并学习区分这些子图。
  • 对比学习:GCC 使用 对比学习 来训练模型,具体地,模型需要区分来自同一节点的子图(即相似实例)和来自不同节点的子图(即不相似实例)。使用 InfoNCE 损失函数 来优化模型,使其能够将相似的子图嵌入向量映射得更接近,不相似的子图映射得更远。
  • 图编码器:GCC 使用 图同构网络(GIN) 作为图编码器,将子图映射到低维的潜在表示空间中。

具体涉及到的技术细节

  • 子图实例如何定义:在图数据中,子图是合适的实例。每个节点的 r-ego 网络(即距离该节点 r 步内的邻居节点构成的子图)被定义为一个实例。
  • 如何定义相似和不相似的实例:通过数据增强(例如随机图采样),GCC 认为从同一个节点采样的子图是相似的,而来自不同节点的子图是不相似的。
  • 图编码器的选择:GCC 使用 GIN 作为图编码器,将子图映射到低维向量。GCC 通过对比学习来训练图编码器,学习如何从图的结构中提取通用的表示。

这里放上一个示例图:

可以看出,通过数据增强生成来自同一节点的两个不同版本的子图实例被认为是相似的,那么自然来自不同节点(来自同一数据集中不同节点或不同数据集的节点)的子图实例就是不同的,这一步到这里就够了,下一步就是把子图实例投入编码器中进行embedding,这时候就进行对比学习,要保证学到相似的实例对应的embedding也是相似的

预训练与微调

  • 预训练:GCC 在多种图数据集(如 Facebook、IMDB、DBLP)上进行预训练,学习不同图的通用结构表示。预训练过程中,模型学习到图的通用结构模式,这些模式可以迁移到其他图上。
  • 微调:在预训练之后,模型可以针对具体的下游任务进行微调,如 节点分类、图分类 和 相似度搜索。微调可以有两种方式:
    • 冻结模式(Freezing Mode):冻结预训练的编码器,仅训练任务特定的分类器。
    • 全微调模式(Full Fine-Tuning Mode):不仅微调分类器,还微调预训练的编码器,使其适应目标任务。

实验与结果(GPT复制,详情看论文)

  • 节点分类:GCC 在 US-Airport 和 H-index 数据集上进行节点分类任务,结果表明,GCC 的表现优于从零开始训练的专用模型。
  • 图分类:在图分类任务中,GCC 也表现得不错,通常比只针对特定图训练的模型效果更好。
  • 相似度搜索:在 Top-k 相似度搜索 任务中,GCC 与专门训练的模型相比也表现得很有竞争力。
  • 消融实验:通过消融实验,验证了预训练对模型表现的提升作用,并且对比了不同的对比损失机制(E2E 和 MoCo),发现 MoCo 在训练时更具经济性,并且可以有效扩展。

结论及其主要贡献

GCC 框架 展示了通过预训练学习到的通用图结构表示能够迁移到不同的图数据集和下游任务中。与从零开始训练的专用图学习模型相比,GCC 在多个图学习任务上实现了竞争甚至更好的表现,证明了图的结构模式具有普适性并且可以迁移。

主要贡献:

  • 图神经网络预训练问题的形式化:定义了跨多个图进行 GNN 预训练的挑战,并提出了解决方案。
  • 预训练任务设计:提出了子图实例区分任务,捕捉来自多个图的通用结构模式。
  • GCC 框架:提出了基于对比学习的图神经网络预训练框架。
  • 实验验证:通过实验表明,GCC 在多个图学习任务中表现优异,尤其在跨域任务中具有显著优势。
相关推荐
海南java第二人1 分钟前
SpringBoot启动流程深度解析:从入口到容器就绪的完整机制
java·开发语言
星火开发设计5 分钟前
C++ queue 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识·队列
DICOM医学影像13 分钟前
2. go语言从零实现以太坊客户端-查询区块链账户余额
开发语言·golang·区块链·以太坊·web3.0·hardhat
Data_agent24 分钟前
Python 编程实战:函数与模块化编程及内置模块探索
开发语言·python
new_zhou24 分钟前
vs2019+qt工程中生成dump文件及调试
开发语言·qt·visual studio·dump调试
栈与堆1 小时前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
一路向北·重庆分伦1 小时前
03-01:MQ常见问题梳理
java·开发语言
txinyu的博客1 小时前
结合游戏场景理解,互斥锁,读写锁,自旋锁,CAS / 原子变量,分段锁
开发语言·c++·游戏
阿里嘎多学长1 小时前
2026-01-11 GitHub 热点项目精选
开发语言·程序员·github·代码托管
yuanyikangkang1 小时前
STM32 lin控制盒
开发语言