最近大火的deepseek-r1模型中的'r'指的就是reasoning model,OpenAI的o3-mini也是reasoning model,他们和以前的大语言模型最直观的区别就是它的输出不仅仅有答案,还包含了推理的过程(思维链,chain of thoughts, COT),通过这篇文章来讲下这种推理模型。
Reasoning LLM
相比于传统的大语言模型,reasoning model倾向于将一个问题拆解为多个小的步骤或思考过程,最后得出答案。
那么,到底什么叫思考过程,推理步骤或思维链呢?
尽管我们可以从哲学上分析LLM是否可以向人类一样思考,这些推理步骤将过程拆解为更小的结构化的推理。
换句话说,大模型在学习如何去回答问题,而不是传统LLM的答案是什么。
想要了解LLM是如何训练的,我们要先知道从scaling training(训练时计算)到推理(测试时计算)的范式转变。
Train-time Compute
为了提升模型性能,一般会增加以下3个方面的size:
-
模型(增加参数量)
-
数据集(扩大数据集)
-
计算量(提升计算效率)
这些统称为train-time compute,预训练数据就像AI的燃料。你的预算越充足,模型效果就越好。
这个既发生在预训练阶段,也发生在微调阶段。
Scaling Laws
模型的规模(通过计算、数据集大小和模型大小)与模型性能的相关性是通过各种缩放定律来研究的。它们是所谓的 “幂定律”,其中一个变量(例如计算)的增加会导致另一个变量(例如性能)的比例变化。
最著名的是“Kaplan”2 和“Chinchilla”3 缩放定律。这些定律或多或少表明,模型的性能将随着计算、标记和参数的增加而提高。
必须同时扩大这三个因素才能获得更优异的性能。
Kaplan 缩放定律指出,缩放模型大小通常比缩放数据更有效(给定固定计算)。相比之下,Chinchilla 缩放定律表明模型大小和数据同样重要。
随着规模的增大,收益会减小,边际效益会更明显,问题是我们现在已经在瓶颈处了吗?
Test-time Compute
测试时计算允许模型在推理时使用更长的时间。
普通的LLM一般会直接输出答案,跳过所有的推理步骤。
而reasoning model会通过系统的思考步骤,使用更多的token来生成回答。
这个想法是 LLM 必须花费资源(如 VRAM 计算)来创建答案。然而,如果所有的计算都花在生成答案上,那就有点低效了!相反,通过事先创建更多包含额外信息、关系和新想法的标记,模型花费了更多的计算来生成最终答案。
Scaling Laws
相比之下,test-time compute的scaling laws是个更新颖的概念。
下图所示为OpenAI给出的test-time compute的scaling曲线,看起来和train-time的规律是一致的。
尽管这样,他们还是说由于这是个新的领域,可能会出现新的范式。
随着测试时计算和训练时计算一样扩展,reasoning model会使用越来越多的测试时计算。
通过这样的范式转变,不同于以往的纯train-time compute,reasoning model会在训练和推理之间权衡。
Categories of Test-time Compute
DeepSeek-r1和openai o1的成功表明肯定,除了“思考更长的时间”,肯定还要很多技术。
Test-time compute可以是很多东西,比如思维链,修改答案,回溯,采样等。
可以大致分为两类:
-
根据验证者搜索(search against verifiers)(生成采样和选择最佳答案)
-
修改提议分布(modifying proposal distribution)(训练过的思考过程)
左图为output-focus,右图为input-focus的
有两种verifiers:
-
Outcome reward models(ORM)
-
Process reward models(PRM)
ORM只关心结果不关心过程,而PRM只关心过程。
更详细的解释:
Search against Verifiers
主要是2步:
-
首先,生成许多推理过程和回答;
-
然后,使用一个verifier-奖励模型评价生成的输出。
Verifier一般是个LLM,微调后用来评价结果或者过程。
使用verifier的主要好处就是不需要重新训练或者微调你的模型。
Major Voting
最直接的方法并不是使用一个verifier,而是投票。直接让模型生成多个答案,生成次数最多的就是答案。
这种方法也叫自洽,强调多次生成的必要性。
Best-of-N samples
这种方法会生成n个样本,然后使用verifier评价每个答案。
首先,LLM或叫proposer,生成多个答案(使用高temperature或不同的temperature)
然后,每个回答都会经过一个ORM,得到一个表示回答质量的分数,选择得分最高的回答。
推理的过程也可以通过PRM来评价每个推理步骤的质量,最后选择得分最高的。
也可以求多次生成结果的加权得分,选择最高得分,比如:
Beam search with process reward models
生成答案和中间推理步骤的过程可以通过束搜索进一步扩展。通过beam search,可以采样多个推理步骤,每个都使用PRM评价。Top-3的束将被追踪。
这个方法可以快速停止那些没有成效的推理路径。
最后的三个结果会使用之前提到的Weighted Best-of-N方法评价。
Monte Carlo Tree Search
树搜索更有效的方法是蒙特卡洛树搜索,包含以下几步:
-
Selection(根据预先决定的公式选择叶子节点)
-
Expand(创建额外节点)
-
Rollouts(随机创建新节点直到结束)
-
Backprop(根据输出更新双亲节点的分数)
这些做法的主要目的是持续扩展最佳推理步骤的同时探索其他路径。
因此这是探索和开发之间的平衡,节点的更新方式如下:
所以,当我们选择一个推理步骤时,它不一定是迄今为止最好的路径。
使用这类公式,我们可以从选择一个结点开始,然后通过生成新的推理步骤来扩展它。和前面一样,我们可以设置一个较高的或不同的temperature.
选择其中一个推理步骤,然后扩展多次直到获得多个回答。这些扩展可以通过PRM,ORM或者两者都用来进行评价。
父节点的分数在反向时会被更新,然后我们可以重复刚才的过程。
Modifying Proposal Distribution
模型不再通过verifiers来搜索正确的推理步骤,而是在训练的过程中创建改进的推理步骤(以输入为中心的)。
换句话说,从想法/token采样的分布被修改了。
假如我们有一个问题和一个可以从中采样token的分布,最常见的策略就是从中选择分数最高的token。
然而,上图中红色的token才是那些可能导致推理步骤的token
尽管采取贪心的策略选择的token不一定会错误,但是选择会导致推理步骤的token一定可以得到一个更好的回答。
当我们修改提议分布(token 概率分布)时,我们本质上是让模型对分布进行重新排序,以便更频繁地选择“推理”token。
有很多修改提议分布的方法,大致分为以下两类:
-
更新prompt通过提示词工程
-
训练模型更关注推理token/步骤
Prompting
通过prompt工程,我们尝试通过更新prompt来提升输出。这个过程还可能促使模型展现出之前看到的推理过程。
为了通过提示改变提议分布,我们可以向模型提供示例(上下文学习),模型必须遵循这些示例才能生成类似推理的行为。
这个过程可以进一步简化,只需说“让我们一步一步思考Let’s think step-by-step”。同样,这改变了提案的分配方式,使得 LLM 倾向于在回答之前分解流程。
然而,模型并没有天生学会遵循这一过程。此外,这是一个抑制自我完善的静态线性过程。如果一个模型从一个不正确的推理过程开始,它往往会保留它而不是修改它。
STaR
除了提示之外,我们还可以让模型学会“推理”,方法是对其进行训练,以便在生成这些推理步骤时获得奖励。这通常涉及大量的推理数据和强化学习,以奖励某些行为。
一种备受争议的技术被称为 STaR,即自学推理器 。STaR 是一种使用 LLM 生成自己的推理数据作为微调模型的输入的方法。
在第一步 (1) 中,它会生成推理步骤和答案。如果答案正确 (2a),则将推理和答案添加到三元组训练数据集 (3b)。此数据用于对模型进行监督微调 (5):
然而,如果模型提供了一个不正确的答案(2b),那么我们提供一个“提示”(正确答案),并要求模型推理为什么这个答案是正确的(4b)。最后的推理步骤是添加到用于执行模型监督微调的相同三元组训练数据中(5):
这里的一个关键要素(以及修改提议分布的许多其他技术)是我们明确训练模型以遵循我们展示的推理过程。
换句话说,我们通过监督微调来决定推理过程应该如何进行。
整个流程非常有趣,因为它本质上是生成合成训练示例。使用合成训练示例是一种在其他模型中提炼此推理过程的不可思议的方法。