【传知代码】知识图谱推理-论文复现

2024-05-30 09:20

本文主要是介绍【传知代码】知识图谱推理-论文复现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 概述
  • 方法介绍
  • 核心逻辑
    • 实验条件
    • 数据集
    • 实验步骤
    • 实验结果
  • 核心代码
  • 小结

本文涉及的源码可从知识图谱推理该文章下方附件获取

概述

本研究深入探讨了基于图神经网络(GNN)的知识图谱推理,特别聚焦于传播路径的优化与应用。在智能问答、推荐系统等前沿应用中,知识图谱推理发挥着不可或缺的作用。然而,传统GNN方法在处理大规模知识图谱时,往往面临效率和准确度的双重挑战。为了克服这些局限,本研究提出了一种创新的自适应传播策略AdaProp,并通过与经典的Red-GNN方法进行对比实验,验证了其优越性。

论文名称:AdaProp: Learning Adaptive Propagation for Graph Neural Network based Knowledge Graph Reasoning
作者:Yongqi Zhang, Zhanke Zhou, Quanming Yao, Xiaowen Chu, and Bo Han
出处:Proceedings of the 29th ACM SIGKDD Conference on Knowledge Discovery and Data Mining (KDD '23), August 6–10, 2023, Long Beach, CA, USA
在本论文的基础上添加tensorboard可视化结果
原代码链:https://github.com/LARS-research/AdaProp

方法介绍

通过有效的采样技术来动态调整传播路径,既考虑到查询实体和查询关系的依赖性,又避免在传播过程中涉及过多无关实体,从而提高推理效率并减少计算成本。这将涉及到开发新的采样策略,以确保在扩展传播路径时能够保持对目标答案实体的精确预测。为此,提出了一种名为AdaProp的基于GNN的方法,该算法可以根据给定的查询动态调整传播路径。

在这里插入图片描述

在知识图谱推理领域,传统的方法如全传播、渐进式传播和受限传播都各自有优势和局限。提出的AdaProp方法在效率和性能上对这些传统方法进行了显著的优化。

核心逻辑

实验条件

使用Python环境和PyTorch框架,在单个NVIDIA RTX 3070 GPU上进行,该GPU具有8GB的内存。实验的主要目的是验证AdaProp算法在传导(transductive)和归纳(inductive)设置下的有效性,并分析其各个组成部分在模型性能中的作用。

数据集

family数据集,存放在./transductive/data文件夹下

在这里插入图片描述

实验步骤

step1:安装环境依赖

torch == 1.12.1
torch_scatter == 2.0.9
numpy == 1.21.6
scipy == 1.10.1

step2:进入项目目录,进行训练
在这里插入图片描述

step3:输入tensorboard指令,可视化结果

在这里插入图片描述

在这里插入图片描述

实验结果

在这里插入图片描述

核心代码

# startcheck all output pathscheckPath('./results/')checkPath(f'./results/{dataset}/')checkPath(f'{loader.task_dir}/saveModel/')model = BaseModel(opts, loader)opts.perf_file = f'results/{dataset}/{model.modelName}_perf.txt'print(f'==> perf_file: {opts.perf_file}')config_str = '%.4f, %.4f, %.6f,  %d, %d, %d, %d, %.4f,%s\n' % (opts.lr, opts.decay_rate, opts.lamb, opts.hidden_dim, opts.attn_dim, opts.n_layer, opts.n_batch, opts.dropout,opts.act)print(config_str)with open(opts.perf_file, 'a+') as f:f.write(config_str)if args.weight != None:model.loadModel(args.weight)model._update()model.model.updateTopkNums(opts.n_node_topk)if opts.train:writer = SummaryWriter(log_dir=f'./tensorboard_logs/{dataset}')# training modebest_v_mrr = 0for epoch in range(opts.epoch):epoch_loss = model.train_batch()if epoch_loss is not None:writer.add_scalar('Training Loss', epoch_loss, epoch)else:print("Warning: Skipping logging of Training Loss due to NoneType.")model.train_batch()# eval on val/test setif (epoch + 1) % args.eval_interval == 0:result_dict, out_str = model.evaluate(eval_val=True, eval_test=True)v_mrr, t_mrr = result_dict['v_mrr'], result_dict['t_mrr']writer.add_scalar('Validation MRR', result_dict['v_mrr'], epoch)writer.add_scalar('Validation Hits@1', result_dict['v_h1'], epoch)writer.add_scalar('Validation Hits@10', result_dict['v_h10'], epoch)writer.add_scalar('Test MRR', result_dict['t_mrr'], epoch)writer.add_scalar('Test Hits@1', result_dict['t_h1'], epoch)writer.add_scalar('Test Hits@10', result_dict['t_h10'], epoch)print(out_str)with open(opts.perf_file, 'a+') as f:f.write(out_str)if v_mrr > best_v_mrr:best_v_mrr = v_mrrbest_str = out_strprint(str(epoch) + '\t' + best_str)BestMetricStr = f'ValMRR_{str(v_mrr)[:5]}_TestMRR_{str(t_mrr)[:5]}'model.saveModelToFiles(BestMetricStr, deleteLastFile=False)# show the final resultprint(best_str)writer.close()model.writer.close()

小结

AdaProp的成功并非偶然。其自适应传播策略使得模型能够根据不同的情况调整信息传播策略,从而更加精确地捕获节点之间的关系。这种灵活性是传统GNN所缺乏的,也是AdaProp能够在多个数据集上取得显著提升的关键原因。此外,AdaProp的引入也为知识图谱推理领域带来了新的研究方向和思路,为未来的研究提供了有益的参考。

本研究通过提出AdaProp自适应传播策略,并在多个数据集上进行实验验证,充分证明了其在知识图谱推理中的优越性。AdaProp不仅提高了推理的准确性和效率,还为该领域的未来发展提供了新的方向。未来,我们将继续探索AdaProp的潜力,优化其算法结构,以期在更多领域取得更加卓越的表现。同时,我们也期待更多的研究者能够关注这一领域,共同推动知识图谱推理技术的发展。
在这里插入图片描述

这篇关于【传知代码】知识图谱推理-论文复现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016060

相关文章

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java抽象类Abstract Class示例代码详解

《Java抽象类AbstractClass示例代码详解》Java中的抽象类(AbstractClass)是面向对象编程中的重要概念,它通过abstract关键字声明,用于定义一组相关类的公共行为和属... 目录一、抽象类的定义1. 语法格式2. 核心特征二、抽象类的核心用途1. 定义公共接口2. 提供默认实