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 在多个图学习任务中表现优异,尤其在跨域任务中具有显著优势。
相关推荐
酌量11 分钟前
从 ROS 订阅视频话题到本地可视化与 RTMP 推流全流程实战
经验分享·笔记·ffmpeg·音视频·ros
科比不来it14 分钟前
Go语言数据竞争Data Race 问题怎么检测?怎么解决?
开发语言·c++·golang
biter down17 分钟前
c语言14:字符指针
c语言·开发语言
光军oi31 分钟前
JAVA全栈JVM篇————初识JVM
java·开发语言·jvm
Moniane1 小时前
C++深度解析:从核心特性到现代编程实践
java·开发语言·jvm
uxiang_blog1 小时前
C++进阶:重载类型转换
linux·开发语言·c++
爱编程的鱼1 小时前
C# 参数详解:从基础传参到高级应用
开发语言·microsoft·c#
Michael_lcf1 小时前
Java的UDP通信:DatagramSocket和DatagramPacket
java·开发语言·udp
道之极万物灭1 小时前
Python操作word实战
开发语言·python·word
摇滚侠1 小时前
Spring Boot 3零基础教程,WEB 开发 HttpMessageConverter @ResponseBody 注解实现内容协商源码分析 笔记33
java·spring boot·笔记