逐次提示分解复杂问题(EMNLP2022) 原创 精华

发布于 2024-9-20 14:14
浏览
0收藏

摘要:回答需要做出潜在决策的复杂问题是一项具有挑战性的任务,特别是在监督数据有限的情况下。最近的研究利用大型语言模型(LM)的能力,通过在单次推理过程中演示如何输出中间推理步骤,以少量示例解决复杂问题。我们提出了“逐次提示”方法,通过迭代将复杂任务分解为简单任务,逐步解决,直到得到最终答案。逐次提示将复杂问题分解的监督与简单问题回答的监督解耦,使我们能够(1)在每个推理步骤有多次机会查询上下文示例,(2)独立于问题回答来学习问题分解,包括使用合成数据,以及(3)在大型语言模型表现不佳的推理步骤中使用定制组件。通常情况下,中间监督是人工编写的,这可能会导致高昂的成本。我们介绍了一种生成合成数据集的方法,可以用于引导模型分解和回答中间问题。我们的最佳模型(使用逐次提示)在DROP数据集的少量示例版本上与最先进的模型相比,绝对F1得分提高了约5%。

(注释:这篇论文提出了一种叫做“逐次提示”(Successive Prompting)的方法,用来解决复杂的问题。想象一下,你在做一道难题,这道题需要你先解决一系列的小问题才能最终得到答案。逐次提示的方法就像是在解难题时,每一步都问自己一个简单的问题,回答了这个简单的问题后,再继续问下一个,直到最终解决整个难题。

传统的方法可能会试图直接解决这个复杂问题,但这往往很难,而且可能会出错。逐次提示的方法则是先把复杂问题分解成多个简单的小问题,一个一个地解决,这样更容易得到正确的答案。

举个例子:

假设你正在看一场足球比赛,有人问你:“谁在上半场踢了最远的射门?” 这其实是一个复杂的问题,因为你不仅需要知道所有的射门距离,还要找出其中最远的那一个,并且确定是谁踢的。

用逐次提示的方法,你会这样一步步来解决这个问题:

1. 第一步:找出所有射门的距离

你先问自己:“上半场有哪些射门?” 然后你发现,有三个射门分别是12码、42码和33码。

2. 第二步:找出最远的射门

接下来,你问自己:“这三个射门中哪个最远?” 答案是42码。

3. 第三步:确定是谁踢的最远射门

然后,你再问:“是谁踢的42码的射门?” 答案是Matt Bryant。

4. 最后一步:得出最终答案

你现在已经知道了所有必要的信息,所以你得出了最终答案:“在上半场踢了最远射门的人是Matt Bryant。”

这个例子展示了逐次提示如何通过分解问题,将一个复杂问题一步步解决,直到得到正确的答案。)

1 引言

诸如HotpotQA (Yang et al., 2018) 和 DROP (Dua et al., 2019) 等组合阅读理解数据集激发了一系列模型架构,这些架构旨在通过从最终答案中进行弱监督学习来回答复杂问题。最近的一个研究方向是利用大型语言模型(LM)的能力,通过在回答复杂问题之前生成潜在的推理步骤,仅需少量示例即可解决组合任务(Wei et al., 2022; Nye et al., 2021; Karpas et al., 2022)。给定一个复杂的问题,这种方法首先从一个(问题、推理、答案)三元组数据集中找到最近的训练示例,然后将它们拼接起来以创建用于LM的输入。然后,使用大型语言模型对该输入进行提示,以生成所需的中间推理步骤,同时在一次运行中回答复杂问题。

尽管这种方法很有前景,但它放弃了该任务的许多现有方法的优势(Khot et al., 2021; Karpas et al., 2022),因为它将问题分解的监督与执行中间步骤的监督耦合在一起。此外,其非模块化特性使其无法在LM表现不佳的情况下使用替代的符号推理引擎。此外,模型仅接触到基于复杂问题近似度选择的一组上下文示例,而这些示例可能不包含针对所需中间步骤的最佳监督。

我们提出了“逐次提示”,通过这种方法,我们将复杂问题逐步分解为下一个简单问题进行回答,然后重复该过程,直到回答完复杂问题(图1)。这些步骤中的每一步都通过对LM的独立查询来完成。由于分解和回答步骤是分开执行的,我们可以将每个步骤的监督解耦,从而带来两个主要好处。首先,在进行上下文学习时,我们有多次机会选择不同的上下文示例,这些示例可以针对所执行的特定分解或回答步骤量身定制,而不是仅基于复杂问题选择一组示例。其次,在微调(无论是否使用上下文示例(Chen et al., 2022))时,我们可以独立提供每个步骤的训练示例,因此模型只需学习执行一个步骤。

逐次提示分解复杂问题(EMNLP2022)-AI.x社区

图1:逐次提示在DROP示例上的问题分解和问题回答阶段的分解示例。模型在预测要询问的简单问题和回答简单问题之间迭代。

(注释:图1展示了逐次提示(Successive Prompting)方法在复杂问题解答中的运作原理。通过这个图,我们可以理解逐次提示是如何将一个复杂问题分解成一系列更简单的问题,并逐步解决,直到获得最终答案。以下是该图片所表达原理的详细讲解:

图1中的步骤解析:

1. 复杂问题的提出:

图中展示的复杂问题是:“谁在上半场踢了最远的射门?” 这类问题通常涉及多个子问题,并且直接回答可能很困难。

2. 问题分解(Question Decomposition, QD):

使用逐次提示方法,模型首先会将这个复杂问题分解为更简单的子问题。例如,第一个子问题是:“上半场有哪些射门?” 这是一个较简单的问题,可以直接从给定的上下文中找到答案。

3. 回答简单问题(Question Answering, QA):

对于每个分解后的简单问题,模型会提供一个回答。例如,“上半场的射门分别是12码、42码和33码。” 这个回答成为下一步操作的基础。

4. 进一步分解:

之后,模型会继续根据之前的答案分解出下一个简单问题,例如:“在12码、42码和33码中,哪一个是最大的?” 这个问题又更进一步,将原始复杂问题简化为可以直接处理的内容。

5. 回答最终问题:

模型最终通过回答“谁踢了42码的射门?”得出了答案——“Matt Bryant”。这时模型判断已经没有更多的问题需要提出,因此输出最终答案。

图1中的关键原理:

- 逐步分解与解决:

逐次提示的核心思想是通过迭代分解复杂问题,将其逐步转化为多个可以独立解决的简单问题。每一步的分解和回答都是独立执行的,这使得模型能够在每个步骤中利用不同的上下文信息,从而提高复杂问题的解答准确性。

- 独立的监督与解耦:

通过将问题分解和问题回答的监督解耦,模型能够分别学习每个步骤的最佳解决方式。这意味着即使某些复杂问题的子问题非常相似,模型也能够根据具体的任务在每一步选择最相关的上下文示例进行学习和回答。

- 模块化与可插拔组件:

由于分解和回答步骤是分开的,这种方法允许在需要时使用专门设计的子模块。例如,对于某些简单问题,符号推理引擎可能比语言模型更有效,这样的组件可以在逐次提示的框架下被利用。)

这种解耦还使我们能够谨慎地将合成数据注入到学习过程中,例如帮助模型回答它以前无法回答的特定类型的简单问题,或帮助模型分解它以前不知道如何分解的新推理组合。由于这些步骤是独立的,我们可以隔离模型的失败并开发合成方法来弥补这些不足。它还允许我们在适当的时候,用其他专门设计的组件替换LM,以执行符号推理(Khot et al., 2021; Segal et al., 2020; Jin et al., 2021)。

我们使用DROP数据集的少量示例变体(Dua et al., 2019)演示了逐次提示的效用,选择了300个示例进行训练(无论是微调还是上下文示例选择)。这300个示例手动标注了简单的问答对作为分解。我们发现,在这种少量示例环境下,所有模型的表现都相当低,因此我们开发了一个合成数据生成器,它从半结构化的维基百科表格中生成复杂问题及其分解(Yoran et al., 2021)。这些合成数据不仅提供了复杂问题的监督,还提供了中间步骤的监督。我们将这些数据与来自DROP的300个(复杂)训练示例及其分解进行整合。在这种少量示例环境中,我们表现最好的逐次提示模型与同等监督下的最先进模型相比,F1分数提高了约5%。

2 分解复杂问题

组合性阅读理解的目标是通过潜在的顺序决策 z = z_1, z_2, ..., z_s 来回答在上下文段落 p 中给定的复杂问题 q(合称为 x),以得出最终答案 y。许多模型已经被提出用来实现这一目标,并且这些模型在监督和可解释性方面有不同的程度。在像Chain-of-Thought (CoT, Wei et al., 2022) 这样的提示方法中,潜在步骤是被监督的、可解释的句子;在其他模型中,这些潜在步骤可能是一个程序(Gupta et al., 2020; Chen et al., 2020),甚至只是模型中的(无监督的)隐藏状态(Segal et al., 2020; Andor et al., 2019)。

我们专注于那些采用上下文示例并生成离散的、语言编码的 z 的模型,CoT是其中的主要代表。我们将CoT的一般形式表示为,给定输入 x、语言模型编码器 L 和从查询索引 I 中获得的 N 个上下文示例——每个示例都包含一个包含复杂问题的段落 x_n、潜在步骤 z_n 和最终答案 y_n 这一三元组:

逐次提示分解复杂问题(EMNLP2022)-AI.x社区

2.1 逐次提示

在逐次提示中,我们将每个潜在步骤表示为一对简单的问题和答案 z_k = (q_k, a_k)(见图1中的示例问答对),这与CoT中将每个潜在步骤表示为陈述句不同。此外,CoT只查询索引 I 来获取上下文示例,并仅提示语言模型 L 一次来生成输出。然而,在逐次提示中,我们将 z 分解为多个问题和回答步骤,这使得我们有许多机会提示 L,并可能使用不同的、更适合每个步骤的上下文示例来生成简单问题。这也使我们能够在给定中间状态 z_k 的情况下重新编码上下文,这在需要长链引用的某些问题中非常有用(例如,图3中的排序计数示例)。我们可以将逐次提示的一般形式写为:

逐次提示分解复杂问题(EMNLP2022)-AI.x社区

逐次提示分解复杂问题(EMNLP2022)-AI.x社区


在这个一般形式中有三种模型输出:中间问题 q_k、中间答案 a_k 和最终答案 y。我们将第一种输出类型称为问题分解(QD),第二种称为问题回答(QA)。我们将最终答案预测视为问题分解的一种特殊情况,其中模型决定不再需要进一步分解,并输出最终答案,因此我们在问题分解和问题回答之间迭代交替,直到模型终止。

2.2 训练范式

我们迄今为止描述的逐次提示是在仅提供上下文示例的情况下进行的,因此不进行模型训练。然而,逐次提示也可以与模型微调相结合,在这种情况下,每个中间输出都被视为 L 的训练示例。在本节中,我们首先描述了如何在每个步骤选择上下文示例,然后详细说明如何使用这些示例进行模型微调。

上下文学习

在上下文学习中,一小部分训练示例直接作为提示提供给大型语言模型,然后再进行测试输入。这些示例是根据它们与测试输入的相似性从索引中选择的。对于逐次提示,我们创建了两个索引:I_D 用于查找与问题分解(QD)相关的示例,I_A 用于查找与问题回答(QA)相关的示例。索引 I_D 包含在每一步 k 的部分分解链,用于展示如何为每个复杂问题生成下一个问题。索引 I_A 包含训练数据中所有复杂问题的所有简单问答对。

在QD阶段,索引 I_D 会根据复杂的测试问题 q 和当前的步骤编号 k 进行查询,以选择与生成下一步问题相关的演示。在QA阶段,索引 I_A 会根据在QD阶段生成的简单问题 q_k 进行查询,以选择相关的简单问答对。图2展示了在每个步骤如何逐步执行上下文学习,直到QD输出特殊短语“没有更多问题需要问”,并给出最终答案。

逐次提示允许QA阶段访问从复杂问题中派生的简单问题,这些问题本来不会被Chain-of-Thought提示检索到,因为从表面上看它们与留出的复杂问题不相似,尽管它们共享相似的子问题。

逐次提示分解复杂问题(EMNLP2022)-AI.x社区

图2:使用上下文学习的逐次提示示例。用于监督和回答复杂问题的选择示例,以及预置上下文段落(为简化说明省略)由模型编码,以在问题分解(QD)和问题回答(QA)阶段生成问题和答案。在微调期间,仅以独立同分布(i.i.d.)的方式使用训练监督来学习QD和QA模型。

(注释:图2展示了逐次提示(Successive Prompting)方法如何通过上下文学习来逐步分解和回答复杂问题的具体操作过程。这张图通过具体示例,说明了在上下文学习和模型微调中的逐次提示是如何工作的。以下是图2所表达原理的详细讲解:

图2中的步骤解析:

1. 复杂问题的提出:

逐次提示方法首先接收一个复杂问题,并且还会预置相关的上下文段落(在图示中为了简化说明,这些段落被省略)。复杂问题可能涉及多个子任务或步骤,无法通过一次查询直接回答。

2. 问题分解阶段(Question Decomposition, QD):

在这个阶段,模型会根据当前的复杂问题选择相关的上下文示例,并生成第一个简单问题。例如,假设复杂问题是“巴斯的第二次射门比第一次长多少码?”模型可能首先提出一个简单问题:“巴斯的第二次射门是多少码?”这是整个解答过程中的第一个子问题。

3. 回答简单问题(Question Answering, QA):

一旦模型生成了简单问题,它会进一步利用相关的上下文信息,生成该简单问题的答案。在这个例子中,答案可能是“39码”。这个回答会成为下一步操作的基础。

4. 迭代分解与解答:

在生成并回答了第一个简单问题后,模型会继续进行下一轮的分解和解答。例如,在确定了第二次射门是39码之后,模型会生成下一个问题:“巴斯的第一次射门是多少码?”并回答它。这个过程不断迭代,直到所有简单问题被解答,最终复杂问题被完全解决。

5. 最终答案的生成:

当模型认为没有更多问题需要提出时,它会结合之前的所有答案,生成最终答案。例如,当模型得出第一次射门是28码时,它会计算出差值(39码-28码=11码),并将其作为最终答案。

图2中的关键原理:

- 逐步迭代解答:

逐次提示的核心思想是通过迭代步骤逐步解答问题。在每一个步骤中,模型仅处理一个简单的问题,而不是试图直接解决整个复杂问题。这种方法允许模型在每一步利用新的上下文信息,从而提高解答的准确性。

- 上下文学习中的示例选择:

在问题分解和问题回答的每个阶段,模型都会查询一个索引来选择最相关的上下文示例。这些示例并不是一开始就固定的,而是根据每个简单问题动态选择的。这种灵活性使得模型可以更好地适应具体问题的分解和解答需求。

- 独立同分布的监督(i.i.d.):

在模型微调期间,问题分解(QD)和问题回答(QA)的学习是分开进行的,并且是以独立同分布的方式进行监督的。这意味着模型在每个步骤都仅关注当前步骤的任务,而不需要考虑全局的复杂性。

总结:

图2的原理展示了逐次提示方法在上下文学习和模型微调中的操作流程。通过将复杂问题分解为多个简单问题,并在每个阶段动态选择相关示例进行学习,模型能够更准确地逐步解答复杂问题。)

模型微调

在模型微调中,我们使用基于T5(Raffel et al., 2020)的序列到序列模型。这些模型通常使用控制代码在多任务设置中训练,以在QD和QA任务之间切换,并共享模型参数。我们采用并扩展了文本模块化网络(TMNs,Khot et al., 2021)中引入的控制代码,用于训练我们的合成数据。TMNs在其可处理的操作类型方面有所限制,因为它们无法处理超出一阶推理的问题。我们使用合成生成的数据,允许我们处理DROP中更高阶推理问题。因为我们正在微调模型,所以我们可以使用特殊的标记来表示问题分解和其他分隔符,而不是图2中显示的自然语言提示,尽管内容相同。每个步骤使用的特定标记列在附录A中。

专用模块

逐次提示还允许我们使用专门的子模块来解决不同的QA任务,因为我们不再以端到端的方式执行QD和QA任务。像计数、差异、排序等算术运算对语言模型来说可能很有挑战性。因此,我们遵循Khot等人(2021年)的做法,构建了一个简单的数学子模块用于QA,它解析生成的简单问题的符号运算类型及其参数,然后以确定的方式执行它们。如果生成的简单问题无法解析为数学运算,我们会应用语言模型来解决它。

3 合成数据集

任何提示大型语言模型(LM)生成中间推理步骤来回答复杂问题的方法都需要一定量的这些推理步骤的监督数据。这类标注可能非常昂贵,并且通常需要专家知识。之前的工作通常依赖于少量手工编写的示例分解。我们发现,对于像DROP这样复杂多样的数据集,这样的小规模集合会导致模型表现非常差,即使对于大型模型也是如此。

为了缓解这些数据问题,我们提出了一种方法,使用易于解析的半结构化数据来合成生成复杂问题及其分解。我们展示了如何使用这些领域外的合成数据来启动模型的学习过程,以便它在使用有限的领域内监督数据进行微调时表现得更好。

生成过程:受到Yoran等人(2021年)的启发,我们使用了来自英文维基百科的半结构化数据表格,这些数据表格非常丰富。我们采用精心设计的模板,将表格中的行转换为段落,并使用单列标题来创建一阶简单问题,使用多列组合来生成更高阶的复杂问题。我们为10种简单操作生成了数据:计数(COUNT)、前k项(TOP(k))、后k项(BOTTOM(k))、过滤(FILTER)、求和(SUM)、比较(COMPARISON)、差异(DIFFERENCE)、否定(NEGATION)、收集(GATHER)和交集(INTERSECTION)。

我们在可能的情况下生成了一阶操作的更高阶组合。图3展示了使用表1作为上下文的几个简单操作的更高阶组合示例。完整的所有分解列表见附录A。根据模型的不同,我们使用算术操作的符号或自然语言版本。如果我们使用的是LM来执行算术操作,我们会输出自然语言;如果我们使用的是单独的符号推理引擎,我们会输出符号操作。我们总共生成了大约141K个复杂问题,这些问题生成了525K个用于问题分解(QD)的示例和257K个用于问题回答(QA)的示例。详见附录A的更多数据集统计信息。


逐次提示分解复杂问题(EMNLP2022)-AI.x社区

4 实验与结果

DROP数据集包含多种推理组合,这些组合的分布并不均匀。为了公平地表示DROP示例,我们首先使用在QQP数据集(Reimers和Gurevych, 2019)上训练的句子嵌入方法对这些示例进行嵌入。然后,我们使用余弦相似性为每个训练示例找到最接近的50个邻居问题。每个训练问题与其邻居之间的连接图被用来通过顶点覆盖算法获得300个问题,这些问题覆盖了大多数训练数据。我们手动标注了这300个示例,使用与我们的合成数据相同的格式分解成问答对(见图3)。对于合成示例,由于我们已经知道推理类型,因此我们从每种推理类型中均匀抽样示例进行演示。


逐次提示分解复杂问题(EMNLP2022)-AI.x社区

4.1 上下文学习

设置

我们使用带有基于QQP的句子嵌入(Reimers和Gurevych, 2019)的Faiss索引来索引所有问题。我们使用GPT-J(6B)模型,这是我们可以用包含6个上下文示例的提示进行使用的最大公开可用模型。

结果

在表2中,我们比较了不带任何提示的语言模型(标准方法)、带有链式思维提示(CoT)和逐次提示的性能。我们观察到,当只有合成数据可用时,逐次提示比CoT提高了3.5%的F1分数,而当有合成数据和DROP的300个注释时,逐次提示的F1分数提高了4.3%。在开发集上的最佳逐次提示版本(合成+DROP)在测试集上的F1分数为30.6%。我们还进行了一个消融实验,将符号计算器替换为语言模型,结果发现性能下降了1.5%的F1分数。这进一步表明,模块化方法优于试图解决所有任务的单一模型。


逐次提示分解复杂问题(EMNLP2022)-AI.x社区

4.2 模型微调

设置

我们使用基于T5的序列到序列模型,这是UnifiedQA(Khashabi et al., 2020)的大型版本,并以多任务方式训练了共享的问题分解(QD)和回答模型(QA)。我们使用附录A中描述的格式来提示UnifiedQA。对于符号问题,我们使用一个简单的计算器,它解析生成问题中的运算符和参数,并对检测到的参数执行离散运算。

为了防止模型学习错误的步骤,我们使用对比估计(Smith和Eisner, 2005)。特别是,我们首先训练模型两个周期,通过交叉熵损失生成输出序列(简单问题或答案)。然后我们继续训练,添加一个辅助损失项,这一损失项增加生成正确子答案的中间子问题的可能性,而减少生成错误子答案的可能性(Dua et al., 2021)。我们在每一步最多采样3个负样本。我们使用HuggingFace的transformers库来训练我们的模型,学习率为5e-5,最大输入长度为768。

由于维基百科中的上下文表格类型不同,合成数据集在不同推理类型中的分布不均匀。为了使不同推理类型的问题有一个平衡的表示,我们采用动态采样策略(Gottumukkala等,2020),即在每个周期开始时,从所有推理类型中选择80,000个实例,按其在上一周期中的表现下降比例分配实例数量。对于第一个周期,我们按照每种推理类型的原始大小进行采样。在推理期间,我们使用大小为5的束搜索来生成分解,在QD和QA阶段之间切换,直到QD达到分解结束标记“EOQ”或达到我们设置的最大步骤数(10步)。

基线模型

我们与多种符号和非符号模型进行了比较。作为非符号基线模型,我们使用了UnifiedQA(Khashabi等,2020),该模型在大量现有问答数据集上进行了预训练,还包括了在合成生成的组合QA对上预训练的PReasM模型(Yoran等,2021)。我们还包括了一个带有符号组件的基线模型,TASE(Segal等,2020)。该模型(以及类似的其他模型,如Jin等,2021;Andor等,2019)能够执行连续和离散运算的组合,这是DROP所必需的。TASE无需以特定语法表达分解,并且可以处理自然语言。我们选择了这个模型,因为它在完整的DROP数据集上接近最先进的性能,并且有公开的代码。

结果

在表3中,我们使用DROP开发集比较了在三种设置下不同符号和非符号模型的表现:(1)不使用DROP的任何训练数据(0-shot),(2)仅使用300个DROP示例中的问答监督,和(3)同时使用300个DROP示例的问答监督和分解。在这些设置中的每一个中,我们可以选择是否使用我们生成的合成数据进行训练。

逐次提示分解复杂问题(EMNLP2022)-AI.x社区

我们观察到,领域外合成数据普遍提高了模型性能,而这种提高在TASE模型中最为显著,接近20%的绝对提升。在没有合成数据的情况下,PReasM是表现最好的基线模型,但在有合成数据时,TASE超过了PReasM。此外,毫无疑问,从0-shot到复杂QA对,再到分解的监督量增加,模型表现也普遍提高。

最终,我们的方法,即结合符号推理引擎的微调逐次提示模型,取得了最佳表现,与具有类似监督的最先进模型相比(即TASE+合成数据加分解),F1分数提高了5.4。在我们最终的最佳模型(带分解的逐次提示)的测试集中,我们观察到F1分数为50.2,超过了具有类似监督的最先进模型(45.1 F1)5.1%。

总的来说,学会将复杂问题分解为简单QA对的方法在处理新领域的复杂问题时适应性很好,即使在没有领域内分解监督(带分解的逐次提示:51.3 F1)或仅有少量复杂QA监督(没有任何分解)的情况下也是如此。如果我们仅有有限的复杂QA监督(没有任何分解),则不可解释的符号模型表现最好(TASE + 合成数据没有分解:44.1)。这有两个原因。首先,这类模型可以捕获领域特定的答案先验,这可能导致不错的留出集表现(Dua等,2020;Agrawal等,2018)。其次,根据上下文,有时将复杂问题分解为QA对并不容易。

4.3 上下文学习与微调的比较

为了理解逐次提示方法在上下文学习和微调之间的性能差距,我们对QD和QA模块分别进行了上下文学习和微调的消融实验。我们发现,在回答结果为列表的简单问题时,上下文学习表现较差——这对于DROP数据集尤其重要,因为符号聚合通常应用于答案列表。当使用经过微调的QA模型时,我们看到与上下文QD模型相比,F1分数提高了约10%。此外,由于最终答案的表现依赖于QA模型的表现,因此除非QA模型能够处理QD模型生成的分解,否则使用更好的QD模型(微调的)对整体表现的提升不大。

4.4 定性示例

为了评估分解后的问答对的正确性,我们手动分析了在开发集上使用上下文学习(仅DROP)和模型微调(少量样本)生成的部分预测结果。我们通过随机抽取50个正确的预测来确定不正确的分解结果在何种情况下仍能产生正确的答案。我们观察到,QD阶段的准确率为上下文学习88%,微调模型为96%。分解错误的主要原因是分解后的问题与原始问题相同。例如,“谁踢了最长的射门?”有时可以在不分解问题的情况下直接回答,如果段落中只提到了一次射门的话。

我们还抽取了50个错误的预测,以确定上下文学习和微调设置下预测错误的原因。我们发现,最终预测错误主要有三类原因:错误的QA模型预测、错误的下一个问题预测(QD)以及超出范围的推理类型。对于上下文学习和微调模型,QA模型对简单问题输出错误答案的比例分别为40%和22%。第二类错误,由于分解不正确导致的,在上下文学习和微调设置下分别占30%。最后一类错误,由于合成生成的注释未覆盖的组合问题,在上下文学习和微调设置下分别占28%和46%。

在图4中,我们展示了一些正确和错误的预测,并指出了逐次提示方法的优点和缺点。逐次提示的主要优点是通过分解问题,我们能够为QA模型提供更好的监督。因此,在回答“上半场双方共踢了多少次射门?”时,它能够正确识别出上半场的射门,而不是像CoT那样返回整个比赛的射门次数。

逐次提示分解复杂问题(EMNLP2022)-AI.x社区

逐次提示分解复杂问题(EMNLP2022)-AI.x社区

逐次提示相对于微调模型(无论使用何种提示方式)的一个局限性是,示例的选择仅基于问题本身,而忽略了上下文。例如,DROP中有“百分比上有多少人不是德国人?”这样的问题,我们首先需要回答“百分比上有多少人是德国人?”,然后进行取反操作(即从100中减去)。单词“不是”会影响示例查找,选择涉及否定的分解,即使问题本身需要的是不同的操作。

逐次提示的另一个局限性是,有时难以分解问题,尤其是当问题涉及从段落中进行隐含推理时。例如,对于“韩国移民首先从哪一个港口出发,是仁川港还是韦拉克鲁斯港?”来说,从句子“之后他们乘火车前往韦拉克鲁斯港”中显式定义比较风格的分解是困难的。

5 相关工作

提示方法

提示作为测试大型语言模型(LM)推理能力的一种方法被引入(Brown et al., 2020)。在随后的工作中(Schick, 2022;Chowdhery等, 2022;Marasović等, 2021),提示技术被用作监督模型决策的一种机制,通过提供少量示例作为条件上下文来引导其对未见过的样本进行预测。诸如链式思维推理(Chain-of-Thought reasoning, Wei等, 2022;Zelikman等, 2022)等工作,尤其专注于组合性问题,在这些工作中,它们提供了推理链作为演示。在同期的工作中,最少到最多提示(Least-to-Most prompting, Zhou等, 2022)与我们的观点相似,即将问题分解为子问题。然而,在逐次提示中,问题分解和回答阶段是交替进行的,而不是像“最少到最多”那样先将问题分解成子问题,然后按顺序执行。在我们的方法中,下一个问题的预测可以访问之前已回答的子问题,这在需要长链引用的问题中非常有用。其他同时期的工作(Press等, 2022;Khot等, 2022)使用了非常大的语言模型(其规模是我们使用的模型的两倍多),并展示了更好的少样本泛化能力。像Perez等人(2021年)的工作展示了拥有合适的上下文示例对下游任务表现的重要性,进而促使了学习检索相关上下文示例的工作(Rubin等, 2021)。

非符号方法

大多数非符号方法是基于大量问答数据训练的序列到序列模型(Khashabi等, 2020;Yoran等, 2021)。

符号方法

神经模块网络等方法将复杂问题解析为预先设定的语法,并学习神经组件来处理符号数学运算(Gupta等, 2020;Chen等, 2020;Nye等, 2021),这些组件会被递归执行。在DROP数据集上,最先进的模型使用了BERT-based上下文模型与一个计算器相结合,这个计算器执行离散运算(Andor等, 2019;Segal等, 2020;Hu等, 2019)。类似于文本模块化网络(TMNs, Khot等, 2021)和MRKL(Karpas等, 2022)的工作与我们的方法最为接近。然而,它们在能够回答的简单问题类型(仅限单跨度)和能够执行的推理复杂度(仅限一阶)方面有所限制。此外,TMNs使用一个分类器来对生成的链模块进行评分并过滤掉不正确的问题分解,而我们使用对比估计来学习更好的问题分解器,因此不需要链评分器。

6 结论

我们提出了一种逐次分解复杂问题为简单问答对的方法,这种方法允许模块化的QD和QA系统可以独立进行训练和查询。在进行上下文学习时,我们展示了逐次提示比链式思维提示提高了4.6%的F1分数。当仅用一个能够处理列表类型问题的微调QA模块替换上下文QA模块时,我们进一步将整体表现提高了9.5%的F1分数。我们认为,将任务分解并分配给最合适的模型,无论是大型语言模型还是量身定制的组件,都比试图让一个大型语言模型独立解决整个任务更为有效。逐次提示展示了这种分解和分配任务的一种实现方式。

局限性

我们提出了一种通过迭代查找并填充信息需求来分解复杂问题为可解释的简单问答对的方法。这种执行复杂任务的概念非常通用,但我们仅展示了在一个特定环境下的一个具体版本的适用性。在更广泛地应用逐次提示时可能会面临许多挑战。最大的挑战是,这种方法至少需要一些分解数据,而这些数据可能难以甚至不可能获得。有些复杂问题并不容易被分解,而某些领域可能很难为其编写合成数据生成器。我们能够生成覆盖DROP大多数推理类型的合成数据,但其他类型的复杂问题可能不在我们的生成器覆盖范围内(例如,涉及常识或因果推理的问题)。

选择分解的粒度也是一个重要的难点。如果一个大型预训练模型可以直接回答“巴斯的第二次射门是多少码?”这样的复杂问题,我们应当让模型直接回答,而不是试图进一步分解它。因此,分解的合适粒度取决于基础模型的能力,而这些能力随着更新和更大的预训练模型的推出而迅速变化。有可能未来的模型版本不再需要分解来回答我们合成数据生成器覆盖的复杂问题,这将使我们的生成器过时。然而,预训练模型在不久的将来可能仍无法处理所有复杂场景,因此逐次提示和生成合成数据以弥补推理差距的想法仍应具有适用性,即使我们的具体应用可能变得过时。

此外,这种方法也增加了回答复杂问题的计算要求,因为它不再只对一个大型语言模型发出一次查询,而是多次查询才能回答一个问题。

本文转载自公众号AIRoobt ,作者:AIRoobt

原文链接:​https://mp.weixin.qq.com/s/7wbN1NL6pmZCB0udqOph6g​​​

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
相关推荐