LOGIC-LM:使用符号求解器为大型语言模型提供忠实的逻辑推理11.22

本文主要是介绍LOGIC-LM:使用符号求解器为大型语言模型提供忠实的逻辑推理11.22,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LOGIC-LM:使用符号求解器为大型语言模型提供忠实的逻辑推理

  • 摘要
  • 1 引言
  • 2 相关工作
  • 3 LOGIC-LM
    • 3.1 Problem Formulator
    • 3.2 Symbolic Reasoner
    • 3.3 Self-Refiner
    • 3.4 结果解释器
  • 4 实验

在这里插入图片描述

摘要

大型语言模型(LLM)已经显示出类似人类的推理能力,但仍然难以解决复杂的逻辑问题。本文介绍了一种新颖的框架 LOGIC-LM,它将LLM与符号求解器相集成,以提高逻辑问题的解决能力。我们的方法首先利用LLM将自然语言问题转化为符号表述。随后,确定性符号求解器对所表述的问题进行推理。我们还引入了一个自我求精模块,它利用符号求解器的错误消息来修改符号形式化。我们在五个逻辑推理数据集上展示了 LOGIC-LM 的有效性:ProofWriter、PrOntoQA、FOLIO、LogicalDeduction 和 AR-LSAT。平均而言,与单独使用带有标准提示的LLM相比,LOGIC-LM 的性能显着提高了 39.2%,与使用思维链提示的LLM相比,显着提高了 18.4%。我们的研究结果表明,LOGIC-LM 通过将LLM与符号逻辑相结合,为忠实的逻辑推理提供了一条有前途的途径。

1 引言

逻辑推理是一种认知过程,涉及使用证据、论证和逻辑来得出结论或做出判断。它在解决问题、决策和批判性思维的智能系统中发挥着核心作用。最近,大型语言模型(LLM)表现出了像人类一样“推理”的能力。当提示推理的逐步解释(“思想链”)或简单的提示“让我们一步一步思考”时,这些模型能够通过明确的推理步骤回答问题。

尽管LLM取得了进步,但他们仍然难以解决复杂的逻辑推理问题。最近的研究发现LLM偶尔会做出不忠实的推理,即得出的结论不遵循先前生成的推理链。虽然思想链可能会模仿人类的推理过程,但LLM的基本性质仍然是黑盒概率模型,缺乏保证推理准确性的机制。相比之下,符号推理引擎,例如专家系统,是忠实且透明的,因为推理基于符号表示的知识,并遵循符合逻辑原则的明确定义的推理规则。主要障碍是考虑到自然语言固有的歧义性和灵活性,如何准确地将问题转化为符号表示。这正是LLM的优势所在,使LLM成为符号求解器的有希望的补充。

这推动了我们对将LLM与符号推理相结合的神经符号方法的探索。如图 1 所示,我们提出LOGIC-LM,一个新颖的框架,将逻辑推理问题分解为三个阶段:问题表述、符号推理和结果解释。在问题表述过程中,LLM将问题的自然语言描述转换为适当的符号表述,识别问题陈述中存在的关键实体、事实和规则。随后,在符号推理阶段,确定性符号求解器对符号形式进行推理。最后,结果解释器解释输出并将其映射到正确答案。通过将LLM与符号求解器相结合,我们可以利用LLM强大的自然语言理解能力,使用符号表示精确地表示问题,同时还利用符号求解器提供的逻辑忠实性和透明度。为了提高符号解析的准确性,我们还结合了自我求精的思想,使用符号求解器的错误消息作为反馈来迭代修改生成的逻辑形式。

我们展示了 LOGIC-LM 在五个逻辑推理数据集上的适应性和有效性:ProofWriter 、PrOntoQA、FOLIO 、AR-LSAT ,以及来自 BigBench 的 LogicalDeduction 数据集。这些数据集涵盖了广泛的逻辑推理问题,包括:

  • 演绎推理问题
  • 一阶逻辑(FOL)推理问题
  • 约束满足问题(CSP)
  • 分析推理(AR)问题

我们集成了四种定制的符号推理工具针对这些问题:

  1. 逻辑编程引擎,通过前向/后向链接支持演绎推理;
  2. 基于 FOL 规则和事实得出新结论的 FOL 推理引擎,
  3. 为有限域上的 CSP 提供求解器的约束优化引擎,以及
  4. 解决分析推理问题的布尔可满足性问题 (SAT) 求解器。

我们的评估表明,将LLM与符号求解器相结合的策略比纯粹依靠LLM进行逻辑推理的效果明显更好,比标准提示平均提高了 39.2%,比思想链提示平均提高了 18.4%(第 4.1 节) 。我们还发现,随着所需推理深度的增加,LOGIC-LM 变得越来越有效(第4.3节)。最后,通过分析自我求精的影响,我们强调了在与符号求解器交互时逐步修改符号形式化的有效性(第4.4节)。

2 相关工作

逻辑推理的语言模型
最近使LLM适应逻辑推理任务的工作可大致分为两类:
1)通过微调或训练专门模块来优化LLM推理能力的微调方法,以及
2) 情境学习方法,设计特殊的提示来激发LLM的逐步推理能力。
典型的方法包括在最终答案之前生成解释的思维链提示和分解问题的最不至多的提示分解为可以单独解决的更简单的组件。上述两种方法都直接通过自然语言 (NL) 进行推理,比基于符号的推理提供了更大的灵活性。然而,NL 内在的复杂性和模糊性也带来了不受欢迎的问题,例如不忠实的推理和幻觉。

与之前的工作不同,我们使用符号语言作为推理的基本单位。这有效地将执行复杂、精确推理的负担从LLM转移到更可靠、可解释的外部符号求解器。同时,我们利用LLM强大的上下文学习能力,将基于NL的问题表述为合适的符号表示,从而保持灵活性的好处。

尽管之前的工作也提出了神经网络尽管符号方法将神经网络与符号推理相结合,但这些方法存在一些局限性,例如手工制作或专门的模块设计不易推广,或者由于优化困难而脆弱。相比之下,我们提出了一个更通用的框架,将现代LLM与符号逻辑相结合,无需训练或设计复杂的特定问题模块。

工具增强的语言模型
语言模型具有固有的局限性,例如无法访问最新信息、采取行动或执行精确的数学推理。为了解决这个问题,最近的工作已经开始通过访问外部工具和资源来增强语言模型,例如信息检索器、计算器、代码解释器、规划器和其他预训练模型。最近的工作通过生成将推理过程指定为执行顺序的链式命令的 Python 程序,提高了算术推理任务的性能。然而,这种想法尚未扩展到逻辑推理问题,主要是由于用函数式编程表示其高度“非线性”推理过程(例如假设、个案分析和消除过程)的挑战。我们的工作提供了一种在增强LLM框架内解决这个问题的新颖方法。我们没有将问题解决过程解析为程序,而是仅使用 LLM 用符号语言描述问题,然后将推理卸载给外部符号求解器。

自动形式化
将自然语言转换为符号表示的概念已广泛应用于数学推理的自动形式化中,已有工作证明了LLM能够熟练地将相当一部分数学问题转化为 SymPy、Isabelle/HOL和 Lean等工具中定义的正式规范。数学推理可以被认为是逻辑推理的一个专门子集,主要集中在数字演绎上。由于这种数字的特殊性,数学问题通常更容易转化为符号形式。相比之下,逻辑推理涵盖了更广泛的问题类型,通常需要对世界知识和常识有更深入的理解,才能有效地解析为符号形式。尽管有大量研究数学推理的工作,但我们的工作开创了将自动形式化的概念扩展到现代LLM更广泛的逻辑推理任务

3 LOGIC-LM

如图 2 所示,我们模型的输入是用自然语言描述的逻辑推理问题 P,以及多项选择或自由形式问题形式的目标 G。然后,LOGIC-LM 遵循问题表述和推理范式来解决问题。
在这里插入图片描述

Problem Formulation 阶段,我们提示LLM将问题和目标翻译成特定于任务的符号语言。在Symbolic Reasoning阶段,我们调用确定性符号求解器(例如逻辑编程引擎)来获得符号表示的答案。最后,LLM 或基于规则的Result Interpreter负责将答案翻译回自然语言。使用这种方法,只要问题表述正确,推理就保证是忠实的,因为答案 A 是执行嵌入符号推理器中的确定性算法(例如,前向/后向链接)的结果。与之前基于CoT的方法相比,我们的框架通过将重点从“通过逐步推理解决问题”转移到“用符号语言表示问题”来减轻LLM的负担。

3.1 Problem Formulator

直觉上,LLM可能很难直接解决复杂的推理问题。然而,它们表现出了理解文本输入并将其转化为正式程序的显着能力,例如数学方程或Python代码。我们认为这种将问题表述为不同语言的能力也可以扩展到符号语言。我们利用LLM的小样本泛化能力来实现这一目标。通过向LLM提供有关符号语言语法的详细说明,以及一些作为上下文示例的演示,我们观察到LLM,如 InstructGPT 和 GPT-4 ,可以有效地按照说明识别问题陈述中存在的关键实体、事实和规则,然后按照我们定义的语法将这些元素翻译成符号语言。

具体来说,我们使用四种不同的符号公式来涵盖四种常见类型的逻辑推理问题:演绎推理、一阶逻辑推理、约束满足问题和分析推理。这些表述为翻译基于自然语言的问题陈述提供了基础。通过定义额外的特定问题的公式,我们的框架保留了适应更广泛的推理任务的灵活性。接下来,我们将深入研究每个符号表述的语法。每种问题类型的示例如图 2 所示。

逻辑编程(LP)语言
演绎推理通常从已知的事实和规则开始,迭代地做出新的推论,直到目标陈述被证明或反驳。 Prolog 逻辑编程语言可以说是描述演绎推理问题的最著名的符号语言。我们采用它的语法将问题表示为事实、规则和查询。

  • 事实 一个事实 F 是一个带有谓词和一组参数的简单语句,表述为 P(a1, · · · , an),其中 P 是谓词名称,每个参数 ai 可以是变量、实体、数字或布尔值。例如,Age(Peter, 31) 表示“Peter 的年龄是 31 岁”,MadeOfIron(Nails, True) 表示“钉子是铁做的”这一事实。
  • 规则 一个规则以子句的形式写成:F1∧···∧Fm→Fm+1∧···∧Fn,其中每个Fi是一个事实,规则的意思是“如果事实F1,····,Fm为真” ,那么事实 Fm+1 ··· Fn 也为真。”
  • 查询 一个查询 Q 只是需要根据已知事实和规则证明的另一个事实。

一阶逻辑 (FOL)。
虽然逻辑编程语言有效地表示常见的演绎推理问题,但它可能无法表示更复杂的一阶逻辑(FOL)问题。为了解决这个问题,我们还在附录 A 中包含了 FOL 语法(Enderton,2001)。然后将问题解析为 FOL 公式列表,这些公式分为前提(问题中的已知信息)和结论(未知公式)有待证明)。表1给出了例句及其FOL公式。

约束满足(CSP)。
约束满足问题(CSP)旨在找到满足多个约束的一组对象的值分配。 CSP 通常被定义为三元组 (X, D, C),其中 X = {x1, · · · , xn} 是变量的集合,D = {D1, · · · , Dn} 是它们的集合各自的值域,C={C1,····,Cm}是一组约束。每个变量 xi 都可以采用非空域 Di中的值。每个约束 Cj 都是一对 ⟨tj, Rj⟩,其中 tj ⊂ X 是 k 个变量的子集,Rj 是域 Dj 的相应子集上的 k 元关系。我们使用上述语法将 CSP 问题定义为变量、域和约束。图 2 和表 1 均给出了一个示例。

布尔可满足性 (SAT) 公式。
SAT 是决定是否对布尔公式的变量进行赋值以满足该公式的问题。许多分析推理问题都可以表述为 SAT 问题。我们采用 Ye 等人定义的语法。将 SAT 问题 P 表述为 (Φ,T,Q),其中 Φ 是理论 T 下定义的一组约束,Q 是感兴趣的查询。

表 1 总结了四种类型的逻辑推理问题、它们的典型数据集以及用于表示每种类型问题的符号公式。我们还给出了自然语言语句的示例以及每种类型相应的符号表述。附录 C 显示了我们用于问题制定者的完整提示。为了教LLM更好地将每个语句与其相应的符号形式对齐,我们在上下文示例中使用格式:
SYMBOLIC_FORMULA ::: NL_STATEMENT 
以实现更好的基础。

3.2 Symbolic Reasoner

在problem formulator将问题 P 和目标 G 解析为符号表示 P^ 和 G^ 后,我们根据任务调用确定性外部求解器,以获得答案 A。表 1 总结了我们用于每种类型逻辑推理的符号求解器问题。

LP系统。
对于演绎推理,我们结合了 Pyke 专家系统,它基于逻辑编程语言进行推理。为了响应查询,Pyke 首先创建一个知识库,并用已知的事实和规则填充它。随后,它应用前向和后向链接算法来推断新事实并证实目标。

FOL 证明者。
我们使用 Prover92 作为 FOL 推理引擎。 Prover9 是一个自动定理证明器,支持一阶逻辑和方程逻辑。它首先将 FOL 语句转换为合取范式 (CNF),然后对 CNF 执行解析 ,以推断结论是真、假还是未知。

CSP 求解器。
求解 CSP 就是找到满足所有给定约束的所有变量的赋值。此任务常用的算法包括回溯、约束传播和局部搜索变体。为此,我们合并了 python-constraint3 包,它为有限域上的 CSP 提供求解器。

SAT 求解器。
为了解决 SAT 问题,我们使用 Z3 定理证明器,这是 Microsoft4 开发的可满足性模理论(SMT)求解器。 SMT 求解器提供算法来确定一组数学公式是否可满足。它将 SAT 问题概括为更复杂的公式,涉及实数、整数和各种数据结构(例如列表、数组、位向量和字符串)。许多现实世界的分析推理问题可以表示为求解方程组的问题。

3.3 Self-Refiner

对于复杂的问题,生成正确的逻辑形式对于法学硕士来说可能会变得具有挑战性。为了解决这个问题,我们引入了一个自我优化模块,它可以学习修改不准确的逻辑使用来自符号推理器的错误消息作为反馈进行计算。最近的工作采用了类似的想法来改进代码生成,方法是教LLM通过少量演示来调试其预测的程序。在这里,我们扩展了这个想法来细化生成的逻辑表示。如果符号求解器返回执行错误,我们会通过错误的逻辑形式、求解器的错误消息以及一组显示常见错误情况的演示(例如,自由变量是不受 FOL 中任何量词的限制)及其补救措施。我们迭代地运行这个过程,直到没有返回错误消息,或者达到允许的最大修订数量。

3.4 结果解释器

最后,结果解释器将从符号求解器返回的结果翻译回自然语言答案。对于某些问题,可以通过预定义的规则来实现;例如,将 Entailment 映射为 true。然而,对于 CSP 来说,这个过程可能更复杂,例如,将 {convertible: 1,tractor: 2, minivan: 3} 翻译为“convertible is the old.”。为了处理这些不同级别的复杂性,我们设计了基于规则和基于 LLM 的结果解释器。结果解释器的详细信息在附录 D 中给出。

4 实验

这篇关于LOGIC-LM:使用符号求解器为大型语言模型提供忠实的逻辑推理11.22的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我