UltraQuery是如何工作的非参数化模糊逻辑算子与栈式查询执行引擎深度剖析【免费下载链接】ULTRAA foundation model for knowledge graph reasoning项目地址: https://gitcode.com/gh_mirrors/ultra/ULTRAUltraQuery 是 ULTRA 知识图谱推理基础模型的逻辑查询求解组件它不针对任何特定图谱做训练就能在任意知识图谱上零样本回答多跳逻辑查询路径、交、并、否定。其两大核心技术是把查询结果表示为节点上的模糊集用非参数化模糊逻辑算子完成交/并/非运算再用栈式查询执行引擎按后缀表达式逐步执行查询指令。 30秒速览UltraQuery 能做什么传统的知识图谱嵌入模型只会补全一条缺失边而 UltraQuery 可以回答真正的逻辑查询例如找到《阿凡达》导演的其他所有作品先跳两跳取导演再取交集与 A 相连且与 B 相连但不与 C 相连的实体交 否定得益于 ULTRA 的可迁移关系表示同一个预训练权重可以在任何实体/关系词表的知识图谱上直接推理覆盖 23 个查询数据集、14 种标准查询类型定义见 ultra/datasets_query.py类别查询类型含义路径1p2p3p沿 1~3 跳关系链查找交2i3i多条路径结果的交集否定2in3ininppinpni路径 交 否定组合并2u-DNFup-DNF多个答案分支的并集混合ippi先交后跳 / 先跳后交标准评测协议在 10 种无并集模式上训练在全部 14 种模式上评测datasets_query.py以此检验模型的泛化能力。 核心机制一非参数化模糊逻辑算子UltraQuery 最巧妙的设计是栈里的每个元素不是一个实体列表而是一个模糊集——对整个图谱所有节点的一维概率分布每个节点的得分在 0~1 之间。这样逻辑运算就退化为对两个向量做逐元素运算天然支持批量并行和梯度回传。实现集中在 ultra/ultraquery.py 的三个方法中支持三套模糊逻辑系统模糊逻辑系统交AND并OR非NOTGödelmin(x, y)max(x, y)1 − xProduct默认x · yx y − x·y1 − xŁukasiewiczmax(0, xy−1)min(1, xy)1 − x默认使用product逻辑可在 config/ultraquery/transductive.yaml 中切换。为什么强调非参数化交、并、非全部是固定公式不含任何可学习参数因此组合性有保证——无论查询嵌套多深语义都是经典逻辑的模糊化推广零样本可迁移——逻辑算子与具体图谱完全解耦换个知识图谱无需重新训练唯一的学习部分只剩沿某条关系跳一步这个动作由下面的关系投影负责。️ 核心机制二栈式查询执行引擎执行引擎的灵感来自编译原理中的后缀表达式求值核心代码在 ultra/ultraquery.py 的execute方法。整个流程分为四步第 1 步把查询翻译成后缀指令流。嵌套元组形式的查询如 BetaE 格式被递归转换为平坦的后缀序列存进 Query 张量子类——它用不同的高位比特标志区分指令类型比特位指令作用158投影投影某条关系调用 GNN 沿关系跳一步159交弹出两个模糊集做 AND160并弹出两个模糊集做 OR161非弹出一个模糊集做 NOT162停机指令流结束低位则存放操作数实体 ID 或关系 ID。例如查询2i两个一跳路径取交会被编译为实体A, 投影r1, 实体B, 投影r2, 交, 停机。转换算法见 nested_to_postfix还内置了 to_readable 方法可把指令流还原成人能读的伪代码。第 2 步初始化批量化的栈。Stack 把一批查询的栈打包成一个张量(batch, 2, num_nodes)每个查询拥有独立的栈指针 SP和指令指针 IP。这意味着同一 batch 里长短不一的查询可以完全异步地并行推进GPU 利用率最大化。第 3 步指令指针循环取指执行。主循环不断读取每个查询当前 IP 指向的指令遇到操作数就压入 one-hot 初始分布遇到交/并/非就弹出、运算、压回遇到投影则调用关系投影模型。投影被刻意放在每轮最后执行——因为它最昂贵先执行完所有廉价的逻辑运算可以最大限度合并并行批量。全部指令跑完后栈顶的模糊集就是答案sigmoid 得分高于 0.5 的节点即被判定为查询答案。第 4 步符号影子执行仅训练时。训练阶段引擎会同时运行一个 SymbolicTraversal 影子模型——它不做学习只是用scatter_max精确地沿边做符号化遍历。其输出用于遍历 Dropout随机删掉图中可以一步直达的边见 traversal_dropout逼迫神经网络真正学会关系语义而不是偷懒走捷径。推理时影子模型自动关闭。⚡ 唯一可学习部分关系投影每次执行投影指令时RelationProjection 会把 ULTRA 基础模型调起来关系图 GNNRelNBFNet在由 build_relation_graph 构建的关系图上做 6 层 64 维消息传递。关系图把共同出现在同一个头/尾节点的关系连边分头-头、尾-尾、头-尾、尾-尾共 4 类从而学到关系之间的相对表示——这正是 ULTRA 能跨图谱迁移的关键。实体推理器QueryNBFNet以当前模糊集和查询关系为条件在实体图上做多跳传播输出每个节点的新得分。rspmm 自定义算子为了把关系消息传递从 O(E) 降到 O(V)仓库内置了 CUDA/CPU 混合编译的 rspmm 核首次运行自动编译并缓存。还有一个实战要点——分数阈值如果直接拿做单跳链接预测的 ULTRA 原版 checkpointultra_3g/4g/50g.pth多源传播会导致模糊得分被逐步稀释需要把--threshold设为 0.8 以上来截断低分而专用训练的 ckpts/ultraquery.pth用 FB15k237 的复杂查询训练 4 万步配置见 config/ultraquery/pretrain.yaml已针对多源传播调优--threshold设为 0 即可。 快速上手一条命令执行复杂查询安装依赖后PyTorch 2.1 PyG 2.4详见 requirements.txt推荐用 GPU 运行。以ultraquery.pth在 FB15k237 上做零样本推理为例python script/run_query.py -c config/ultraquery/transductive.yaml \ --dataset FB15k237LogicalQuery --epochs 0 --bpe null --gpus [0] \ --bs 32 --threshold 0.0 --ultra_ckpt null \ --qe_ckpt /path/to/ultra/ckpts/ultraquery.pth如果想用原版 ULTRA checkpoint把--ultra_ckpt指向ultra_4g.pth、--qe_ckpt置null、--threshold置 0.8 即可模型组装逻辑见 script/run_query.py。批量评测多个数据集可用script/run_query_many.py结果自动写入 CSV。指标支持mrr、hitsk、auroc、spearmanr、mape五种实现见 query_utils.py。 性能表现在 23 个查询数据集上的平均成绩PyG 实现数据来自 README.md指标EPFO 类查询含否定查询MRR0.3090.178Hits100.4320.286其中在 FB15k 查询上达到 SOTA0.764 MRR / 0.834 Hits10EPFO超过 QTO 等更大更重的基线模型——而整个模型只有约 17 万参数、checkpoint 仅 2 MB 左右。 源码导读按阅读顺序打开这几个文件ultra/query_utils.pyQuery后缀指令张量、Stack批量化栈、批量评测指标ultra/ultraquery.pyUltraQuery执行引擎主循环、三套模糊逻辑算子、关系投影与遍历 Dropoutultra/tasks.py关系图构建、边匹配哈希等基础设施ultra/models.py ultra/base_nbfnet.pyULTRA 基础模型与 NBFNet 改造版script/run_query.py训练/推理入口脚本config/ultraquery/查询任务的三类配置预训练/传递式/归纳式一句话总结UltraQuery 模糊集表示 无参数的模糊逻辑三算子 栈式后缀执行引擎 一个可迁移的关系投影网络。前三者保证语义正确且零样本可迁移最后一者负责学会怎么跳四者合力让一个 2MB 的小模型成为通用于任意知识图谱的逻辑查询求解器。【免费下载链接】ULTRAA foundation model for knowledge graph reasoning项目地址: https://gitcode.com/gh_mirrors/ultra/ULTRA创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考