这是一篇NeuralPS 2023论文:Deductive Verification of Chain-of-Thought Reasoninghttps://proceedings.neurips.cc/paper_files/paper/2023/hash/72393bd47a35f5b3bee4c609e7bba733-Abstract-Conference.html
目录
0. 背景
CoT会对推理任务有着明显的帮助,但是CoT对中间推理步骤的强调,可能会引入幻觉hallucination和累计accumulated 错误,从而限制模型解决复杂推理任务的能力。
1. 特点
我们不依赖外部模块和算法,直接利用LLMs的语境学习能力生成更精确、更严谨的deductive reasoning。在这项工作中,我们提出了一种基于自然语言的演绎推理格式,允许LLMs在演绎推理过程的每一个中间步骤中自校验,从而提高推理的严谨性和可信性。
(1)使用语境学习实现推理验证,不需要模型微调
(2)基于自然程序(nature program,之后简称为NP)的LLM验证除了可以识别无效的推理步骤,而且可以对为何无效提供明确的解释,详细说明它涉及的具体推理步骤。
(3)NP方法可以与其他语境抽象任务相结合,例如last letters任务
(4)可以使用没有出现在前文的常识性知识
2. 结构
基于推理的QA任务,可以被定义为(Q ,C ,O ,A),
- Q是目标问题,
- C是问题的上下文,
- 当Q是有k个回答的多选题时,是可选的答案
- A是ground-truth
当给出Q和C作为输入,LLMs生成的回答tokens为
在CoT中 T 由 m 个中间推理步骤组成,记为
中间步骤 可以用T中的来表示。
在之前的许多工作中,都只追求answer correct答案正确【最后一个推理步骤中预测的最终答案与ground truth A一样】
但是我们观察到,对于LLM产生错误最终答案的所有情况,中间推理步骤S之间至少存在一个错误。此外,即使最终答案是正确的,S之间也可能存在一些错误。如表1,发生在我们测试的所有LLM中,包括最先进的模型,如Chat GPT和GPT - 4 。由于后面的推理步骤受制于先前的推理步骤,这些错误往往会引发滚雪球效应,导致后续错误的复合。这大大降低了正确解决问题的可能性,阻碍了实现人类水平复杂推理的进程。
中间推理chain有错误,但是答案是对的
所以,在这个工作中,强调每一个推理步骤的有效性,尤其是演绎推理的有效性,不仅仅是最终答案的正确性。
在演绎推理中,会给一个(前提,结论)对,我们要探究的是结论是否遵循前提
对于 每一步的推理步骤,我们将其演绎有效性 定义为一个二元变量,。即如果一个推理步骤是dedctively valid的,那么 。
这种情况当且仅当,可以从其对应的premise 中进行逻辑推导,包括【上下文C,问题Q,所有之前的推理步骤】
整个推理链的推理有效性为
评估演绎有效性比通过精准字符串匹配等简单的函数来评估答案的正确性更难,这里用LLMs去检查推理链的有效性。
3. 使用推理链进行逻辑验证的具体方法
给定一个推理链,直接要求LLMs一次性检查整个推理链进行了一个初步的实验:对于一个数据集问题及其由ChatGPT生成的推理链S,我们用“Do you think the above reasoning process is correct? Let’s think step by step”来提示ChatGPT,检查S中的推理步骤是否存在错误。然而,正如表2所示,对大多数数据集的验证准确率为50%,且ChatGPT在发现错误推理方面存在困难。值得注意的是,对于大多数推理链查询,不管它们的实际有效性如何,它都会持续地输出“Correct ”。
猜想:可能是因为每一步的推理step都包含不相关的前提
假设,对于一个推理步骤的前提是由问题Q和问题上下文C以及前面的推理步骤组成的。
对于Q和C,我们可以进一步地提取并分解到一个“问题相关前提”的集合中,其中的是由Q和C中得到的前提或者条件。
中的大多数元素与的有效性无关,也就是LLMs容易被无关的上下文所干扰。
将推理链验证过程分解为一系列逐步推进的过程,每一步推理链只考虑必要的前提。chain整体的有效性由来表示,可以被分解成。
3.1 NP的演绎推理过程
希望LLMs可以输出易于自己验证的演绎推理过程:对于每一个当前的推理步骤 ,保证它可以清楚地列出用于演绎推理的的最小子集,也就是和当前推理步骤 最相关的前提,以避免验证过程中的潜在歧义。
图一中下面的3个绿色框框就是NP格式的推理chain,可以很方便地找到相关的前提
NP( LLMs演绎推理的格式 )包括:
-
一个instruction,用来提取问题相关前提QC,“First, let’s write down all the statements and relationships in the question with labels”
-
QC的编号list
-
一个instruction,用来基于QC生成推理chain S,“Next, let’s answer the question step by step with reference to the question and reasoning process”
-
有前缀的推理步骤,前缀的格式为 #{number}(by {list_of_premises_used}) ,number是,也就是 前提数+是第几个推理步骤,“list_of_premises_used '是用于的演绎推理中的中的最小子集,也就是和当前推理步骤 最相关的前提。例如上图的#5. (by #2 #1) 总共有4个前提,所以推理的第一步序号为4+1,同时和它最相关的前提为1和2
对于最后一个推理步骤(1)包含一个特殊的标签 final step(2)指出要回答的目标问题的premise数(3)明确给出问题的最终答案
有了NP这个format之后,还要用一条instruction来验证单个推理步骤的推理有效性,这个instruction包括
-
对于前提的描述
-
的完整描述
-
一条验证正确性的指令,如“Double-check the reasoning process, let’s analyze its correctness, and end with "yes" or "no" "。
需要注意的是,在整个验证过程中:只保留了si的最小必要前提和背景,从而避免了无关背景干扰,显著提高了验证的有效性;还可以使用one-shot,提高了验证准确性
3.2 NP推理验证 + (序列生成策略)
一个两阶段的策略:全体一致+多数投票
(1)采样了k个推理chain和它们的答案作为候选
(2)全体一致:验证这k个chain的有效性,当且仅当只有chain的每一个step都是有效的,某个chain才是有效的
(3)对于每一个中间推理步骤,使用多数投票去对单步有效性进行验证;只保留通过验证的chain候选集S,也就是
(4)再对的chain进行多数投票
4. 实验
4.1 benchmark
主要包括3类:算数推理、符号操作、数据理解
- 对于算术推理,我们使用以下基准:1 ) Add Sub ;2 ) Gsm8K;3 )MATH ; 4) AQuA。在这些基准中,AddSub和GSM8K数据集涉及中学水平的多步计算,以得出单个数字作为最终答案。MATH数据集提出了更具有挑战性的问题,需要将答案表示为LaTeX格式的数学表达式。这些问题涉及到线性代数、代数、几何、微积分、统计、数论等学科的概念。AQuA也有类似的挑战性问题,只是问题是多选题。
- 对于符号操作,我们使用Last Letter连接,其中模型的任务是将问题中提供的所有单词的最后一个字母串联起来。
- 对于数据理解,我们使用BIG - bench
4.2 演绎验证评价设置
对每个benchmarek采样100个推理chain,其中50个推理正确的,50个推理不正确
每条推理chain的ground-truth是由人类标注者决定的
4.3 答案抽取
从推理解决方案中提取答案,只保留model回答的最后一句话,然后使用正则表达式提取有效答案,以获得态度词,e.g:”yes”、“no”
i.识别“无回答”模式,标注为“no answer!”
ii.识别“回答-拆分”模式,将文本划分为若干块,使用文本的最后一个块来提取答案
iii.扫描剩下的文本,获得可能的最后答案
4.4 模型和参数
使用GPT3.5-turbo进行实验,同时也对LLaMa家族进行了实验(附录A)
使用两种方法比较推理链的验证accuracy
对于数据集问题及其由GPT-3.5-turbo ( ChatGPT)生成的推理链S,进行CoT 演绎验证精度的比较。我们比较了两种方法:
- 在不使用NP的情况下,验证由CoT提示生成的整个推理链(用"Do you think the above reasoning process is correct? Let’s think step by step "来提示ChatGPT,使得它检查在S中的任何推理步骤之间是否存在错误)
- 对NP格式生成的推理链进行step by step分解验证。
在后一种情况下,我们在验证每一个推理步骤时,只保留必要的前提。为了计算验证准确率,对于每一个数据集,我们随机抽取50个推理链是演绎有效的,50个推理步骤表现出不正确的推理。
table3结果表明:我们的方法在大多数数据集上取得了显著更高的推理验证精度。在有效链保持较低误报率的同时,有效地识别了错误链中的错误推理。
然而,我们观察到我们的方法在" last letters"任务上的有效性是有限的。我们假设这是由于任务的性质决定的,每一个后续的推理步骤都是以之前的所有步骤为条件的,由于前提之间的依赖性增加,对推理验证提出了更大的挑战。
NP和推理验证对于最终答案正确性的影响
(1)对于每个问题,我们指导语言模型以NP格式生成k = 10个候选的推理链,并对最终答案进行简单的多数投票,而不使用推理验证来筛选出推理链候选项;
( 2 )用推理验证方法筛选出候选的推理链,并在此过程中应用全体一致-多数投票( Unanimity-Plurality Voting,UPV )来确定最终答案。
最后在GPT - 3.5 - turbo ( ChatGPT )上进行答案准确率的比较;baseline选取了CoT 和 faithful CoT 。
所有方法都为每个问题生成k = 10的推理链,然后使用我们的演绎验证方法进行多数投票或推理链过滤。
虽然我们的主要目标是提高演绎推理的可信性和可靠性,但我们发现,在我们的NP格式中,促使了语言模型进行推理,在许多推理任务中,获得了与baseline相当或更好的最终答案准确性。进一步应用我们的演绎验证方法来过滤无效的推理链,我们观察到最终答案的准确性略有下降【导致这种下降的一个主要因素是过滤掉那些提供正确答案但表现出不正确中间推理的候选推理chains】
我们在表5中举例说明了一个例子,其中ChatGPT生成正确的最终答案,但分配不正确的前提数来支持第一个推理步骤。
对于该GSM8k问题的推理链候选项,ChatGPT生成正确的最终答案,但提供了不正确的前提数用于接地第一步推理。在"步骤1 "中,正确的前提数应该是# 1和# 2。我们的演绎推理验证方法有效地识别了这些推理错误,增强了推理过程的严谨性和可信性。值得注意的是,从候选推理链中移除一个正确答案对整体的最终答案正确性有轻微的负面影响。
我们注意到,在很多这样的情况下,我们的方法有效地识别了这些推理错误,从而增强了语言模型推理过程的严谨性和可靠性,尽管对最终答案的整体正确性有轻微的负面影响。
4.5 消融实验
变量1:是否只选择前提的最小子集
验证一个遵循我们NP格式的单个推理步骤
(1)利用所有前提pi进行验证,不考虑他们与的相关性,所以可能会引入不相关的上下文。
(2)遵循在NP中的设计,只用必要的上下文和前提。
利用我们的基于自然程序的逐步推理链分解方法,本消融研究有两个变量(1)有多少前提(2)shot个数对演绎验证准确性的影响。为了验证每一个推理步骤,我们要么使用全部的前提,要么使用前提的最小子集。对于每个数据集,我们随机抽取50条演绎有效的推理链和50个不正确的推理步骤。
我们会发现,在许多数据集上,移除无关前提显著提高了推理chain验证的准确率,凸显了该技术的重要性。
one-shot 如下
变量2:不同k对我们的UPV策略的影响
k’代表产生单步推理有效性预测的投票数;k’越多正确率越高,但是需要消耗的计算资源也越多
局限性
例子中的pennies是货币单位也是硬币;问题中是只想算硬币,但是推理过程中换算成了货币单位一起计算。在这种情况下,我们的演绎验证过程是无法发现这样的误读的。这样的上下文歧义在真实世界场景中很常见,突出了我们方法目前的局限性