概述:
自2022年11月OpenAI发布ChatGPT以来,大语言模型(LLM)在推理能力方面展现出了惊人的潜力。然而,早期的大模型在处理复杂推理任务时仍然存在明显的局限性:推理过程不透明、结果缺乏可靠性、难以处理多步骤的复杂问题等。这些挑战促使研究人员开始探索更高效的推理方法。Chain of Thought推理方法的出现源于一个重要观察:当人类解决复杂问题时,往往需要经过清晰的思维步骤。研究者发现,通过提示模型"一步步思考"(step-by-step thinking),可以显著提升模型在数学问题、逻辑推理等任务上的表现。2024年9月,OpenAI推出了专门针对推理能力优化的O1模型,这是一个通过强化学习训练的新型大语言模型,专门用于执行复杂推理任务。一经发布,就在各个领域中展现出了远超GPT4o等传统大模型的推理能力,几个月后今天,国内的几家大模型企业,如gemini、Qwen、deepseek、kimi等,也陆续推出了各自的推理模型产品或开源模型。本文中,我们将围绕大模型test-time的策略,介绍CoT和推理模型部分技术原理和方案,欢迎各位朋友批评和交流。
COT
Chain of Thought是一种提示技术(prompting technique),通过引导大语言模型展示其推理过程的中间步骤,从而提高其在复杂任务中的表现。
什么是CoT
这种方法最早由Google Research团队在2022年提出,通过论文 "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models" 【1】正式引入学术界。本节内相关内容同时参考了【2】。
CoT的基本形式
以下表述,我们快速了解CoT和一般prompt的主要区别,以及CoT的基本形式。 标准的大模型输出,可以直接输出答案,简洁,但是在处理较复杂问题时会影响其准确率:
Few-shot CoT模式下,提示中带有推理步骤的示例,通过示例引导模型学习推理模式,适用于复杂任务和特定领域问题:
Zero-shot CoT,通过在提示中加入特定关键词,如“Let's think step by step”,无需示例即可激活模型的推理能力,适用于相对简单的推理任务:
在【2】中,作者研究了通过什么样的prompt,可以得到最优的zero-shot-CoT效果,感觉比较有趣:
可以看到,在MultiArith数学数据集上,合适的CoT推理,可以比起传统的prompt,取得更加正确的结果。
Self-consistency
Self-consistency CoT,即通过多个推理路径得到答案,然后通过多数表决或一致性检查选择最可靠的答案,从而提高推理结果的可靠性。
本部分我们主要参考论文【3】,下图为论文【3】中示例,说明了基本的self-consistency和一般CoT的主要区别。
以下结果来自于【3】,表明self-consistency的数量会影响最终的效果。
least to most prompting(LtM)
Least-to-Most Prompting 是一种新型的提示技术,最初由Google Research团队提出。这种方法的核心思想是将复杂问题分解成一系列更简单的子问题,然后逐步解决,最终达到解决复杂问题的目的。该章节主要参考论文【4】。
下图说明了LtM的基本过程,首先基于大模型的能力对复杂问题进行拆分,然后依次回答独立的子问题,最后总结给出最后的答案。
LtM的主要优势为,能够提高复杂问题的推理能力,具有更好的可控性。
下图为【4】中的实验结果,在code-davinci-001、code-davinci-002、text-davinci-001等数据集上,LtM均取得了显著的提升。
COT的发展方向
在了解了基本的CoT的形式和功能之后,我们参考上海交大的一篇综述性论文【5】,来总结CoT模式转变的几个方向。
a)Prompt 模式
指令生成模式
1.手动指令生成
通过手动添加prompt,使得大模型进行CoT推理,如Zero-Shot-CoT使用的“Let's think step by step”,或者Plan-and-Solve(PS)【6】使用的“Let’s first understand the problem and devise a plan to solve the problem. Then, let’s carry out the plan and solve the problem step by step”。
2.自动指令生成
手动指令生成虽然更容易理解,但是其不能在所有类型任务上总能产生期望的结果,导致用户需要经常反复尝试不同的提示才能达到目标效果。在这些情况下,自动指令生成可以针对任务生成更合适的CoT指令。
如APE (Automatic Prompt Engineer) 方法【7】和OPRO(Optimization by PROmpting)方法【8】。其中APE更专注于生成和选择最佳指令,通过搜索候选指令池来找到最优指令,而OPRO关注解决方案的迭代优化过程,通过迭代优化逐步改进解决方案。
示例生成模式
比起指令生成,示例生成主要通过构建高质量的输入-输出示例对来提升CoT推理效果,通过示例可能更好的引导模型进行推理。
1.手动示例生成
如 Manual-CoT【9】,使用人工设计的输入-输出和逻辑推理过程来提示模型。
Active-Prompt【10】,介于手动和自动之间,使用不确定性度量选择最具代表性的问题。
2.自动示例生成
如Auto-CoT【11】,采用问题聚类和实例采样两阶段方法来保持采样问题的多样性,自动生成推理链来构建示例。
Automate-CoT【12】,主要采用三个步骤,1. 生成多个伪链,2. 基于真实答案一致性进行修剪,3. 使用方差减少的策略地图选择最佳思维链。
b)CoT结构
除了常见的线性结构的CoT,还有各种形式的CoT结构,如
Program-of-Thoughts (PoT)【13】,将推理转化为可执行的程序代码
Table-of-Thoughts (Tab-CoT)【14】,使用表格形式的推理步骤
Tree-of-Thoughts (ToT)【15】,使用树状结构的思维单元
Graph-of-Thoughts-Rationale (GoT-rationale)【16】,使用图状结构的思维过程
Recursion-of-Thought (RoT)【17】,使用递归结构的思维过程
Skeleton-of-Thought (SoT)【18】,使用骨架式的思维结构。
推理模型
某种意义上,以O1为代表的推理模型,就是在将原本由工程师们显式实现的CoT过程,内化为模型本身的能力。因此本文的架构如此,希望大家在了解了CoT的基本模式后,能够更容易得理解推理模型的工作模式。
openai - O1
2024年9月,OpenAI推出了专门针对推理能力优化的O1模型,这是一个通过强化学习训练的新型大语言模型,专门用于执行复杂推理任务。
本节的内容主要参考openai的官方页面【19】。
O1是基于大规模强化学习算法通过高效的数据训练过程,利用CoT来教导模型如何进行有效思考。研究发现,对于该推理模型,增加模型强化学习的训练计算量和增加模型在推理/测试时的思考时间(测试时的计算量),均可以提高模型性能。这里分别被称为train-time scale law 和 test-time scale law。(如下图所示)
实验显示,在数学竞赛、代码竞赛,博士级科学问题回答等多项数据集上,O1均取得比gpt4o更好的成绩。
同时,openai也提供了部分问题的完整推理过程(openai表示在用户使用o1等能力进行问答是,会隐藏完整的推理过程,因此用户无法通过产品了解到实际的推理流程)。以下展示gpt4o和O1 preview分别处理密码解析任务时的过程。
以上case可以比较明显的看出,O1模型能够更有条理的拆分密码解析任务需要的步骤,并且详细给出推理和计算过程,从而给出正确的结果。相比而言,GPT4o尽管也在进行“think step by step”,但无法得到正确的结果。
推理模型原理解析
因为closeAI(笑)一贯的不开源技术,其实O1具体的技术原理尚没有公认的具体介绍。一般大家认为是强化学习结合蒙特卡洛树搜索(MCTS)对大模型进行微调,但由于目前尚未有比较权威方案介绍,所以在此不过多讨论这些方面。在本文中,我们重点介绍Google DeepMind在8月份发表的论文【20】,这篇文章也被认为比较详细的介绍了Test-Time Scale 的方案和效果。
baseline(majority)
这篇文章中,majority(多数投票)是一个重要的baseline方法,用于从多个候选答案中选择最终答案。实验中,先通过多种CoT方法推理得到答案,然后统计所有候选答案中出现频率最高的答案,选择出现次数最多的答案作为最终输出。
该方法计算简单,不需要依赖额外验证模型,因此往往作为Test-Time optimal的首选。
Verifier-base modal
相比起多数投票,基于验证模型打分来选择最优答案,往往能取得更稳定的效果。这里的打分模型一般有两种形式:Outcome Reward Model(ORM),只关注最终答案的正确性,为整个答案给出单一评分;或者Process Reward Model(PRM)【21】,基于过程的验证模型,对解答过程的每个步骤进行评估,为每个步骤生成一个预测分数,可以识别具体哪些步骤可能存在问题。
下图来自于【21】,表明了ORM和PRM的主要区别,左边的case是ORM,对完整的答案给出单一的评分,右边的case是PRM,对每个步骤进行评估打分。
【21】中以下实验结果表明,相比起多数投票(majority),ORM和PRM都能取得更好的效果,而PRM的效果随着候选答案的数量提升,效果提升更加明显。
在【20】中,为了训练好的PRM模型,作者没有使用人工众包的标注方法,而是对每个解答步骤进行蒙特卡洛rollouts,通过rollouts估计每个步骤的正确性,然后对应于基础模型采样策略的奖励期望。这种方法无需人工标注,降低了数据获取成本,能够自适应特定模型的输出分布。
Search Methods
本节主要介绍三种基于PRM的搜索方法。
1.Best-of-N weighted
这是一种最直接的搜索方法,它首先从基础语言模型中独立采样N个完整的答案,然后使用PRM对每个答案进行评分。名字中的weighted体现在,不是简单地选择得分最高的答案,而是采用一种加权策略:对所有得到相同最终答案的解决方案,将它们的验证器分数进行累加,最后选择累加总分最高的答案作为最终输出。这种方法考虑了答案的多样性和一致性,如果多个解决方案都指向同一个答案,这个答案的可信度就会更高。
2.Beam search (束搜索)
Beam search是一种逐步构建解决方案的方法。它维护一个固定数量(N)的候选解决方案,每个候选解都可以产生多个(M)可能的下一步。在搜索过程中,首先为解决方案的第一步生成N个不同的起点,然后使用PRM对这些步骤进行评分。保留得分最高的NM个步骤,然后从每个保留的步骤再生成M个新的候选步骤,这样就得到了新一轮的N个候选解。这个过程不断重复,直到达到解决方案的终点或达到最大搜索轮数(40轮)。最后,对得到的N个完整解决方案使用加权选择方法选出最终答案。
3.Loogahead Search
Loogahead Search是Beam search的一个更复杂的变体,它在评估每个步骤时会往前看几步,以获得更准确的评估。具体来说,在搜索的每一步,不是直接使用当前步骤的PRM分数,而是进行一个模拟过程:从当前步骤开始,向前推进k步(如果提前到达解决方案终点则停止)。为了减少模拟中的随机性,这个前瞻过程使用温度为0的采样。最后使用模拟终点的PRM预测分数来评估当前步骤的价值。这种方法可以看作是MCTS的一个简化版本,去除了随机探索的部分,因为PRM已经训练好并固定了。虽然这种方法理论上能提供更准确的评估,但也需要更多的计算资源。
4.效果对比
下图是关于搜索方法的效果说明,左图表明在低生成预算的情况下,beam search表现最好,而随着生成预算的提高,beam search优势逐渐减弱甚至可能落后于best-of-N。右图表示了在难度等级从1到5(难度提高)的情况下,性能的比较。可以看出,简单问题下,高预算的beam search会出现的过渡优化的情况,而best-of-N没有这个问题;中等问题上,beam search显著由于best-of-N;而困难问题上,几种方法表现均没有太好。
鉴于以上提出了多种不同的search方法,为了得到更好的推理效果,作者根据任务难度对搜索策略进行了优化,得到了两个方案,如下图。
Compute Optimal Oracle 是一种理想情况下的计算最优策略。它使用问题的真实难度信息(通过计算模型在该问题上的 pass@1 率得到)来决定应该使用什么样的搜索策略。比如,对于简单问题可能选择使用 best-of-N,而对于中等难度的问题可能选择使用束搜索。这种策略需要访问问题的真实答案来评估难度,因此在实际应用中是无法实现的,但它为我们提供了一个理论上限的参考。
Compute Optimal Predicted 则是一种实用版本的计算最优策略。它不使用真实答案信息,而是使用 PRM(过程奖励模型)的预测分数来评估问题难度。具体来说,它会对每个问题采样多个答案,然后根据 PRM 对这些答案的评分来估计问题的难度。这种方法虽然可能不如 Oracle 版本准确,但是可以在实际场景中使用。
从下图的结果来看,这两种计算最优策略都显著优于基准方法。特别值得注意的是,它们能够用更少的计算资源达到与传统方法相当或更好的性能。具体来说,使用约 16 次生成就能达到接近使用 64 次生成的 best-of-N 的性能,这意味着计算效率提高了约 4 倍。
特别值得注意的是,即使是使用预测的难度信息(Compute Optimal Predicted),性能也接近于使用真实难度信息(Compute Optimal Oracle)的情况。这表明即使在实际应用场景中,我们也能够通过智能地分配计算资源来显著提高模型的性能。这个发现对于实际应用具有重要意义,因为它提供了一种可行的方法来优化大语言模型在推理阶段的计算资源使用。
d)Revision Methods
上一章节中,作者主要研究了如何通过验证器(verifier)进行搜索来优化推理计算。而在本章节,研究转向了另一个方向:通过让模型能够修改自己的提案分布来提升性能。具体来说,就是让模型能够迭代地修正自己的答案。效果如下图:
为了训练一个好的revision model,其核心是构建一个包含"错误答案序列+正确答案"的训练数据集。具体实现时,对每个问题并行采样64个答案,然后从中选择一个正确答案,并配对其中最多4个错误答案与正确答案对应。为确保错误答案与正确答案相关,作者这里使用了字符编辑距离来选择相关性较高的错误答案。这样,通过该训练数据,训练得到revision model,可以将错误答案修正为正确答案。
但是在推理中,模型可能会意外地将正确答案改成错误答案。研究发现,大约38%的正确答案会被转变成错误答案。为了解决这个问题,一系列revision操作之后,我们还是会采用majority或best-of-N来从模型生成的一系列修正中筛选最佳答案。
下图实验对比了几种推理策略,结果显示,无论使用哪种选择方法,顺序采样(sequential)的性能都略微优于并行采样(parallel)。这个发现表明,让模型能够看到之前的答案并基于此进行修正,比简单地并行生成多个独立答案更有效。
e)combine
上面我们分别介绍了search methods(并行搜索)和revision methods(串行修正)的效果,实际使用中,两种模式经常同时使用,如下图的Combining Sequential/Parallel所示。
下图的实验结果展示了在不同生成预算下,改变顺序采样和并行采样的比例对模型性能的影响。每条线代表一个固定的生成预算,而横轴表示顺序/并行的比例。结果显示,在给定的生成预算下,确实存在一个能够达到最佳性能的最优比例。特别是在较高的生成预算下,这个最优比例的效果更为明显,表明需要在顺序和并行计算之间取得适当的平衡。
以下结果则更深入地分析了在难度不同的问题上,顺序/并行比例的影响。结果揭示了一个有趣的现象:对于简单问题,完全使用顺序计算能够获得最好的性能;而对于较难的问题,则需要在顺序和并行计算之间找到一个理想的平衡点。这个发现表明,问题的难度应该作为决定计算策略的重要因素,不同难度的问题需要采用不同的计算资源分配策略。
最后的结果综合了以上所有策略并计算最优扩展策略(使用 oracle 和 predicted 难度)与基准方法(majority、ORM和PRM的best-of-N)的比较结果。实验表明,在高生成预算下,传统的并行采样方法性能增长趋于平缓,而计算最优策略则保持持续提升。最显著的是,这些优化策略能用更少的计算资源(约64个样本)达到传统方法使用256个样本的性能水平,实现了约4倍的计算效率提升。值得注意的是,即使使用预测的难度信息而非理想的oracle难度,计算最优策略仍能保持良好性能,这证明了该方法在实际应用中的可行性。
总结
本文主要介绍LLM大模型的CoT和以O1为代表的推理模型,推理模型相关技术目前各家也在探索和发展中,期待有更完整的技术方案的公布,我们也可以更详细的一探究竟。
参考文献:
【1】Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
https://arxiv.org/pdf/2201.11903
【2】Large Language Models are Zero-Shot Reasoners
https://arxiv.org/pdf/2205.11916
【3】Self-Consistency Improves Chain of Thought Reasoning in Language Models
https://arxiv.org/pdf/2203.11171
【4】LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS
https://arxiv.org/pdf/2205.10625
【5】Igniting Language Intelligence: The Hitchhiker’s Guide From Chain-of-Thought Reasoning to Language Agents
https://arxiv.org/pdf/2311.11797
【6】Plan-andsolve prompting: Improving zero-shot chain-of-thought reasoning by large language models.
https://arxiv.org/pdf/2305.04091
【7】Large language models are human-level prompt engineers
https://arxiv.org/pdf/2211.01910
【8】Large language models as optimizers
https://arxiv.org/pdf/2309.03409
【9】Chain-of-thought prompting elicits reasoning in large language models
https://arxiv.org/pdf/2201.11903
【10】Active prompting with chain-of-thought for large language models
https://arxiv.org/pdf/2302.12246
【11】Automatic chain of thought prompting in large language models
https://arxiv.org/pdf/2210.03493
【12】Automatic Prompt Augmentation and Selection with Chain-of-Thought
https://arxiv.org/pdf/2302.12822
【13】Program of thoughts prompting: Disentangling computation from reasoning for numerical reasoning tasks
https://arxiv.org/pdf/2211.12588
【14】Tab-CoT: Zero-shot tabular chain of thought
https://arxiv.org/pdf/2305.17812
【15】Tree of thoughts: Deliberate problem solving with large language models
https://arxiv.org/pdf/2305.10601
【16】Graph of thoughts: Solving elaborate problems with large language models
https://arxiv.org/pdf/2308.09687
【17】Recursion of Thought: A divide-and-conquer approach to multi-context reasoning
https://arxiv.org/pdf/2306.06891
【18】Skeleton-of-thought: Large language models can do parallel decoding
https://arxiv.org/pdf/2307.15337
【19】Learning to Reason with LLMs
https://openai.com/index/learning-to-reason-with-llms/
【20】Scaling LLM Test-Time Compute Optimally can be More Effective than Scaling Model Parameters
https://arxiv.org/pdf/2408.03314
【21】Let’s Verify Step by Step