译者序
这篇文章给我的最大的启发是:“实现一个会推理、会自己使用工具解决问题的 AI” 听起来很难,但其实可以归约成 “实现一个会编程的 AI”。
也就是说,如果哪天 AI 打leetcode、codeforce 比赛的水平变得很强了(前提是做新题,会做老题不算),我们就有实现 AGI 的条件了。
Abstract
最近,大型语言模型(LLMs)在执行算术和符号推理任务时表现出了令人印象深刻的能力,当在测试时提供少量示例(“少量提示”)时。这种成功的很大一部分可以归因于诸如“思维链”之类的提示方法,它们将LLMs用于理解问题描述并将其分解为步骤,以及解决问题的每个步骤。虽然LLMs似乎擅长这种逐步分解,但即使问题被正确分解,LLMs在解决方案部分也经常会出现逻辑和算术错误。在本文中,我们提出了程序辅助语言模型(PAL):一种新颖的方法,它使用LLM阅读自然语言问题并生成程序作为中间推理步骤,但将解决步骤卸载到运行时(例如Python解释器)。使用PAL,将自然语言问题分解为可运行步骤仍然是LLM唯一的学习任务,而解决则委托给解释器。我们展示了神经LLM和符号解释器之间的协同作用,涵盖了BIG-Bench Hard和其他基准测试中的13项数学、符号和算法推理任务。在所有这些自然语言推理任务中,使用LLM生成代码并使用Python解释器进行推理比更大的模型更准确。例如,使用CODEX的PAL在GSM8K数学字问题基准测试中实现了最先进的少量拍摄精度,超过了使用思维链的PaLM-540B绝对15%top1。我们的代码和数据可在http://reasonwithpal.com 公开获取。
1. Introduction
直到最近两年,推理一直被认为是大型语言模型(LLMs)尚未克服的最重要挑战之一(Marcus,2018; 2020; Garcez & Lamb,2020)。最近,LLMs在广泛的任务中取得了令人印象深刻的成功,包括常识(Wei等人,2021; Sanh等人,2021; Madaan等人,2022),数学(Lewkowycz等人,2022; Wu等人,2022; Mishra等人,2022)和符号推理(Yao等人,2022; Ahn等人,2022),使用少量提示(Brown等人,2020)。
这个过程已经被要求LLMs生成它们明确的推理步骤的方法加速,例如“思维链”(Wei等人,2022),“便笺”(Nye等人,2021)和“最少到最多”(Zhou等人,2022)提示。特别是,广泛使用的思维链(COT)方法向模型呈现达到最终答案所需的明确中间步骤。然后,模型预计将类似的分解应用于实际测试示例,并连续达到准确的最终答案(Ling等人,2017; Amini等人,2019)。然而,尽管LLMs可以将自然语言问题分解为步骤并执行简单算术运算,但它们在处理复杂算术(Hendrycks等人,2021; Madaan & Yazdanbakhsh,2022)或大数字(Nogueira等人,2021; Qian等人时表现急剧下降。 , 2022)。事实上,在对164B令牌的显式数学内容进行微调PaLM-based模型时,其两个最常见的失败据报道是“错误推理”和“错误计算”(Lewkowycz等人,2022)。
在本文中,我们提出了程序辅助语言模型(PAL):一种新颖的方法,它使用LLM阅读自然语言问题并生成程序作为推理步骤,但将解决步骤卸载到Python解释器上,并在图1中进行说明。这种卸载利用了可以将自然语言问题分解为程序化步骤的LLM,并且幸运地使用当代最先进的LLM预先训练了自然语言和编程语言(Brown et al. , 2020;Chen等人,2021a;Chowdhery等人,2022)。虽然自然语言理解和分解需要LLMs,但解决和推理可以通过外部求解器完成。这弥补了链式思维方法中的一个重要差距,即推理链可能是正确的,但产生错误的答案。
我们在13个算术和符号推理任务中展示了PAL的有效性。在所有这些任务中,使用Codex(Chen等,2021a)的PAL都优于使用链式思维提示的更大型模型,如PaLM-540B。例如,在流行的GSM8K基准测试中,PAL实现了最先进的准确性,超过了使用链式思维的PaLM-540B绝对15%的top1准确性。当问题包含大量数字时,我们称之为GSM-HARD的数据集,PAL比COT绝对高出40%。我们相信,神经LLM和符号解释器之间这种无缝协同是通向通用和稳健AI推理器的重要一步。
2. Background: Few-shot Prompting
少量提示利用大型语言模型的优势,通过一组k个示例来解决任务,这些示例作为测试时输入的一部分提供(Brown等,2020;Liu等,2021;Chowdhery等,2022),其中k通常是一个低位数的数字。这些输入输出示例{(xi,yi)} k i=1被连接在提示p≡hx1·y1i k hx2·y2i k…k hxk·yki中。其中“·”表示输入和输出的连接,“k”表示不同示例的连接。在推理过程中,测试实例xtest被附加到提示中,并将p k xtest传递给模型,模型试图完成p k xtest,从而生成答案ytest。注意,这种少量提示并不修改底层的LLM。
Wei等人(2022)还用思维链(COT)中间步骤增强了每个上下文示例。具体来说,在COT设置中,每个上下文示例都是一个三元组hxi,ti,yii,其中xi和yi是输入输出对,ti是从输入xi到输出yi所需步骤的自然语言描述。参见图1中的一个示例。有了额外的“思维”ti,提示被设置为p≡hx1·t1·y1ikhx2·t2·y2ik…khxk·tk·yki。在推理过程中,新问题xtest像以前一样附加到提示中并提供给LLM。关键的是,模型被分配生成思维ttest和最终答案ytest。这种提示模型首先生成推理过程ttest的方法提高了答案ytest在广泛任务范围内的准确性(Wang等人,2022a;Wei等人,2022;Zhou等人,2022;Wang等人,2022b)。
3. Program-aided Language Models
在程序辅助语言模型中,我们提出了一种方法,为给定的自然语言问题x生成思想t,它们是交错的自然语言(NL)和编程语言(PL)语句。由于我们将解决方案步骤委托给解释器,因此我们不会在提示中提供最终答案。也就是说,PAL中的每个上下文示例都是一对hxi,tii,其中tj = [s1,s2,…,sN],每个si∈NL∪PL,要么是NL或PL中的一系列令牌。因此完整的提示是p≡hx1·t1ikhx2·t2ik…k hxk·tki。
给定测试实例xtest,我们将其附加到提示中,并将pkxtest馈送到LM。我们让LM生成预测ttest,其中包含中间步骤及其相应的程序语句。
Example
图1的特写在图2中显示。虽然思维链仅将提示中的解决方案分解为自然语言步骤,例如Roger开始时有5个网球和2罐各3个网球,共6个,但在PAL中,我们还用其相应的程序语句增强了每个这样的NL步骤,例如网球= 5和购买的球= 2 * 3。这样,模型学习生成一个程序,该程序将为测试问题提供答案,而不是依赖LLM正确执行计算。 我们提示语言模型使用注释语法(例如Python中的“#…”)生成NL中间步骤,以便解释器将其忽略。我们将生成的程序ttest传递给其相应的求解器,运行它并获得最终运行结果ytest。在这项工作中,我们使用标准Python解释器,但这可以是任何求解器、解释器或编译器。
制作PAL提示
在我们的实验中,我们利用现有工作的提示(如果可用),否则随机选择与以前工作相同数量(3-6)的示例来为每个基准创建固定提示。在所有情况下,我们都将自由形式文本提示扩充为PAL风格提示,并在需要时利用编程结构(例如for循环和字典)。通常,编写PAL提示很容易且快速。
我们还确保提示中的变量名称有意义地反映它们的角色。例如,描述篮子中苹果数量的变量应具有诸如num apples in basket之类的名称。这使生成的代码与问题中的实体保持链接。在第6节中,我们展示了这些有意义的变量名称至关重要。值得注意的是,也可以增量运行PL段并将执行结果反馈给LLM以生成以下块。为简单起见,在我们的实验中,我们使用了单次事后执行。
本文重点介绍COT风格推理链,但在附录I中我们展示了PAL也改进了 Least-to-Most(Zhou等人,2022)提示,它引入了推理链将问题分解为子问题。
4. Experimental Setup
数据和上下文示例
我们使用三种广泛的推理任务进行实验:(1)数学问题(§4.1),来自包括 GSM8K(Cobbe 等人,2021)、SVAMP(Patel 等人,2021)、ASDIV(Miao 等人,2020)和 MAWPS(Koncel-Kedziorski 等人,2016)在内的多个数据集;(2)来自 BIG-Bench Hard(Suzgun 等人,2022)的符号推理(§4.2);(3)以及来自 BIG-Bench Hard 的算法问题(§4.3)。所有数据集的详细信息都显示在附录 H 中。对于所有可用 COT 提示的实验,我们使用与以前工作相同的上下文示例。否则,我们随机抽取一组固定的上下文示例,并为 PAL 和 COT 使用相同的集合。
基准
我们考虑三种提示策略:DIRECT 提示 - 使用问题和立即答案对(例如 11)作为标准提示方法,如 Brown 等人(2020)所述;思维链提示(COT)(Wei 等人,2022);以及我们的 PAL 提示。我们使用温度为 0 的贪心解码从语言模型中进行解码。除非另有说明,我们都使用 CODEX (code-davinci-002) 作为 PAL、DIRECT 和 COT 的后端 LLM。在数据集中,如果以前的工作提供了其他基础 LM 的结果,例如 PaLM-540B,则我们将其作为 COT PaLM-540B 包括在内。
4.1. 数学推理
我们在八个数学文字问题数据集上评估PAL。这些任务中的每个问题都是小学水平的代数文字问题。图3显示了一个问题和PAL示例提示的示例。我们发现,使用明确的NL中间步骤并不能进一步有益于这些数学推理任务,因此我们只保留了提示中有意义的变量名称。 GSM-HARD LLMs能够使用小数字进行简单计算。然而,Madaan & Yazdanbakhsh (2022)发现,流行的GSM8K数学推理问题数据集中50%的数字是0到8之间的整数。这引发了一个问题:LLMs能否推广到更大和非整数数字?我们构建了一个更难版本的GSM8K,我们称之为GSM-HARD,通过用更大的数字替换GSM8K问题中的数字。具体来说,一个问题中的一个数字被替换为最多7位数的随机整数。关于这个新数据集的更多细节请参见H.1。
4.2 符号推理
我们将 PAL 应用于 BIG-Bench Hard (Suzgun et al., 2022) 中的三个符号推理任务,这些任务涉及对对象和概念的推理:(1) COLORED OBJECTS 要求回答有关表面上彩色物体的问题。这项任务需要跟踪相对位置、绝对位置和每个物体的颜色。图 4 显示了一个问题和 PAL 提示的示例。(2) PENGUINS 描述了一张企鹅表和一些自然语言中的附加信息,任务是回答有关企鹅属性的问题,例如,“有多少只企鹅不到 8 岁?”。虽然 PENGUINS 和 COLORED OBJECT 任务都需要跟踪对象,但 PENGUINS 还描述了动态,因为问题中的企鹅可以添加或删除。附录 J.2 中的图 17 显示了一个问题、一条思路链提示和 PAL 提示的示例。(3) DATE 是一个日期理解任务,涉及从自然语言描述中推断日期,执行相对时间段的加减法,并具有一些全球知识,例如“二月有多少天”,并相应地执行计算。附录 J.3 显示了示例提示。
4.3 算法任务
最后,我们比较 PAL 和 COT 在算法推理方面的表现。这些是人类程序员可以根据问题的先验知识编写确定性程序的任务。我们试验了两个算法任务:OBJECT COUNTING 和 REPEAT COPY。OBJECT COUNTING 涉及回答有关属于某种类型的对象数量的问题。例如,如图 5 所示:“我有一把椅子,两个土豆,一个花椰菜,一个生菜头,两张桌子……我有多少蔬菜?”)。REPEAT COPY 需要根据指令生成单词序列。例如,如附录 J.6 所示:“重复四次鸭子这个词,但在中途也说嘎嘎”)。
5. Results
5.1 数学结果
表1显示了以下结果:在所有任务中,使用Codex的PAL在所有数据集中都设定了新的少量拍摄状态最先进的top1解码,超过了COTCodex、COTPaLM-540B和COTMinerva 540B,后者在明确的数学内容上进行了微调。 有趣的是,COT在一些数据集(如ASDIV)中也从Codex中获益,但在其他数据集(如SVAMP)中表现不如PaLM-540B。然而,使用PAL进一步提高了所有数据集的解决率。 GSM-HARD 在GSM-HARD(表1)上,DIRECT的准确率从19.7%急剧下降到5.0%(相对下降74%),COT的准确率从65.6%下降到20.1%(相对下降近70%),而PAL保持稳定在61.5%,仅下降14.3%。即使我们用包含大数字的提示替换了COT的提示(附录B),COT在GSM-HARD上的结果也没有改善。这表明PAL不仅在标准基准测试中提供更好的结果,而且更加稳健。事实上,由于PAL将计算卸载到Python解释器,所以只要生成正确的程序,就可以准确地执行任何复杂计算。 大数字还是错误推理?GSM-HARD上的失败主要是由于LLMs无法进行算术运算,还是问题中的大数字“混淆”了LM,生成了不合理的中间步骤?为了调查这一点,我们评估了COT为同一个问题的两个版本(带和不带大数字)生成的输出。我们发现,在我们分析的25个案例中,有16个案例中,COT生成了几乎相同的自然语言“思想”,表明主要失败模式是无法准确地进行算术运算。样本输出在附录表11中提供。
多样本生成 正如王等人(2022b)发现的那样,链式思维方法可以通过采样k>1个输出并使用多数投票选择最终答案来进一步改进。因此,我们重复了使用核采样(Holtzman等人,2019)的贪婪解码实验,其中p = 0.95,k = 40,如Lewkowycz等人(2022)和温度为0.7。如表3所示,这进一步将PAL的准确性从72.0%提高到GSM8K的80.4%,比使用相同数量样本的Minerva-540B高出1.9%。
5.2 符号推理和算法任务结果
符号推理和算法任务的结果显示在表2中。在彩色物体中,PAL比强大的COT提高了8.8%,比标准直接提示提高了19.4%。在企鹅中,PAL比COT提供了绝对14.1%的增益。在日期中,PAL进一步提供了11.4%的增益,超过了COT Codex、PaLM-540B和LaMDA-137B。
表2最右边的两列显示PAL接近解决对象计数问题,达到96.7%并比COT绝对提高23.7%。同样,在重复复制上,PAL大大超过了COT,绝对超过21.8%。令人惊讶的是,在重复复制上直接提示比COT表现更好。然而,在重复复制中,PAL比DIRECT提高了9.3%。
PAL对问题的复杂度敏感吗?我们检查了随着输入问题的复杂度增加(以COLORED OBJECTS问题中的对象数量衡量),PAL和COT的性能如何变化。如图6所示,PAL在所有输入长度上都优于COT。随着问题中对象数量的增加,COT的准确性不稳定且下降,而PAL始终保持接近100%。有关令牌级预测的更多分析,请参见附录G。
6. 分析
PAL是否能与较弱的语言模型一起使用?在第5节中的所有实验中,PAL都使用了code-davinci-002模型;但是PAL能否与较弱的代码模型一起使用呢?我们将PAL与COT进行了比较,当这两种提示方法都使用相同的较弱的基础语言模型code-cushman-001和code-davinci-001时。如图7所示,尽管code-cushman-001和code-davinci-001的绝对精度较低,但PAL相对于COT的改进在各个模型中保持一致。这表明PAL可以与较弱的模型一起使用,同时它的优势也能优雅地扩展到更强大的模型。
PAL是否能与自然语言的语言模型一起使用?我们还使用text-davinci系列对PAL进行了实验。图8显示了以下有趣的结果:当基础LM的“代码建模能力”较弱(使用text-davinci-001)时,COT比PAL表现更好。然而,一旦LM的代码建模能力足够高(使用text-davinci-002和text-davinci-003),PAL就会胜过COT,而且PAL text-davinci-003几乎与PAL code-davinci-002一样。这表明PAL不仅限于代码LM,而且如果它们具有足够高的编码能力,它也可以与主要针对自然语言训练的LM一起使用。
是因为Python提示还是解释器才使PAL更好?我们尝试生成Python代码,同时要求神经LM也“执行”它,而不使用解释器,遵循Nye等人(2021);Madaan等人(2022)。我们创建了类似于PAL提示的提示,只是它们不包括最终答案。这导致在GSM8K上解决率为23.2%,远低于PAL(72.0),仅比DIRECT高4.5个百分点。这些结果进一步证实了我们的假设:PAL的主要优势来自于与解释器的协同作用,而不仅仅是拥有更好的提示。附录B中提供了更多细节。关于代码提示优于文本提示的优势,请参见附录G。
变量名是否重要?在我们所有的实验中,我们都在PAL提示中使用了有意义的变量名,以便使模型将变量与它们所代表的实体联系起来。然而,对于Python解释器来说,变量名是无意义的。为了衡量有意义变量名的重要性,我们尝试了两种提示变体:
结果显示在图9中。在彩色对象和日期中,删除中间的NL注释但保留有意义的变量名(PAL-comment) - 与完整的PAL提示相比略有降低,但仍然比基线COT更高。删除变量名(PAL-var-comment)进一步降低了准确性,并且比COT表现更差。由于变量名在代码质量中起着重要作用(Gellenbeck & Cook, 1991; Takang et al., 1996),因此只有有意义的变量名才能为Codex提供便利,它主要是在有意义的名称上进行训练的,Madaan等人(2022)也发现了这一点。
7. 相关工作
Prompting
少量提示(Brown等人,2020)已被证明是一种有效的方法,适用于各种任务(Liu等人,2021),包括文本(Gehrmann等人,2021;Reif等人,2021;Wei等人,2021;Sanh等人,2021)和代码生成(Chen等人,2021b)。像链式思维提示(COT)这样的方法进一步解锁了各种推理任务,在各种基准测试中提高了模型的性能。然而,所有先前的方法都存在算术计算不准确和推理不正确的问题(Lewkowycz等人,2022;Hendrycks等人,2021;Madaan&Yazdanbakhsh,2022)。PAL通过将计算和部分推理卸载到Python解释器来避免这些问题,只要给定正确的程序,它就是正确的。此外,PAL不仅可以改善标准链式思维提示,还可以改善最少到最多提示(Zhou等人,2022),正如我们在附录I中所示。
带有外部工具的LMs
一些先前的工作已经为神经模型配备了专门的模块。例如,Cobbe等人(2021)使用计算器作为后处理进行算术运算,并且Demeter&Downey(2020)添加了用于生成城市和日期的专门模块。与这些工作不同,PAL为Python解释器生成代码,它足够通用以处理算术计算和日期,而无需专门模块和临时修复。Chowdhery等人(2022)和Wei等人(2022)也尝试过使用外部计算器;但是,在GSM8K上仅将Codex提高了2.3%(绝对值),并将PaLM-540B提高了1.7%,而PAL在同一基准测试上将Codex提高了6.4%(第5.1节)。与我们的工作类似,Chowdhery等人(2022)也尝试过生成Python代码来解决GSM8K基准测试,但他们的实验结果比使用链式思维的标准PaLM-540B低。Pi等人(2022)在计算器上对随机表达式的执行结果进行预训练模型,而不是像我们一样在测试时使用求解器。虽然他们的模型理论上可以比其他预训练LM更好地执行算术运算,但他们在SVAMP基准测试上的结果要低得多:使用T5-11B模型时为57.4%,而PAL在同一基准测试上达到79.4%而无需任何专门预训练。
在我们的工作预印本提交到arXiv之后不久, “program of thought prompting”(Chen等人,2022)另一项相关工作也提交到了arXiv。他们的方法在概念上与我们类似,但PoT(1)仅在数学问题上证明了有效性,而我们还证明了符号和算法基准测试方面的收益,并且(2)选择了特定于基准测试的提示示例,而我们使用与以前相同的提示示例工作以分离我们方法的好处与示例选择的好处。
语义解析
我们的工作也可以被看作是一种非常通用的语义解析形式,其中模型不是解析成严格的特定领域语言,而是生成自由形式的Python代码。一些工作使用上下文无关文法(CFG)来约束解码器,以生成特定领域的意义表示(Shin & Van Durme, 2021)或规范话语,这可以转换为类似Lisp的意义表示(Shin et al., 2021)。相比之下,PAL不需要任何约束或特定领域的表示,除了Python代码。此外,与其他特定领域语言相比,预先训练有Python的LMs更为丰富,使Python代码成为更为可取的表示。Andor等人(2019)为阅读理解任务生成特定任务的算术运算;Gupta等人(2019)设计了神经模块,如count来处理算术运算。PAL通过生成通用Python程序来推广这些工作,而无需定义专门的模块。技术上与我们最接近的工作可能是Binder (Cheng et al., 2022),但它主要解决了使用SQL和类似SQL的Python回答关于表格的问题。
8. 结论
我们介绍了PAL,一种新的自然语言推理方法,使用程序作为中间推理步骤。与现有的基于LM的推理方法不同,主要思想是将解决和计算卸载到外部Python解释器,而不是使用LLM来理解问题和解决问题。这样可以保证最终答案的准确性,前提是正确预测了程序化步骤。我们在BIG-Bench Hard和其他基准测试的13个任务中展示了LLM和Python解释器之间无缝协同。在所有这些基准测试中,PAL都超过了更大的LLM,如PaLM-540B,它使用流行的“思维链”方法,并在所有这些基准测试中都创造了新的最高精度。我们相信这些结果为未来神经符号AI推理器开辟了令人兴奋的方向。