Prompting with intermediate reasoning

本文介绍了如何利用思维树ToT提升大语言模型的决策解释性和问题解决能力,通过多步推理和工具使用框架ART增强模型的适应性和性能,以及展示零样本CoT如何激发模型的推理能力,而无需任务特定的微调或示例。这些方法增强了模型的普适性、模块化和适应性,同时提供了更好的可解释性和资源利用效率。
摘要由CSDN通过智能技术生成

Prompt reasoning


Chain-of-thought (CoT) promptingWei et al., 2022; Suzgun et al., 2022
Least-to-most promptingZhou et al., 2022
Self-AskPress et al., 2022
Ask-me-anythingArora et al., 2022
Successive promptingDua et al., 2022
decomposed promptingKhot et al., 2022
Let’s think step-by-stepZhang et al., 2022
Zero-shot-CoTLarge Language Models are Zero-Shot Reasoners
ToTTree of Thoughts: Deliberate Problem Solving with Large Language Models

一、通过思维树,让LLM有意识地解决问题


  • Tree of Thoughts: Deliberate Problem Solving with Large Language Models.
  • https://github.com/kyegomez/tree-of-thoughts(NOT the correct implementation)

1.1 目的

       思维树ToT让语言模型通过考虑多种不同的推理路径和自我评估选择来进行有意的决策,并在必要时向前或向后进行全局选择,提高语言模型在需要复杂规划或搜索时解决问题的能力

       研究表明,人有两种参与决策的模式:

  • 快速、自动、无意识的模式("系统1");
  • 缓慢、慎重、有意识的模式("系统2");

       这两种模式已经与机器学习中使用的数学模型建立相关联系。语言模型的简单联想标记级别选择类似于“系统1”,深思熟虑的规划过程类似于“系统2”,它思考的深入,受益更大,可能会对当前模型决策的方式提供借鉴意义。“系统2”主要表现:

  • 维护和探索当前选择的不同备选方案,而不仅仅选择一个;
  • 评估当前状态并积极展望未来或回溯以做出更多全局决策;

       当前文本生成的语言模型大多数是自回归,按照token从左到右的决策过程,依次生成每个字符的范式,例如GPT、PaLM。利用“系统2”,维护一个思维树,其中每个思维是一个连贯的语言序列,作为问题解决的中间步骤,这样的高级语义单元使语言模型能够通过一个有意的推理过程自我评估不同中间思维从而解决问题。解决文本生成大模型的如下问题:

  • 局部没有探索其它选择;
  • 全局没有前瞻、回溯

        真正的问题解决过程涉及反复利用可用信息来启动探索,进一步揭示更多信息,直到最终发现解决方法,思维树ToT则允许模型探索多种思想推理路径,把所有问题看作是在一棵树上的搜索,树上的每个节点代表着一个状态(解决方案),分支代表采取相应方案对应的操作,树类似于人的逐步思考路径。

1.2 方法

       从20世纪50年代开始,Newell、Shaw和Simon的规划过程的研究中获得灵感,基于这种方案作者提出了一种用于语言模型的通用问题解决的思维之树(ToT)框架。这种通过语言进行搜索启发式的实现是人类解决问题的特征,先前的搜索启发式要么是编程的,要么是学习的,作者将这种基于语言的生成和评估多样思维的能力与搜索算法(如广度优先搜索BFS或深度优先搜索DFS)相结合,这些算法允许对思维之树进行系统的前瞻和回溯式探索。ToT的具体实现包括以下四个过程:

  • 将中间过程分解为思考步骤;
  • 从每个状态产生潜在的思维;
  • 启发式地评估状态;
  • 使用什么搜索算法;

1.2.1 思考分解(Thought decomposition)

       CoT 在没有明确分解的情况下连贯地对思想进行采样,而 ToT 利用问题属性来设计和分解中间思想步骤。

       虽然CoT样本可以连贯地表达思想而无需显式分解,而ToT则利用问题的特性来设计和分解中间的思考步骤。根据不同的问题,一个思考步骤可以是几个词(填字游戏),一行方程式(24点游戏)或者是一个完整的写作计划段落(创意写作)。总的来说,一个思考步骤应该足够“小”,以便语言模型可以生成有前景且多样化的样本(例如,生成整本书通常太“大”而无法连贯),同时又足够“大”,以便语言模型可以评估其解决问题的前景(例如,生成一个标记通常太“小”以至于无法评估)。

1.2.2  思考生成器(Thought generator)

       给定一个树形状态s = [x, z1, …, z_i],考虑两种策略来生成下一个思考步骤的k个候选项:

  • 取样:从CoT提示中产生i.i.d.的思维,适用于思维是一段话(思维空间丰富)。
  • 提议:当思想空间比较受限时(例如每个思想只是一个词或一行字),这种方法效果更好,使用一个propose prompt依次提出思维。

1.2.3 状态评估器( State evaluator )       

       给定一组不同状态的前沿,状态评估器评估它们在解决问题方面的进展情况,作为搜索算法确定哪些状态继续探索以及以哪种顺序的启发式方法。作者提出使用语言模型有意识地推理状态。在适用的情况下,这种有意识的启发式方法可以比编程规则更灵活,比学习模型更高效。与思考生成器类似,作者考虑两种策略来评估状态:

  • 估值(评估该状态为sure/likely/impossible)。独立评估每个状态:V (pθ, S)(s) ∼ p value θ (v|s) ∀s ∈ S,其中一个值提示根据状态s生成一个标量值v(例如1-10)或分类(例如sure/likely/impossible),这些值可以启发式地转换为值。这种评估性推理的基础可以因问题和思考步骤而异。在这项工作中,通过少量的前瞻模拟(例如快速确认5、5、14可以通过5 + 5 + 14达到24,或者“hot_l”可以通过在“_”处填充“e”来表示“inn”)以及常识(例如1 2 3太小无法达到24,或者没有以“tzxc”开头的单词)来探索评估。前一种方法可能会提高“好”的状态,而后一种方法可以帮助消除“坏”的状态。这种评估不需要完美,只需要近似即可。
  • 投票。 在不同状态之间进行投票:V(pθ,S)(s) = 1[s = s∗],其中“好”状态s∗ ∼ p vote θ(s∗|S)是通过在投票提示中有意地比较S中的不同状态来进行投票。当直接评估问题的成功程度更加困难时(例如段落连贯性),自然而然地可以比较不同的部分解决方案,并投票选择最有希望的一个。这与“逐步”自洽策略类似,即将“要探索的状态”视为多项选择问答,并使用语言模型样本进行投票。

1.2.4 搜索算法(Search algorithm)

  • 广度优先搜索(BFS)每步都维护一组最有希望的b个状态。这在“24点游戏”和“创意写作”中使用,其中树的深度有限(T ≤ 3),并且初始思考步骤可以评估和修剪为一个小的集合(b ≤ 5)。
  • 深度优先搜索(DFS)首先探索最有希望的状态,直到达到最终输出(t > T),或者状态评估器认为从当前s无法解决问题(对于一个值阈值vth,V(pθ, {s})(s) ≤ vth)。在后一种情况下,从s开始的子树被修剪以便以牺牲探索而换取利用。在两种情况下,DFS会回溯到s的父状态以继续探索。

1.2.5 核心代码

以上四个步骤:

1.3 效果

1.3.1 二十四点

       从网上爬到了1362个二十四点的题目,按照难度排序后选取难度序号为901-1000的100个游戏作为测试集。以下三个对比:

  • 标准IO:prompt带有五个in-context的示例,采样100次获得平均性能。
  • 思维链CoT:在输入和输出对之间使用三个中间方程。例如:「输入是 4 9 10 13」 →「 13 - 9 = 4(left:4 4 10)」 → 「10 - 4 = 6(left:4 6)」→ 「4 * 6 = 24(left:24)」。采样100次获得平均性能。
  • 思维链-自一致CoT-SC:明确给出“剩下的”提示词,并提示模型输出一些可能的下一步,如果迭代的结果不正确,以历史记录为条件提示“反思自己的错误,并生成一个精炼的答案”。
  • ToT:从100个CoT样本中获取最常见的输出,明确给出四个数字的提示词,并提示模型输出一些可能的下一步,进行广度优先搜索(BFS),在每一步中保留最好的五个候选项,评估候选结果的可能性,每步采样3作为平均性能,以促进正确的解决方案,最多进行十次迭代。

       (第一步CoT损失值大。)

1.3.2 创意写作

       创意写作任务的输入是 4 个随机句子,输出应该是一个连贯的 4 个段落,分别以 4 个输入句子结尾。这样的任务是开放式和探索性的,挑战创造性思维和高级规划。

       IO和CoT的prompt都是零样本的,提示 LM 在给定输入约束和最后生成的段落为条件的情况下直接生成连贯的段落。ToT提示 LM 首先制定一个简短的计划然后编写段落,即计划作为中间思考步骤。

       每个任务生成 10 个 IO 和 CoT 样本。构建深度为 2 的 ToT(并且只有 1 个中间思维步骤),首先生成 k = 5 个计划并投票选出最佳计划,然后类似地根据最佳计划生成 k = 5 个段落,然后投票给最好的。这里的广度 b = 1,因为每一步只保留一个选择。zero-shot提示是分析生成的选择,得出最有可能的指令”用于在以上两个步骤中进行5次投票。

       可以认为新的思想可以从提炼旧的思想中产生,而不是i.i.d.或按顺序产生。

       由GPT4段落连贯性打分+人类评分。

1.3.3 填字

       5×5 迷你填字游戏,相比以上两个实验,它需要更深入的思考。解决这个问题可以通过大规模的检索而不是利用LM的能力来解决。作者旨在探索LM作为一般问题通用解决者的局限性,探索LM如何探索自己的思维并且通过深思熟虑的推理来启发式指导自己。

  • IO:prompt提供5个输入输出对的示例;
  • CoT:包含了水平方向和垂直方向按序排列的中间词语的提示。
  • ToT:提示 LM 为不同的想法提供置信度,将这些跨提案汇总以获得下一个要探索的想法的排序列表。DFS探索最有可能的后续单词线索,直到状态不再可能,然后回溯到父状态探索替代选项。为了易于处理,不进行更改任何已经填充的内容。

       三个层面评估(1.3.2图):

  • 正确字母的一部分(每个游戏中25个);
  • 单词(每个游戏中10个);
  • 游戏成功率;

1.4 总结

       使用ToT风格的反事实决策考虑下一阶段的潜在选择,而不是预测下一个token,提高了模型决策的可解释性以及和人类对齐的可能性。ToT作为使用语言模型进行一般问题解决的方法优点如下:

  • 普适性。IO、CoT、CoT-SC和自我完善可以看作是ToT的特例,即有限深度和广度的树;
  • 模块化。基本语言模型以及思考分解、生成、评估和搜索过程都可以独立变化;
  • 适应性。可以适应不同的问题特性、语言模型能力和资源限制;
  • 方便性。不需要额外的训练,只需一个预训练的语言模型即可;

       ToT存在的问题:

  • prune有时候评估器会做出错误的“impossible”状态评估导致错误剪枝,这可能是因为游戏设计的问题。如果没有好的剪枝策略,游戏在指定的步数无法完成;
  • 可能会带来更大的资源消耗,很多任务可能不需要ToT,GPT-4就能解决的很好;
  • ToT让模型更自主、智能地进行决策,解决问题。这可能会带来一些潜在的风险;

二、LLM自动多步推理及其工具使用


  • ART: Automatic multi-step reasoning and tool-use for large language models.
  • https://github.com/ bhargaviparanjape/language-programmes

2.1 目的

       上下文学习使得大规模语言模型能够通过使用自然语言指令和少量演示来迅速适应新任务,作为对LLM的提示。虽然这种方法避免了对大规模数据集进行注释甚至托管LLM本身,但在多步推理、数学和获取最新信息等方面存在严重的性能限制。为了解决这些限制,最近的研究提出了让LLMs模仿思维链(CoT)进行多步推理或者为它们提供工具(如计算器或问答模型)以实现更复杂的推理步骤。然而,现有的链式推理和工具使用方法难以扩展到新的任务和工具,需要进行微调或为特定任务或工具进行定制的提示工程。

       在本文中,提出了自动推理和工具使用(ART)框架,不用手工制作特定于任务的演示,该框架自动生成新任务实例的分解(多步推理)。该框架还在每个步骤中选择并使用最合适的可用工具(如搜索引擎和代码执行)。给定一个新任务,ART从任务库中检索相关任务的演示,以实现少量分解和工具使用。这些演示遵循一种灵活但结构化的查询语言,以便轻松解析中间步骤,停止生成以调用外部工具,并在包括这些工具的输出后恢复生成。ART向LLM提供了如何分解几个相关任务实例的演示,以及如何从工具库中选择和使用这些演示中表示的任何工具。这鼓励模型从演示中推广,以零次分解新任务并在适当的位置使用工具。它还使用户能够通过简单更新任务和工具库来修复推理链中的任何错误或添加新工具,在必要时提供新的演示。

2.2 方法

2.2.1 Task Library

       作者为Big-Bench中的一小组初始任务构建了一个程序库,这是一个协作基准,用于衡量语言模型的能力和限制。Big-Bench任务涵盖了传统自然语言处理、数学、常识推理和问答等多个类别。

       Constructing the task library:作者确定了在BigBench的超过一半任务中都有用的五个技能,这些任务涵盖了英语文本分类或生成短答案。然后从每个聚类中选择2-4个任务,并为每个任务的几个实例编写程序(分解),包括对外部工具的调用和这些工具的实际输出。根据这些技能将基准中的任务分组为以下几个类别:

  • 算术:算术和代数问题。
  • 代码:生成和执行Python代码。
  • 搜索和问题分解:需要搜索的单步或多步问题。
  • 自由形式推理:用自然语言逐步解释推理过程。
  • 字符串操作:重新格式化/编辑字符串,检查字符串蕴含等。

       Program grammar:程序格式必须在任务输入、步骤和工具调用方面具有灵活性,以便涵盖各种自然语言处理任务。为此定义了一个查询语言,该语言扩展了Khot等人的分解提示格式,因为它可以按顺序表示分解的推理步骤,并结合对外部工具的函数调用。每个程序由一系列节点组成 - 任务输入节点、多个子步骤节点和一个答案节点。输入节点包含任务名称、描述任务的简单指令以及任务实例的输入:“回答这个高中物理问题。输入:Hector yanks…”。输入节点后跟一个子任务节点的序列,表示为(查询,答案)pair “Q1:…,#1:…”。子任务查询Qi具有子任务名称和子任务输入(“Q1:[搜索]公式是什么…”),而子任务答案#i只是子任务的输出(“#1:水平分量(Fx)可以计算…”)。程序以一个虚拟子任务(“Q3:[EOQ]”)结束,后跟一个最终答案节点(“答案:59N”)。

       Task Retrieval:给定一个新任务,ART从任务库中检索N个任务来构建一个动态多任务提示。根据可用的数据探索两种检索相似任务的策略。如果新任务有少量的标记示例(约50个),我们遍历所有五个任务簇,并从每个簇中选择一些任务程序来组成提示。最终,在预测所有未标记示例时,选择在验证集上性能最高的任务簇。尽管这种策略需要一个验证集的输入-输出对,但生成分解程序不需要额外的监督。在第二种策略中,我们使用任务对创建一个少样本提示,其中每个任务包括一个名称、说明和几个输入-输出示例。对于每一对任务,我们提供一个“相似”或“不相似”的标签,并进行推理(例如,“它们是相关的,因为它们需要解决算术问题”)。在运行时,我们将测试任务与任务库中的每个任务配对,并根据“相似”和“不相似”之间的对数概率比选择排名最高的任务。

2.2.2 Tool Library

       每当子任务查询名称与任务库中的工具名称匹配时(例如,“Qi:[search]”),生成会停止,并在调用工具并将其输出合并到部分完成的程序后恢复。我们在工具库中引入了以下工具(所有这些工具在任务库中都有演示)。并描述了用于表示这些工具及其输入的符号。

       Search:使用SerpAPI2进行搜索,它提供了一个用于Google搜索的API。搜索的输入是LLM在“Qi: [search]”之后生成的序列。使用的时候提取答案框片段,或将前两个搜索结果片段合并在一起。搜索查询是原始输入后跟着“水平张力力的公式是什么?”,输出是“…水平分量(Fx)可以通过Ftens*cosine(θ)计算…”。

       Code Generation:使用Codex模型进行代码生成。代码生成的输入是在子任务查询符号“Qi: [生成python代码]”之后由语言模型生成的序列。这个参数是用于代码生成的指令,并作为Python中的多行注释传递给Codex。例如,Codex被提示使用指令““使用公式 Fx = Ftens * cosine(θ) 来解决…””作为注释,并生成“T = 72.0,theta = 35.0, …, Fx = T*math.cos(radians)”,这些代码片段将被附加到不完整的程序中。

       Code Execution:预先安装了算术、符号和科学计算包的虚拟Python环境中运行Python代码。代码执行的参数是上一个子任务的答案序列“#(i − 1) : . . .”,即要执行的Python代码片段。对于 i = 1,任务输入被用作参数,因为它可能包含要执行的代码片段。如下图,执行了先前步骤生成的代码片段,并将变量“Fx”的值添加到不完整的程序中。

2.2.3 Human feedback

       ART是专门设计成适应人类反馈的,因为它不需要额外的微调。因此,用户可以立即将反馈纳入到ART中,通过编辑任务库和/或工具库。由于ART生成的多步推理程序是可解释的,我们探索以调试的形式进行反馈,即用户编辑现有程序而不是从头开始创建程序。这些编辑可以是纠正子步骤的输出、添加/删除子步骤(带有适当的输入和答案)、添加新工具的调用等形式。如下图,用户通过添加两个子步骤来编辑程序,以便将答案四舍五入到最近的整数,并将适当的计量单位包含在答案中。这个反馈展示了任务的适当分解,因为这些操作仍然由LLM执行(工具库没有“[算术]”或“[添加单位]”的API)。相反,下图中,用户演示了使用字典“[查找]”并将其实现为工具库中的一个工具。虽然我们的大多数实验不依赖这样的反馈(因此度量“Zero-shot”任务迁移,没有推理/工具使用的监督),但我们展示了这些简单操作可以大大提高目标任务的性能。

2.3 效果  

2.3.1 BaseLines

  • Few-shot/Direct:使用输入输出对来提示语言模型(LLMs),但没有中间推理过程。我们在BigBench中使用3个示例,在MMLU中使用5个示例,这是之前的研究所采用的方法。我们对GPT-3和Codex两种模型进行评估,并报告其中较高的结果。
  • Auto-CoT:一种基准模型,自动生成自然语言的多步推理。首先使用随机的5个示例来引出CoT风格的推理(输入+让我们一步一步思考)。这些示例及其生成的输出形成了其他未见过的任务示例的提示。这个基准模型是自由形式的,不包括工具,因此可以验证我们的查询语言和任务库的有效性。我们对GPT-3进行了评估。
  • ART-tool:关闭工具使用的ART模型,即LLM生成每个子步骤的输出,以验证使用工具的收益。
  • GPT-3 Best:最佳的已发布的GPT-3/Codex(175B)结果,包括多步分解和/或工具使用。这些通常包括额外的人工监督来分解推理步骤,并使用外部工具提高性能(通过精心构造的提示)。

       作者使用InstructGPT (text-davinci-002)作为冻结的语言模型,使用Codex作为代码生成工具,温度设置为0.3。我们将提示中的种子任务数量设置为N = 3,并使用每个任务的2个示范程序。我们按照Srivastava等人的方法测量每个任务的首选评分指标,并报告5次运行的平均性能。

       为15个多样化的BigBench任务构建了一个任务库,并在BigBench的19个未见测试任务、6个MMLU任务以及相关工作中使用的各种任务(如SQUAD、TriviaQA、SVAMP、MAWPS)上评估了ART。在32/34个BigBench和所有MMLU任务中,ART始终能够与自动生成的CoT推理链相匹配或超越,平均超过22个百分点。特别是在工具使用方面,与不允许使用工具时相比,ART的性能平均提高了12.3个百分点。在未见的BigBench和MMLU任务中,ART的直接少量示教改进了平均10.8%的百分点。在需要算术和算法推理的未见任务中,ART的改进尤为显著,相比直接的少量示教,提高了12.5%,并且对于使用分解和/或工具使用进行监督的GPT3的先前最佳结果提高了6.1个百分点。最后,ART通过简单更新任务和工具库与新的演示实现了人类干预和推理过程的改进,使得在任何具体任务上通过轻微的人类反馈来提高性能非常容易。在12个测试任务中,ART在获得额外人类反馈的情况下平均超过GPT3的最佳结果20个百分点。

2.3.2 Results on the task library

       ART drastically improves performance over few-shot learning (+14.9 % points on average), in line with prior work on CoT.Tools are called in ≈ 95% of test instances, and significantly improve performance (+7.91 % points). Gains from tool use are particularly significant for arithmetic tasks that benefit from representing the arithmetic problem as code that executes complex arithmetic accurately (+21.85 on average).

2.2.3 Test tasks (cross-task transfer)...

2.4 总结

       作者介绍了ART,一种无梯度方法,用于大型黑盒语言模型的自动多步推理生成和自动工具使用。我们的主要贡献包括一个轻量级语法来表示多步推理作为一个程序(包括工具调用和参数),一个可扩展的种子任务库,用于编写程序,并且包含有用的外部工具库,如搜索、代码生成和执行。可解释的推理框架还允许人类改进任务分解和工具使用以提高性能。在BigBench和MMLU基准测试中,ART在少样本提示和对未见任务的CoT推理的自动生成方面实现了显著的改进,并在手工制作的CoT提示中在加入人类反馈后性能大幅提升。ART还受益于自一致性方法,或者采用针对工具使用进行训练的新的更强大的LLM。

三、Zero-Shot推理


3.1 目的

       CoT是手动设计提示的,所以隶属于Few-shot-CoT, 需要一定的人工成本。为进一步简化CoT的过程,简单的将”Let's think step by step“放进prompt message, 让LLM自动生成CoT, 成了Zero-shot-CoT。

        只需在每个答案之前添加“让我们逐步思考”,LLMs就可以成为体面的零样本推理者。实验结果表明,我们的零样本CoT在使用相同的单一提示模板的情况下,在各种基准推理任务上明显优于零样本LLMs的性能,包括算术MultiArith、GSM8K、AQUA-RAT、SVAMP等,符号推理(最后一个字母,抛硬币),以及其他逻辑推理任务(日期理解,追踪洗牌对象),而无需手工制作少样本示例,例如使用大规模InstructGPT模型(text-davinci-002)将MultiArith的准确率从17.7%提高到78.7%,将GSM8K的准确率从10.4%提高到40.7%,以及与另一个现成的大型模型,具有540B参数的PaLM相似数量级的改进。这个单一提示的多样性涵盖了非常多样的推理任务,暗示了LLMs中未被挖掘和研究的基本零样本能力,表明高级、多任务的广泛认知能力可以通过简单的提示来提取,它本质上是任务无关的,并且能够引发跨多个任务的多跳推理,只需一个模板。作者希望不仅能作为具有挑战性的推理基准的最小最强零样本基准,而且还强调了在制定微调数据集或少样本示例之前,仔细探索和分析LLMs内隐藏的巨大零样本知识的重要性。

3.2 方法

3.2.1 Two-stage prompting

       Zero-shot-CoT使用了两次提示来提取推理和回答。相比之下,零样本基线是使用了“答案是”的提示形式来提取正确格式的答案。少样本提示无论是标准的还是CoT,通过显式地设计少样本示例的答案以符合这些格式,避免了需要这种答案提取提示

       Few-shot-CoT 需要在每个任务中仔细进行人工设计,以具有特定答案格式的少量提示示例,而Zero-shot-CoT则需要更少的工程设计,但需要两次提示LLMs。

3.2.2 1st prompt: reasoning extraction

       首先使用一个简单的模板将输入的问题x修改为提示x0,模板为“Q: [X]. A: [T]”,其中[X]是x的输入槽,[T]是手工制作的触发句槽,用于提取思路以回答问题x。例如,如果我们使用“让我们一步一步地思考”作为触发句,那么提示x0将变为“Q: [X]. A: 让我们一步一步地思考。”。更多触发例子。然后,提示文本x0被输入到语言模型中,并生成随后的句子z。

3.2.3 2nd prompt: answer extraction

       使用生成的句子z和提供的句子x0从语言模型中提取最终答案。具体来说,简单地将三个元素拼接在一起,即"[X0] [Z] [A]":[X0]表示第一个提示x0,[Z]表示在第一步生成的句子z,[A]表示用于提取答案的触发句子。这一步的提示是自我增强的,因为提示中包含了由同一语言模型生成的句子z。在实验中,根据答案的格式使用略微不同的答案触发器。

3.3 效果

3.3.1 数据集

       在四类推理任务的12个数据集上评估了提案、算术、常识、符号和其他逻辑推理任务。
       对于算术推理,考虑了以下六个数据集:SingleEq 、AddSub、MultiArith、 AQUA-RAT、GSM8K、SVAMP。前三个来自经典的Math World问题库,后三个来自最近的基准测试。SingleEq和AddSub包含较简单的问题,不需要多步计算来解决任务。MultiArith、AQUA-RAT、GSM8k和SVAMP是更具挑战性的数据集,需要多步推理来解决。

       对于符号推理,使用了Last Letter Concatenation和Coin Flip。

       对于其他逻辑推理任务,选取了Date Understanding和Tracking Shuffled Objects。Date Understanding要求模型从上下文中推断出日期。Tracking Shuffled Objects测试模型根据初始状态和一系列对象洗牌来推断出对象的最终状态。

       一共尝试了17种模型。主要实验是使用Instruct-GPT3(text-ada/babbage/curie/davinci-001和text-davinci-002),原始的GPT3(ada、babbage、curie和davinci)以及PaLM等。 

3.3.2 Comparison with other baselines

       Zero-shot-CoT与Zero-shot在每个数据集上的准确率如下表。Zero-shot-CoT在MultiArith,GSM8K,AQUA,SVAMP数据集上,所有符号推理和所有其他逻辑推理任务中表现出色。例如,Zero-shot-CoT在MultiArith上的得分提升了17.7%至78.7%,在GSM8K上提升了10.4%至40.7%。我们的方法在剩下的两个算术推理任务(SingleEq和AddSub)中表现出色,因为它们不需要多步推理。

 3.3.3 Does model size matter for zero-shot reasoning?

       如果没有进行思维链推理,模型规模增大时性能要么不增加,要么增长缓慢,即曲线基本保持平稳。相反,当使用思维链推理时,对于原版/Instruct GPT-3和PaLM模型,性能随着模型规模的增大而显著提高。当模型规模较小时,思维链推理并不有效。 

 3.3.4 Error Analysis   

       为了更好地理解Zero-shot-CoT的行为,作者手动调查了使用Zero-shot-CoT提示的Instruct-GPT3生成的随机选择的示例。其中一些观察结果包括:

  • 在常识推理(CommonsenseQA)中,即使最终预测不正确,Zero-shot-CoT通常会产生灵活合理的思考链。当模型发现很难将答案缩小到一个时,Zero-shot-CoT通常会输出多个答案选择。
  • 在算术推理(MultiArith)中,Zero-shot-CoT和Few-shot-CoT在错误模式方面存在实质性差异。首先,Zero-shot-CoT倾向于在获得正确预测后输出不必要的推理步骤,导致将预测更改为不正确的预测。Zero-shot-CoT有时也不会开始推理,只是改述输入的问题。相比之下,Few-shot-CoT在生成的思考链中包含三元操作时往往会失败,例如(3 + 2)* 4。

 3.3.5 How does prompt selection affect Zero-shot-CoT? 

       对Zero-shot-CoT针对输入提示的稳健性进行了验证。下表总结了使用16个不同模板和三个类别的性能。具体来说,这些类别包括指导性(鼓励思考)、误导性(阻碍思考或以错误的方式鼓励思考)和无关的(与推理无关)。结果表明,如果文本以鼓励思维链推理的方式编写,即模板属于“指导性”类别,性能会有所提高。然而,准确性的差异取决于句子的不同。在这个实验中,“让我们一步一步地思考。”取得了最好的结果。有趣的是,发现不同的模板会以不同的方式鼓励模型表达推理。相反,当我们使用误导性或无关的模板时,性能不会提高。如何自动创建更好的Zero-shot-CoT模板仍然是一个开放的问题。

 3.3.6 How does prompt selection affect Few-shot-CoT?

      下表显示了在使用来自不同数据集的示例时,Few-shot-CoT的性能:CommonsenseQA到AQUA-RAT和CommonsenseQA到MultiArith。在这两种情况下,领域是不同的,但答案格式是相同的。令人惊讶的是,来自不同领域(常识到算术)但具有相同答案(多选)格式的思维链示例比从零-shot(到AQUA-RAT)获得了相当大的性能提升,相对于从零-shot-CoT或Few-shot-CoT获得的可能改进。相反,当使用具有不同答案类型的示例(到MultiArith)时,性能提升要小得多,LLMs主要利用少量示例来推断重复格式,而不是任务本身的上下文。尽管如此,在这两种情况下,结果都比Zero-shot-CoT差,这证实了Few-shot-CoT中任务特定样本工程的重要性。

3.4 总结

       提出了Zero-shot-CoT的方法,这是一种单一的零样本提示,能够从大型语言模型中引发一系列推理任务,与以前的少样本(上下文)方法相比,该方法不需要为每个任务手工制作少样本示例。而且进一步发现类似的多任务提示,也许能引发更广泛的认知能力。 

四、CoT


  • Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.

4.1 目的

       增加语言模型的规模已被证明能带来一系列好处,如提高性能和样本效率。然而,仅仅增加模型规模并不足以在算数、常识和符号推理等具有挑战性的任务上实现高性能。首先,算术推理的技术可以通过生成导致最终答案的自然语言解释来受益。之前的研究已经让模型具备了从头训练生成自然语言中间步骤的能力,或者通过微调预训练模型,以及使用形式语言而不是自然语言的神经-符号方法。其次,大型语言模型通过提示的方式提供了在上下文中少量示范学习的令人兴奋的前景。也就是说,不需要为每个新任务微调一个单独的语言模型检查点,只需用几个输入-输出示例来提示模型。令人惊讶的是,这在一系列简单的问答任务中取得了成功。

      然而,上述两种方法都有重要的局限性。对于理由增强训练和微调方法来说,创建一组大量高质量的理由是昂贵的,这比普通机器学习中使用的简单输入-输出对更加复杂。对于Brown等人2020在传统的少量示例提示方法中使用的方法,它在需要推理能力的任务上表现不佳,并且通常在语言模型规模增加时改进不大。作者以一种避免这些局限性的方式结合了这两个思想的优势。具体而言,作者探索了语言模型在推理任务中执行少量示例提示的能力,给定一个由三元组组成的提示:输入h,思维链,输出i。思维链是一系列导致最终输出的中间自然语言推理步骤,我们将这种方法称为思维链提示。把思维链示例作为提示来引导模型进行推理,通过一系列思维链,从而显著提高大型语言模型进行复杂推理的能力。

       作为促进语言模型推理的方法,思维链提示具有几个有吸引力的特点。

  • 首先,从原则上讲,思维链允许模型将多步骤问题分解为中间步骤,这意味着可以为需要更多推理步骤的问题分配额外的计算资源。
  • 其次,思维链提供了对模型行为的可解释窗口,可以提示模型如何达到特定答案,并提供机会调试推理路径出错的地方(尽管完全描述支持答案的模型计算仍然是一个待解决的问题)。
  • 第三,思维链推理可以帮助模型在推理过程中建立联系和关联,从而更好地理解问题并生成更准确的答案。

4.2 方法

       比如一个多步骤的数学应用问题。通常情况下,将问题分解成中间步骤并在给出最终答案之前解决每个步骤:“简给妈妈2朵花后,她还有10朵……然后给爸爸3朵后,她还剩7朵……所以答案是7。”本文的目标是赋予语言模型生成类似的思维链的能力,即一系列连贯的中间推理步骤,以解决一个问题并得出最终答案。

4.3 效果

4.3.1 数据集      

       作者在多个基准测试中探索了各种语言模型的思维链提示。基准测试。考虑了以下五个数学问题基准测试:

  • 数学问题的GSM8K基准测试
  • 具有不同结构的数学问题的SVAMP数据集
  • 多样化数学问题的ASDiv数据集
  • 代数问题的AQuA数据集
  • MAWPS基准测试

       作为基线,考虑了标准的少样本提示,即在输出测试示例的预测之前,语言模型会提供上下文示例的输入-输出对。示例以问题和答案的形式进行格式化。模型直接给出答案。思维链提示。作者提出的方法是在少样本提示中为每个示例增加一个相关答案的思维链。由于大多数数据集只有一个评估集,作者手动组成了一个包含八个少样本示例和思维链的集合。  

       评估了五个大型语言模型。

  • GPT-3,使用text-ada-001,text-babbage-001,text-curie-001和text-davinci-002,这些模型可能对应于InstructGPT的350M、1.3B、6.7B和175B参数。
  • LaMDA,它有422M、2B、8B、68B和137B参数的模型。
  • PaLM,它有8B、62B和540B参数的模型。
  • UL2 20B
  • Codex(Chen等,2021,OpenAI API中的code-davinci-002)。

4.3.2 性能           

       通过贪婪解码从这些模型中进行采样(后续的研究表明,通过对许多采样生成的结果取多数最终答案可以改进思维链提示)。对于LaMDA,我们报告了五个随机种子的平均结果,每个种子都有一个不同的随机洗牌顺序的示例。由于LaMDA实验在不同种子之间没有显示出大的差异,为了节省计算资源,我们对所有其他模型报告了单个示例顺序的结果。

       对三个大型语言模型进行的实验表明,链式思维提示提高了在一系列算术、常识和符号推理任务上的性能。经验的提升效果是显著的。例如,仅通过八个链式思维示例提示一个具有540B参数量的PaLM模型,在数学应用题的GSM8K基准测试上实现了最先进的准确性,甚至超过了经过微调的GPT-3模型与一个验证器。

4.4 总结

       作者探索了思维链提示作为一种简单且广泛适用的方法,用于增强语言模型的推理能力。通过对算术、符号和常识推理的实验,发现思维链推理是模型规模的一种新兴特性,使足够大的语言模型能够执行原本具有平坦缩放曲线的推理任务。该研究有望激发对语言的推理方法的进一步研究。

五、微调ChatGLM代码

# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

# Input data files are available in the read-only "../input/" directory
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using "Save & Run All" 
# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session

!git clone https://github.com/THUDM/ChatGLM-6B.git
!pip install -r ChatGLM-6B/requirements.txt
!pip install rouge_chinese nltk jieba datasets 
!git clone https://huggingface.co/THUDM/chatglm-6b-int4

from transformers import AutoTokenizer, AutoModel

model_path = "chatglm-6b-int4"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()

from IPython.display import display, Markdown, clear_output

# 准备提示语
prompt = "如何制作宫保鸡丁"

# 使用 IPython.display 流式打印模型输出
for response, history in model.stream_chat(
        tokenizer, prompt, history=[]):
    clear_output(wait=True)
    display(Markdown(response))
# 下载 ADGEN 数据集
!wget -O AdvertiseGen.tar.gz https://cloud.tsinghua.edu.cn/f/b3f119a008264b1cabd1/?dl=1

!tar -xzvf AdvertiseGen.tar.gz

# P-tuning v2
!PRE_SEQ_LEN=128 && LR=2e-2 && CUDA_VISIBLE_DEVICES=0 python3 ChatGLM-6B/ptuning/main.py \
    --do_train \
    --train_file AdvertiseGen/train.json \
    --validation_file AdvertiseGen/dev.json \
    --prompt_column content \
    --response_column summary \
    --overwrite_cache \
    --model_name_or_path chatglm-6b-int4 \
    --output_dir output/adgen-chatglm-6b-int4-pt-$PRE_SEQ_LEN-$LR \
    --overwrite_output_dir \
    --max_source_length 64 \
    --max_target_length 64 \
    --per_device_train_batch_size 4 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 4 \
    --predict_with_generate \
    --max_steps 100 \
    --logging_steps 10 \
    --save_steps 100 \
    --learning_rate $LR \
    --pre_seq_len $PRE_SEQ_LEN \
    --quantization_bit 4


!cp -r /kaggle/input/langchain-chatglm/ /kaggle/working/langchain-ChatGLM

# 安装依赖
%cd /kaggle/working/langchain-ChatGLM
!pip install -r requirements.txt
!pip install gradio==3.28.3
!pip install tabulate

#Download models
!git lfs install
%cd /kaggle/working/langchain-ChatGLM
!git clone https://huggingface.co/THUDM/chatglm-6b-int4
!git clone https://huggingface.co/GanymedeNil/text2vec-large-chinese

!git clone https://github.com/THUDM/ChatGLM-6B.git
!cp -rf /kaggle/working/langchain-ChatGLM/ChatGLM-6B/ptuning/*  /kaggle/working/langchain-ChatGLM/ptuning-v2/

%cd /kaggle/working/langchain-ChatGLM
!python webui.py

欢迎指出理解有误的地方~

参考:

1】[Paper Reading] 思维树 Tree of Thoughts - 知乎 (zhihu.com)

【2】Tree of Thoughts: Deliberate Problem Solving with Large Language Models.

【3】ART: Automatic multi-step reasoning and tool-use for large language models.

【4】Large Language Models are Zero-Shot Reasoners.

5】Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值