图表示学习中的Transformer:Graphormer的突破

人工智能咨询培训老师叶梓 转载标明出处

在自然语言处理和计算机视觉等领域,Transformer架构已经成为主导选择。然而,在图级别的预测任务中,它的表现并不如主流的图神经网络(GNN)变体。这一现象引发了一个思考:Transformer是否适合图表示学习,以及如何使其在图表示学习中发挥作用。来自大连理工大学、普林斯顿大学、北京大学和微软亚洲研究院的研究人员共同提出了一种名为Graphormer的新型架构,该架构基于标准的Transformer架构,并在多个图表示学习任务上取得了优异的结果。

Graphormer的核心观点是,要有效地利用Transformer进行图表示学习,关键在于如何有效地将图的结构信息编码到模型中。为此提出了几种简单但有效的结构编码方法,帮助Graphormer更好地模拟图结构数据。

方法

图1为Graphormer模型中的三种关键结构编码方法:中心性编码、空间编码和边编码的视觉表示。这些编码方式共同作用,使得Graphormer能够有效地利用图数据的结构信息。

中心性编码

中心性编码是Graphormer的一个关键特性,它通过考虑节点的入度和出度来捕捉节点在图中的重要性。这种编码方式允许模型在计算注意力时同时考虑节点的语义相关性和节点的重要性。如图1所示,中心性编码可以被视为节点特征的直接扩展。

其中,是可学习的嵌入向量,分别由节点的入度和出度决定。这种编码方式使得模型能够更好地理解图中节点的重要性。

空间编码

空间编码利用了Transformer的全局接受域优势,通过定义一个函数φ来衡量节点对之间的空间关系。这个函数基于节点之间的最短路径距离,为自注意力模块提供了一个可学习的偏置项。

这种编码方式允许模型根据图的结构信息自适应地调整注意力分布,从而更好地捕捉图中的空间依赖性。

边编码

边编码是Graphormer的另一个创新点,它通过考虑连接节点对的边的特征来增强注意力机制。这种方法通过计算边特征和可学习嵌入的点积的平均值,将边特征作为注意力模块的偏置项纳入模型。

其中,c_ij​ 是通过边特征和可学习嵌入的点积的平均值计算得到的,这使得模型能够更全面地利用边信息。

Graphormer层是基于经典的Transformer编码器实现的,它在多头自注意力(MHA)和前馈块(FFN)之前应用层归一化(LN),而不是之后。这种修改已被证明可以更有效地优化模型。

Graphormer引入了一个特殊节点[VNode],它与图中的每个节点单独连接,使得模型能够更好地捕捉整个图的全局信息。

Graphormer不仅能够表示流行的GNN模型(如GIN、GCN、GraphSAGE)中的AGGREGATE和COMBINE步骤,而且通过使用空间编码,Graphormer能够超越经典的信息传递GNNs,其表达能力不亚于1-Weisfeiler-Lehman (WL)测试。

另外Graphormer还发现使用自注意力和虚拟节点启发式之间存在有趣的联系。自注意力能够自然地完成图级别的聚合和传播操作,而无需额外的编码,这使得Graphormer在不遇到过度平滑问题的情况下,实现了可扩展的改进。

想要掌握如何将大模型的力量发挥到极致吗?叶老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具。实战专家1小时讲解让您轻松上手,学习如何使用 Llama Factory 微调模型。

评论留言“参加”或扫描微信备注“参加”,即可参加线上直播分享,叶老师亲自指导,互动沟通,全面掌握Llama Factory。关注享粉丝福利,限时免费录播讲解。

实验

首先在OGB-LSC(Open Graph Benchmark Large-Scale Challenge)上进行了实验,这是目前最大的图级别预测数据集,包含超过3.8M个图。还在OGB和benchmarking-GNN的其他三个流行任务上报告了结果。

实验设置:

模型大小:报告了两种模型大小的结果,Graphormer(L = 12, d = 768)和较小的GraphormerSMALL(L = 6, d = 512)。

优化器:使用AdamW,设置超参数ϵ为1e-8,(β1, β2)为(0.99, 0.999)。

学习率调度:峰值学习率设置为2e-4(GraphormerSMALL为3e-4),预热阶段为60,000步,之后采用线性衰减学习率调度器。

总训练步数:1M步。

批处理大小:1024。

训练硬件:所有模型在8个NVIDIA V100 GPU上训练了大约2天。

表1展示了在PCQM4M-LSC数据集上的性能比较。GIN-VN在验证MAE上达到了0.1395的最佳状态。报告了GT模型的结果,通过增大隐藏维度到768(称为GT-Wide),参数总数达到83.2M,但未超过GIN-VN和DeeperGCN-VN的性能。

Graphormer在与之前最佳GNN架构相比,显著超越GIN-VN,例如,在验证MAE上降低了11.5%。使用ExpC集成后,Graphormer在完整测试集上达到了0.1200的MAE,并在OGB大规模挑战中赢得了图级别赛道的第一名。

进一步研究了Graphormer在OGB(OGBG-MolPCBA, OGBG-MolHIV)和benchmarking-GNN(ZINC)上的图级别预测任务的性能。由于OGB鼓励预训练,主要探索了在PCQM4M-LSC上预训练的Graphormer模型的迁移能力。

表2、表3和表4总结了Graphormer与其他GNN在MolHIV、MolPCBA和ZINC数据集上的性能比较。Graphormer在所有三个数据集上一致且显著地超越了之前的最先进GNN,性能提升幅度很大。

最后在PCQM4M-LSC数据集上对Graphormer的关键设计元素进行了系列消融研究。表5展示了不同设计元素的消融研究结果。空间编码、中心性编码和边编码的引入都显著提高了模型的性能,证明了这些编码方式在Transformer架构中对建模图数据的有效性。

Graphormer的代码和模型在以下GitHub链接公开提供:GitHub - microsoft/Graphormer: Graphormer is a general-purpose deep learning backbone for molecular modeling.

论文链接:https://arxiv.org/pdf/2106.05234 

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

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

相关文章

轻松重置 MySQL 8.0 Root 密码的简便方法!

在Windows环境下安装MySQL数据后,如果忘记了 MySQL 8.0 的 root 密码,不必担心!通过 --skip-grant-tables 和 named-pipe 模式登录后,只需几步简单的 SQL 命令即可重置密码:刷新权限表、修改密码、再刷新权限&#xff…

SpringBoot | Maven快速上手

文章目录 一、Maven1.1 Maven 简介:1.2 Maven 的核心功能:1.2.1 项目构建:1.2.2 依赖管理: 1.3 Maven 仓库:1.3.1 本地仓库:1.3.2 中央仓库:1.3.3 私服: 二、第一个 SpringBoot 程序…

数据处理与统计分析篇-day09-数据透视表与日期时间处理

一. 数据透视表 概述 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等。 所进行的计算与数据跟数据透视表中的排列有关。之所以称为数据透视表,是因为可以动态地改变它们的版面布置&#…

智慧水利采砂船在线监控平台:构建高效、智能的河道采砂监管体系

随着科技的不断发展,水利行业的智慧化转型也日益受到重视。智慧水利采砂船在线监控平台便是这一转型的重要成果之一。该平台主要服务于水政执法人员,针对取得河道采砂许可证的采砂公司及采砂船,实施在线自动监控,旨在提高监管效率…

OSError: [Errno 16] Device or resource busy: ‘.nfs*‘报错解决办法

目录 1 项目场景&问题描述:2 原因分析:2.1 问题背景: 3 解决方案:3.1 创建存放临时文件的目录3.2 使用该目录3.2.1 设置环境变量 TMPDIR3.2.2 运行时设置(推荐)3.2.3 代码中设置 4 总结 1 项目场景&…

瑞芯微RK3566鸿蒙开发板Android11修改第三方输入法为默认输入法

本文适用于触觉智能所有支持Android11系统的开发板修改第三方输入法为默认输入法。本次使用的是触觉智能的Purple Pi OH鸿蒙开源主板,搭载了瑞芯微RK3566芯片,类树莓派设计,是Laval官方社区主荐的一款鸿蒙开发主板。 一、安装输入法并查看输入…

CSS05-Emment语法

Emmet语法的前身是Zen coding,它使用缩写,来提高html/css的编写速度,Vscode内部已经集成该语法。 作用: 1.快速生成HTML结构语法 2.快速生成CSS样式语法

linux 安装 tomcat9、java环境

一、安装 Java环境 1. 下载文件 https://repo.huaweicloud.com/java/jdk/ 或者网盘:通过网盘分享的文件:jdk-8u192-linux-x64.tar.gz 链接: https://pan.baidu.com/s/1V3pQWzgSLJxdrUdmmKueRA 提取码: qspw 2. 查看Linux系统是否有自带的jdk&#xf…

【TabBar嵌套Navigation案例-产品推荐-CollectionView的layout设置 Objective-C语言】

一、我们接着来做这个产品推荐页面啊 1.我们之前,把这个产品推荐页面做出来了,就是长的丑了点儿,所以呢,我们需要去给它设置一下itemSize啦,等等一些东西, 好,首先呢,在这个里边,我们找到我们的layout这块儿, 然后呢,这个layout里边,我们一个一个来设置, 首先呢…

Excel DATE函数怎么用,DATE函数的使用方法来了

大家好,这里是效率办公指南! 📅 在处理Excel中的日期数据时,我们经常需要创建特定的日期或从多个单元格中合并日期。DATE 函数是Excel中一个非常实用的工具,它可以帮助我们从年、月、日的单独信息中创建一个正确的日期…

Kylinsec操作系统

外网源 发布地址:http://mirrorlist.kylinsec.com.cn:8888/publicrepo/

Git(5):分支合并merge和rebase

git merge 假设有两个分支:master 分支和 feature 分支,现在需要将 feature 分支合并到 master 分支。 git checkout mastergit merge feature在合并分支时,git 提供了不同的合并策略,用于处理不同的合并场景。 Fast-forward 如…

《百家姓》中排名第八却是中国人口第一大姓-王姓

王姓在《百家姓》中虽然排名第八,但根据近年来的统计数据和实际人口分布,王姓已成为中国第一大姓。以下是对王姓作为“百家姓之首”的详细解析: 一、人口数量与分布 人口数量:截至当前时间(2024年)&#x…

Jmeter 配置元件-计数器时间变量

计数器 在 JMeter 中,计数器是一个非常有用的配置元件,可以帮助你在每次请求时生成递增的数字。 在线程组下新增计数器 配置计数器 开始值(Starting value):给定计数器的起始值、初始值,第一次迭代时&…

我们离生成式 AI 应用全面爆发还有多远?2024 全球产品经理大会透露了这些关键信号

GenAI 应用爆发何时到来、生成式 AI 应用到底该怎么做……大模型浪潮已经有将近两年的时间,去年狂卷模型,今年业内则一致认为是应用落地元年,但其间困惑诸多,产品人与创业者们该何去何从,答案尽在 2024 全球产品经理大…

Linux 常用命令(待更新)

1、pwd命令 2、cd命令 3、ls命令 4、locate命令 5、clear命令 6、cat命令 7、head命令 8、tail命令 9、grep命令 10、chmod命令 11、cp命令 12、mv命令 13、mkdir命令 14、rm命令 15、文件压缩和有关归档的命令 16、文件系统的命令 17、与系统管理相关的命令 …

七种修复错误:由于找不到msvcr110.dll 无法继续执行的方法

当你在运行某些程序时遇到“找不到msvcr110.dll”的错误提示,这通常意味着你的系统缺少了Microsoft Visual C 2012 Redistributable包中的一个重要文件。这个DLL文件是Microsoft Visual C Redistributable的一部分,用于支持许多使用Visual C编写的软件和…

Linux:文件描述符详解

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的所有进程,都拥有自己的文件描述符(File Descriptor, FD),它是操作系统在管理进程和文件时的一种抽象概念。每个文件描述符由一个非负整…

链接器查找其他动态库的过程

export LD_DEBUGall 2./your_program 这将输出所有的调试信息,包括搜索路径、库的加载、符号解析等详细信息。 关闭用unset LD_DEBUG 常用的 LD_DEBUG 选项包括: all: 输出所有调试信息。paths: 显示搜索路径信息。files: 显示文件打开和关闭的信息。…

使用天地图实现只展示某个市的功能

可参考 天地图部分功能hooks封装useTdtMap.js 和 处理geoJson格式数据并能回显至天地图上 下面实现效果类似于百度地图-展示部分区域 功能图 部分代码 const initLoad () > {mapInit().then((res) > {map.value res;var layers map.value.getLayers();layers.forEac…