当前位置: 首页 > news >正文

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks

KDD22

推荐指数:#paper/⭐⭐#​

动机

本文探讨了图神经网络(GNN)在迁移学习中“预训练-微调”框架的局限性及改进方向。现有方法通过预训练(如边预测、对比学习)学习可迁移的图结构知识,在微调时将其应用于下游任务(如节点分类)。然而,预训练目标与下游任务之间的差异(如二元边预测与多类节点分类)导致知识传递低效甚至负迁移——微调效果可能逊于从头训练。传统改进方案依赖为每个下游任务定制预训练目标(目标工程),但需大量领域知识与试错成本。

受自然语言处理(NLP)中提示(Prompt)技术的启发,作者提出“预训练-提示-微调”新范式,旨在通过任务重表述缩小预训练与下游任务差异。例如,NLP通过添加语义模板将分类任务转化为与预训练一致的填空任务(如情感分类转为预测掩码词)。然而,图数据面临两大挑战:

  1. 符号化图数据适配难题:节点为抽象符号,无法直接套用基于文本模板的语义改写。
  2. 提示设计的有效性:需结合图结构(如节点邻域信息)设计高效的提示函数,以提升分类等任务精度。

因此,本文核心研究问题聚焦于如何设计图感知提示函数,以桥接预训练与下游任务,从而高效激发预训练模型的知识。该方向有望通过任务形式统一化提升预训练模型的泛用性,减少对定制化目标工程的依赖,推动少样本图分析的进一步发展。

image

图提示框架

Pre-train, Prompt, Fine-tune

Graph prompting function(图提示函数)

v i ′ = f p r o m p t ( v i ) v_{i}^{\prime}=f_{\mathrm{prompt}}(v_{i}) vi=fprompt(vi), v i ′ v_i' vi和映射头有相似的输入形状

Pairwise prompting function(成对提示函数)

v i ′ = f p r o m p t ( v i ) = [ T t a s k ( y ) , T s r t ( v i ) ] v_{i}^{\prime}=f_{\mathrm{prompt}}(v_{i})=[T_{\mathbf{task}}(y),T_{\mathbf{srt}}( v_{i})] vi=fprompt(vi)=[Ttask(y),Tsrt(vi)]

T t a s k T_{task} Ttask是下有任务的token, T s r c T_{src} Tsrc是目标节点结构的token。前者由待分类节点的标签得到,后者由目标节点周围子图表示,以提供更多的结构信息。很自然,可以利用函数来捕获他们两个的联系

Prompt addition

[ y 1 , ⋯ , y C ] [y_1,\cdots,y_C] [y1,,yC]为C个类的prompt。自然可以构造token对: [ T t a s k ( y c ) , T s r t ( v i ) ] , f o r c = 1 , ⋯ , C [T_{\mathrm{task}}(y_{c}),T_{\mathrm{srt}}(v_{i})],\mathrm{for~}c=1,\cdots,C [Ttask(yc),Tsrt(vi)],for c=1,,C

Prompt answer

对于每个token对,我们可以拼接,并将其放入预训练的映射头,如果目标节点 v i v_i vi 与某类得到最高的链接概率,我们就将其归为一类。

prompt tuning:

min ⁡ θ , ϕ ∑ ( v i , y c ) L p r e ( p ϕ p r e ( T t a s k ( y c ) , T s r t ( v i ) ) ; g ( y c , v i ) ) . \min_{\theta,\phi}\sum_{(v_i,y_c)}\mathcal{L}^{\mathrm{pre}}(p_\phi^{\mathrm{pre}}(T_{\mathrm{task}}(y_c),T_{\mathrm{srt}}(v_i));g(y_c,v_i)). minθ,ϕ(vi,yc)Lpre(pϕpre(Ttask(yc),Tsrt(vi));g(yc,vi)).其中,g为真实的标签函数

图形提示功能设计

任务token的生成:

e c = T t a s k ( y c ) ∈ R d e_c=T_\mathrm{task}(y_c)\in\mathbb{R}^d ec=Ttask(yc)Rd

E = [ e 1 , ⋯ , e C ] ⊤ ∈ R C × d E=[e_{1},\cdots,e_{C}]^{\top}\in\mathbb{R}^{C\times d} E=[e1,,eC]RC×d,C是类别数。

很自然,每个节点的token可以通过查询如上的任务token得到自己的类别。很自然的是, T t a s k ( y c ) T_{\mathbf{task}}(y_c) Ttask(yc)最优应该是类 y c y_c yc的中心。因此,我们通过聚类,来获得初始的tasktoken:

  1. 利用可扩展聚类(比如metis)获得M个类: { G 1 , ⋯ , G M } \{\mathcal{G}_1,\cdots,\mathcal{G}_M\} {G1,,GM},M是类别超参。
  2. 对于每个类,我们得到相应的task token: E m = [ e 1 m , ⋯ , e C m ] ⊤ ∈ R C × d E^m=[e_1^m,\cdots,e_C^m]^\top\in\mathbb{R}^{C\times d} Em=[e1m,,eCm]RC×d(怎么感觉有问题这一行表述)
  3. 给定集群 处节点 v i v_i vi 的任务令牌 T t a s k ( y c ) T_{task}(y_c) Ttask(yc) ,它使用向量嵌入 e c m e_c^m ecm 表示。
Structure Token Generation.(结构token的升成)

如果直接用节点v用于下游分类,会失去结构信息。因此我们使用 T s t r ( v i ) T_{\mathrm{str}}(v_i) Tstr(vi)来表示子图结构,来涵盖结构信息。在本文中,作者使用一阶子图来表示。

e v i = a i ∗ h i + ∑ v j ∈ N ( v i ) a j ∗ h j . e_{v_i}=a_i*h_i+\sum_{v_j\in\mathcal{N}(v_i)}a_j*h_j. evi=aihi+vjN(vi)ajhj.

a通过注意力机制得到

Prompt 初始化以及正交约束:

直接使用随机初始化肯定不太好,因此我们使用预训练的GNN来初始化 E m = [ e 1 m , ⋯ , e C m ] ⊤ E^{m}=[e_{1}^{m},\cdots,e_{C}^{m}]^{\top} Em=[e1m,,eCm]

因此,我们通过节点表示来初始化标记嵌入 e c m e^m_c ecm,节点表示由集群 m 处 y c y_c yc类的训练节点给出。

不同类的中心的距离应该尽可能的打,因此有: L o = ∑ m ∥ E m ( E m ) ⊤ − I ∥ F 2 . \mathcal{L}_o=\sum_m\|E^m(E^m)^\top-I\|_F^2. Lo=mEm(Em)IF2.

损失:

min ⁡ θ , ϕ , E 1 , ⋯ , E M ∑ ( v i , y c ) L p r e ( p ϕ p r e ( e c m , e v i ) ; g ( y c , v i ) ) + λ L o , s . t . θ i n i t = θ p r e , ϕ i n i t = ϕ p r e . \begin{aligned}\min_{\theta,\phi,E^{1},\cdots,E^{M}}&\sum_{(v_{i},y_{c})}\mathcal{L}^{\mathrm{pre}}(p_{\phi}^{\mathrm{pre}}(e_{c}^{m},e_{v_{i}});g(y_{c},v_{i}))+\lambda\mathcal{L}_{o},\\\mathrm{s.t.}&\theta^{\mathrm{init}}=\theta^{\mathrm{pre}},\phi^{\mathrm{init}}=\phi^{\mathrm{pre}}.\end{aligned} θ,ϕ,E1,,EMmins.t.(vi,yc)Lpre(pϕpre(ecm,evi);g(yc,vi))+λLo,θinit=θpre,ϕinit=ϕpre.

结果:

image

image

相关文章:

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks KDD22 推荐指数:#paper/⭐⭐#​ 动机 本文探讨了图神经网络(GNN)在迁移学习中“预训练-微调”框架的局限性及改进方向。现有方法通过预训练&#xff08…...

【SegRNN 源码理解】PMF的多步并行预测

位置编码 elif self.dec_way "pmf":if self.channel_id:# m,d//2 -> 1,m,d//2 -> c,m,d//2# c,d//2 -> c,1,d//2 -> c,m,d//2# c,m,d -> cm,1,d -> bcm, 1, dpos_emb torch.cat([self.pos_emb.unsqueeze(0).repeat(self.enc_in, 1, 1),self.cha…...

构建自己的AI客服【根据用户输入生成EL表达式】

要实现一个基于对话形式的AI客服系统,该系统能够提示用户输入必要的信息,并根据用户的输入生成相应的EL(Expression Language)表达式编排规则,您可以按照以下步骤进行设计和开发。本文将涵盖系统架构设计、关键技术选型…...

(50)[HGAME 2023 week2]before_main

[HGAME 2023 week2]before_main nss:3501 我们进入那个sub_12EB然后我们发现这个就是base64加密 我们取得qword_4020: 0CxWsOemvJq4zdk2V6QlArj9wnHbt1NfEX/3DhyPoBRLY8pK5FciZau7UMIgTSG 很显然这个是自定义映射base64.然后我们代入我们之前写的base64自定义映射代码 enc:A…...

机器学习数学基础:39.样本和隐含和残差协方差矩阵

假设我们研究学生的数学成绩、英语成绩和学习时间之间的关系。收集了100名学生这三项数据作为样本。 样本协方差矩阵 计算得到的样本协方差矩阵如下(假设数据简化): [ V a r ( 数学 ) C o v ( 数学 , 英语 ) C o v ( 数学 , 学习时间 ) C …...

java之http传MultipartFile文件

【需求】前端请求后端做文件上传或者excel上传,后端不解析直接把MultipartFile传给第三方平台,通过http的方式该怎么写 import org.springframework.web.multipart.MultipartFile;import java.io.*; import java.net.HttpURLConnection; import java.ne…...

深入解析SpringMVC中Http响应的实现机制

在Web应用开发中,处理HTTP请求并返回相应的HTTP响应是核心任务之一。SpringMVC作为Java生态中广泛使用的Web框架,提供了灵活且强大的机制来处理HTTP请求和生成HTTP响应。本文将深入探讨SpringMVC中如何实现HTTP响应的返回,涵盖从控制器方法的…...

构建一个支持精度、范围和负数的-Vue-数字输入框

分析并实现一个支持精度、范围和负数控制的数字输入框。 背景 在很多业务中,我们经常需要使用数字输入框,通常这些输入框会涉及到数字校验,比如限制输入范围、设置小数精度、是否允许负数等。每次写表单时,都需要重复定义这些校…...

尚硅谷爬虫note14

一、scrapy scrapy:为爬取网站数据是,提取结构性数据而编写的应用框架 1. 安装 pip install scrapy 或者,国内源安装 pip install scrapy -i https://pypi.douban.com/simple 2. 报错 报错1)building ‘twisted.te…...

1438. 绝对差不超过限制的最长连续子数组

目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题2.4 代码复盘 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 滑动窗口 2.2 代码尝试 class Solution { public:int longestSubarray(vector<int>& nums, int limit) {int cou…...

ZCC5090EA适用于TYPE-C接口,集成30V OVP功能, 最大1.5A充电电流,带NTC及使能功能,双节锂电升压充电芯片替代CS5090EA

概要&#xff1a; ZCC5090EA是一款5V输入&#xff0c;最大1.5A充电电流&#xff0c;支 持双 节 锂 电 池 串 联 应 用 的 升 压 充 电 管 理 I C 。ZCC5090EA集成功率MOS&#xff0c;采用异步开关架构&#xff0c; 使其在应用时仅需极少的外围器件&#xff0c;可有效减少整体 …...

Dify 开源大语言模型应用开发平台使用(二)

文章目录 说明Dify 使用报告1. 应用创建——专业的锂电池相关知识解答1.1 平台简介1.2 创建应用 2. 知识库、工作流、变量、节点与编排节点详解2.1 知识库管理2.2 工作流配置2.3 变量管理2.4 节点与编排节点 3. 测试和调试3.1 单元测试3.2 日志与监控3.3 实时调试3.4 性能测试 …...

【LangFuse】数据集与测试

1. 在线标注 2. 上传已有数据集 import json# 调整数据格式 {"input":{...},"expected_output":"label"} data [] with open(my_annotations.jsonl, r, encodingutf-8) as fp:for line in fp:example json.loads(line.strip())item {"i…...

【Python】如何解决Jupyter Notebook修改外部模块后必须重启内核的问题?

“为什么我修改了Python模块的代码&#xff0c;Jupyter Notebook却看不到变化&#xff1f;” 一、问题现象&#xff1a;令人抓狂的开发体验 假设你正在开发一个图像处理项目&#xff0c;项目结构如下&#xff1a; project/ ├── utils/ │ └── image_processor.py └…...

Redis 篇

一、数据结构 二、持久化方式 Redis 提供了两种主要的持久化方式&#xff0c;分别是 RDB&#xff08;Redis Database&#xff09;和 AOF&#xff08;Append Only File&#xff09;&#xff0c;此外&#xff0c;还可以同时使用这两种方式以增强数据安全性&#xff0c;以下为你…...

React + TypeScript 实战指南:用类型守护你的组件

TypeScript 为 React 开发带来了强大的类型安全保障&#xff0c;这里解析常见的一些TS写法&#xff1a; 一、组件基础类型 1. 函数组件定义 // 显式声明 Props 类型并标注返回值 interface WelcomeProps {name: string;age?: number; // 可选属性 }const Welcome: React.FC…...

从零开始:Linux环境下如何制作静态库与动态库

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言 动静态库是编程中两种主要的库类型&#xff0c;它们用于帮助开发者复用已有的代码&#xff0c;而不需要每次都从头开始编写。它们的主要区别在于链接和加载的时机、方式以及使用场景 库 库就是一些已经写好并且经过测试…...

【智能体Agent】ReAct智能体的实现思路和关键技术

基于ReAct&#xff08;Reasoning Acting&#xff09;框架的自主智能体 import re from typing import List, Tuplefrom langchain_community.chat_message_histories.in_memory import ChatMessageHistory from langchain_core.language_models.chat_models import BaseChatM…...

Java进阶:Zookeeper相关笔记

概要总结&#xff1a; ●Zookeeper是一个开源的分布式协调服务&#xff0c;需要下载并部署在服务器上(使用cmd启动&#xff0c;windows与linux都可用)。 ●zookeeper一般用来实现诸如数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列等功能。 ●有多台服…...

QT-绘画事件

实现颜色的随时调整&#xff0c;追加橡皮擦功能 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QColor> #include <QPoint> #include <QVector> #include <QMouseEvent> #include <QPainter> #include <Q…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...