在 GPT-4 发布博客中,作者写道:“在一次随意的谈话中,GPT-3.5 和 GPT-4 之间的区别可能是微妙的。当任务的复杂程度达到足够的阈值时,差异就会显现出来。” 这意味着复杂任务很可能是大型和小型语言模型的关键差异因素。
更重要的是,复杂推理为基于语言模型构建大量应用程序提供了机会,从而使语言模型有机会成为下一代计算平台 / 操作系统。这有可能从根本上改变人类与机器的交互方式,重塑整个计算生态系统。
在这篇文章中,我们将仔细分析讨论如何让大语言模型拥有强大的复杂推理能力。
1 - 动机:大语言模型作为新一代计算平台
我们研究复杂推理的原因有两个:
正如上文提到的,复杂推理是标志着小模型与大模型差异的关键因素,这一点在 GPT-4 发布文章中已经讨论过。 复杂推理是使模型成为下一代操作系统的核心能力。
在第 2 部分,我们讨论了构建具有强大复杂推理能力的语言模型的现有方法。复杂推理的方案与通用大型语言模型(LLM)开发的方案相似,包括三个阶段:持续训练 (continue training)、指令微调 (instruction finetuning) 和强化学习 (reinforcement learning)。我们还会进一步讨论代码与推理之间令人惊讶的耦合关系。 在第 3 部分,我们讨论了复杂推理的提示工程 (prompt engineering) 技术。当语言模型成为新一代操作系统内核时,提示工程 / 场景学习将成为新一代脚本编程 (shell script)。 在第 4 部分,我们讨论了如何评估大型语言模型的推理能力。我们介绍 Chain-of-thought Hub,这是一个包含 100 多个推理任务的数据集合,清楚地标示了大型与小型模型的差异。我们重点介绍了 LLaMA 65B 的出色表现。我们认为它具有非常强大的潜力,可作为再现 ChatGPT-3.5 的基座模型。
2 - 增加大语言模型推理能力的方案
推理的方案与构建通用大型语言模型和聊天机器人的方案密切相关。总共有三个阶段:
预训练 / 持续训练:在这个阶段,我们通常在大型数据集(如科学文献或代码数据)上训练大型模型。 有监督微调:在这个阶段,我们对模型进行微调,以便完成复杂任务的指令。 强化学习:在这个阶段,我们使用诸如任务是否已全部 / 部分完成的信号作为奖励。
Lewkowycz et. al. 2022. Minerva: Solving Quantitative Reasoning Problems with Language Models
在来自 Arxiv 论文的 38.5B 的 token 上继续训练 PaLM 540B。
在 MATH (一个需要使用 LaTeX 格式回答问题的困难数据集),上的得分为 33.6(GPT-4 的得分是 42.5)
Taylor et. al. 2022. Galactica: A Large Language Model for Science
在包含论文、代码、参考资料、知识库和其他内容的 106B token 上预训练一个120B语言模型。
在MATH上的表现为 20.4(Minerva 33.6,GPT-4 42.5)
Chen et. al. 2021. Codex: Evaluating Large Language Models Trained on Code
在159GB代码数据上继续训练 12B GPT-3 模型,提高了 HumanEval 数据集上的代码性能。
这些研究发现,在大量科学文献 / 代码上进行训练可以显著提高基础模型的推理/编码能力。
Chung et. al. 2022. Scaling Instruction-Finetuned Language Models
使用多样化的指令显著提高了模型零样本泛化的能力
在指令集合中混合思维链数据(the flan collection 文章中进一步讨论了这个问题)明显提高了模型的思维链能力
注意:尽管 the flan collection 数据集从多个维度激发了基础模型的能力,但这些指令并非来自真实的聊天机器人用户互动,因此可能无法直接转化为更好的聊天性能。
Fu et. al. 2023. Specializing Smaller Language Models towards Multi-Step Reasoning
将思维链推理能力提炼到较小规模(小于或等于 10B)的模型。通常,10B 规模的模型非常适合部署(更大的模型太贵了,更小的模型太弱了)。
本文讨论了很多工程细节,如数据工程、能力平衡以及小型和大型模型之间的差异
Li et. al. 2022. Competition-Level Code Generation with AlphaCode
在 715GB 的 GitHub 代码上预训练一个 41B 模型,然后在包含 13k 问题的 CodeContest 数据集上进行微调
在测试期间,使用采样并根据是否通过示例测试来过滤解决方案。从某种意义上说,这种做法类似于推理问题中的 self-consistency 方法。
通过使用对话格式的数据,将基本模型调优为聊天机器人相对容易(参见像 Alpaca 和 MOSS 这样的优秀示例)。然而,闲聊的能力并不能转化为执行复杂任务的能力。从这个角度来看,模型就像人类一样:说得多不如干得好,代码见真章。
实际上,指令调优问题是一个数据混合问题:如何最好地混合来自不同来源的指令数据,以便从所有角度均匀地提高模型性能(而不是像在 CoT specialization 和 the flan collection 中讨论的那样,增加一个维度但降低另一个维度)。
数据混合的简单起点是:使用 10-20 个非思维链的数据点(以平衡不同维度的能力),但尽可能多地使用链式思维数据(以最大化推理能力)。
Uesato. et. al. 2022. Solving math word problems with process- and outcome-based feedback
基于中间推理和最终推理结果构建奖励模型。
Le et. al. 2022. CodeRL: Mastering Code Generation through Pretrained Models and Deep Reinforcement Learning
根据诸如编译错误、运行时错误或是否通过测试等信号训练奖励模型。
代码注释是自然存在的链式思维数据
面向过程编程类似于逐步解决任务。这适用于简单和中等复杂度的任务
面向对象编程类似于将任务分解为较小的任务,然后分别解决它们。这适用于较高复杂度的任务。
在连续训练阶段,可以在基础模型上增加代码和科学文献数据。 在有监督的微调阶段,可以根据要求完成复杂任务的指令或编写代码对模型进行微调 在强化学习阶段,将中间推理步骤 / 编译率和最终推理结果 / 代码通过率作为奖励 在解码过程中,推理和编码都会采样多个解决方案,然后从解码空间中选择最佳方案。
3 - 复杂推理的提示工程
3.1 - 基础思维链提示工程
以下论文推荐给初学者:
Wei et. al. 2022. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. 本文是第一篇发现当使用链式思维进行提示时,存在一个相变现象,表明大型模型在很大程度上优于较小的模型,这进一步导致了涌现能力的发现。
Wang et. al. 2022. Self-Consistency Improves Chain of Thought Reasoning in Language Models 对采样的 CoT 推理路径进行多数投票,显著提高了推理性能。
Suzgun et. al. 2022. Challenging BIG-Bench Tasks and Whether Chain-of-Thought Can Solve Them 使用 CoT 处理 big-bench 中困难的任务。这篇论文的一个有意义的副产品是 BigBench Hard 数据集,它在测试模型推理能力方面非常有效。
3.2 - 进阶技巧及分析
Fu et. al. 2023. Complexity-Based Prompting for Multi-Step Reasoning 使用复杂链代替简单链作为上下文示例
Khot et. al. 2023. Decomposed Prompting: A Modular Approach for Solving Complex Tasks 将复杂任务分解为更简单的任务,然后逐个解决
Xie et. al. 2021. An Explanation of In-context Learning as Implicit Bayesian Inference 语言模型在提示中的示例之间推断出一个潜在概念,并进入相应的任务模式
Wei et. al. 2023. Larger language models do in-context learning differently 当出现与先验知识相矛盾的上下文示例时,尽管大型模型可能具有更强的语义先验,大型模型可以根据提示词来覆盖语义先验。
Min et. al. 2022. Rethinking the Role of Demonstrations: What Makes In-Context Learning Work? 当某些标签错误时,模型仍然可以做出正确的预测。这表明模型更受提示的 [格式] 影响,而不是提示的 [意义] 。
Wang et. al. 2022. Towards Understanding Chain-of-Thought Prompting: An Empirical Study of What Matters 即使提示中的推理错误,模型仍然可以正确推理,但提示的相关性和推理步骤的顺序更为重要 —— 这再次表明,模型更受提示的 [格式] 影响,而不是提示的[意义]。
Madaan and Yazdanbakhsh. 2022. Text and Patterns: For Effective Chain of Thought, It Takes Two to Tango. 详细分析显示,提示的格式可以改善 CoT 推理(虽然内容的正确性可能不起到强烈作用)
Madaan. et. al. 2023. Self-refine: Iterative refinement with self-feedback 模型可以在多个场景中(包括代码优化、数学推理、对话响应生成等)对自身的推理进行优化和改进。
Madaan et. al. 2023. Learning Performance-Improving Code Edits 在程序轨迹上进行训练可以改善编码。
4 - 评价大语言模型的推理能力
4.1 - 评价方法的基础知识
In-context 指的是在测试问题之前附加一系列上下文示例。 Zero-shot 是指在没有上下文示例的情况下直接将测试问题输入给模型。 Chain-of-thought 是指在回答之前生成推理。 Answer-only 是指没有链式思维,直接给答案。
知识 knowledge:模型是否了解世界 推理 reasoning:模型是否可以根据其知识进行推理。
一些数据集更注重对知识的评估,如 MMLU,它测试模型是否具有高达大学水平的知识。 一些数据集更注重对推理的评估,如 BBH,它测试模型是否具有逐步解决问题的能力。 对于知识,链式思维与仅回答的表现相似(参见 FlanPaLM 论文) 对于推理,链式思维比仅回答表现得更好(参见原始 CoT 论文,然后参见 FlanPaLM 论文)
预训练 checkpoint 具有 in-context learning 的能力。大多数预训练模型可以进行 in-context answer-only,一些更好的模型可以进行 in-context chain-of-thought(但目前尚不清楚为什么某些预训练模型可以进行 CoT 而其他模型却不能)。然而,预训练 checkpoint 可能无法进行 zero-shot,因为它们没有经过这方面的训练(但某些预训练检查点仍然可以进行 zero-shot CoT,请参阅 “让我们逐步思考” 的论文)。 指令微调过后的 checkpoint 既具有 zero-shot 又有 in-context 的能力。这里需要注意的是,如果没调好,指令微调之后 in-context 性能可能会稍有下降。 综上所述,我们建议使用 in-context chain-of-thought 进行评估:
In-context 是评估 pretrained checkpoint 的更好方法,因为它更好地揭示了模型潜力。Zero-shot 可能低估模型性能,尤其是对于不支持 Zero-shot chain-of-thought 的(“让我们逐步思考”)的模型。 Chain-of-thought prompting 是评估推理能力的更好方法,因为它比 answer-only prompting 更充分地发挥了模型的推理性能。
我们根据 GSM8K 对模型性能进行排名,这是一个经典的基准测试,用于衡量链式思维数学推理性能。这不是唯一的度量标准,但一个很好的解释是 “在保持其他通用能力的同时,模型在数学方面的表现如何” —— 这也非常困难。 GPT-4 在 GSM8K 和 MMLU 上明显优于所有其他模型。 65B LLaMA 与 text/code-davinci-002 非常接近,这意味着基于它,如果 SFT 和 RLHF 操作正确,我们很有可能基于 65B LLaMA 复现 ChatGPT。 Claude 是唯一可以与 GPT 系列相媲美的模型家族。 较小的模型,如 FlanT5 11B 和 LLaMA 7B,明显落后于排行榜,这意味着复杂推理可能只是大型模型的能力。
详细的实验设置和结果分析 用于重现 GPT 和 Claude 所有结果的脚本
5 - 结论
人世间数百万个闲暇的小时流逝过去,方始出现一个真正的历史性时刻,人类星光闪耀的时刻 —— 《人类群星闪耀时》斯蒂芬·茨威格
附录:更多大语言模型推理的相关资源
Lil’Log 2023. Prompt Engineering Microsoft Semantic Kernel Prompt Engineering Guide Huang and Chang 2022. Towards Reasoning in Large Language Models: A Survey