注:本文写于2024年9月24日,有些技术猜测可能已经被证伪或过时。但是主线技术没问题,只是最后的技术猜测可能有错。
本文将试图以OpenAI历年来的研发思路变化为主线,涉及到可能的技术以及扩展,直至o1的出现。
1. 回顾历史:如何提高模型的推理能力?
很多任务例如代码、数学等都需要模型具备一定的复杂推理能力。那如何让模型能够做好数学题呢?
1.1. 如何完成中等难度的数学问题?
一个很自然而然的想法是对数学任务进行微调,这也是现在很多xx方向垂域强化在做的事情。
首先对模型进行微调[1],发现如果想在例如GSM8k上这类中等难度数学题上达到80%的准确率,模型尺寸至少要放大到10^16的量级,或者数据量增加2个数量级。但是无论何种方式,都是不可接受的成本。

随着训练epoch的增加PASS@1持续上涨,PASS@100持续下降,说明模型的解空间不断变小,答案的多样性持续下降。

整体看通过微调(pt scaling law)带来的性能上升带来的收益似乎是有限的,那既然在PASS@100的epoch 2附近达到了最高的通过率84%,是否可以通过训练一个模型通过判断回答是否正确在100个答案中让模型选择正确的一个作为模型最终的输出呢?

首先[1]训练了一个对结果正确与否进行判别的判别器——ORM(Outcome-supervised Reward Models),来直接对模型结果进行判断。该判别器通过对结果是否准确的二分类为目的进行训练。
At training time, the reward model makes predictions for every token in the context. The target for each token in a solution is the same, based on whether the solution is labelled correct or incorrect.[2]
由于数据微调2个epoch的PASS@100是最高的,因此使用该checkpoint采样100个,通过对结果进行简单判断,训练了一个判别器,发现verification任务具有较大的难度,因此在前期的性能较差,但是随着数据规模的上升,verification的模型可以很快的超过finetuning的模型,并且优势持续扩大。

同时,分类任务不仅可以以solution级别来进行分类,同样可以以token级别来进行分类。token级别会更加关注过程一些,效果也会更好一些(数据利用率也更高),不过显然,token级别的判别是更难的,因此ORM_token前期的效果其实是不如ORM_solution的效果好,但是随着训练数据的增加,显然ORM_solution在慢慢的被hack,效果在下降,而ORM_token级别的效果则更好也更鲁棒(下图a)。同时还验证了将预训练任务和判别任务融合起来训练(类似于Bert的MLM和NSP)效果会更好一点(下图b)。

另外,观察上图c,可以总结到:之所以ORM有效,可能的原因有2个:
- 模型在生成到后面之后其实是可以发现前面是错误的,但是由于不能进行backtrack,因此只能将错就错,从而产生错误或者幻觉。
- 模型学到了一些较为简单的启发式规则等,从而允许小模型(6B)依然可以校正大模型(175B)的输出。
到这里,就可以通过在100个采样中通过一个reward model找出最正确的那个response,做到整个模型的输出正确。相比只采样1个答案,采样100个答案在推理阶段的算力要求更高,但是更准确。因此引出一个新的scaling law——inference time scaling law。
另外,由于verification实际上类似于现在的reward model,因此猜测从这时开始,OpenAI就已经意识到pre-training阶段的算力ROI是远低于post-training(RL)阶段的ROI的。
论文通过这样一条pipeline,让模型具备了自我批评并改正的能力,模型越大自我批评与改正的能力越强。同时论文中做了一些对比实验,整体看在pipeline中让模型做一个二分类效果是比不做更好的,并且这个二分类的logits本身也是一个信号,可以用来做BoN筛选。
但是由于这篇论文是22年的论文,当时模型能力还相对较差(InstructGPT),后续OpenAI的工作改进了这套pipeline。
OpenAI在24年又发布了一篇类似的文章CriticGPT[8],去掉了二分类判别,并且使用了新的RLHF流程。
这篇论文的工作主要在Code上。
由于现有的4/4o对于代码问题依然幻觉比较严重,并且有时候会带有过分的吹毛求疵,因此训练一个模型用来做code review。

该论文的做法和ChatGPT的RLHF比较类似:
- 使用一组prompt在GPT4上生成n组QA对。
- 使用人工标注这些QA对,为这些A编写critic。包括ChatGPT本身存在的bug和主动插入假装是ChatGPT输出的bug。
- 使用这些标注后的critic,人工进行评分,训练reward model。
- 使用PPO训练Actor模型。
这个过程使用了一个新的解码方式,用来平衡吹毛求疵和critic的有帮助性——Force Sampling Beam Search(FSBS)。其实这里其实就和o1的整体训练/解码方式比较像了,毕竟也是相近的工作,后面会提到。
介绍一下这个FSBS,如何平衡有帮助性和吹毛求疵呢?那就是用长度惩罚。
在解码时,使用了如下机制:
- 首先对每一个QA,强制添加“`(输出critic的pattern),让模型输出4个response。
- 使用reward model,选择其中最优的2个critic。
- 对这些答案删除EOS,添加“`继续强制输出critic。
- 使用reward model,选择其中最优的2个critic。
持续迭代4次,总计产生28个response。这些response对同一个prompt输出了不同数量的critic。

随后对多critic和长critic的response进行惩罚,以平衡有帮助性和吹毛求疵。
因此,如果模型想输出较多数量的critic,就必须显著提高critic的质量,有效的平衡了输出的质量。

就这些了吗?目前为止所有的实验冷启动都需要大量的人工标注,CriticGPT的标注使用了具有5年Python经验的专业人员,每条平均耗时50分钟。标注成本极其昂贵。那有什么有便宜一点的方案呢?
Anthropic认为,为什么我们还要费很多力气告诉模型什么是对的什么是错的?人类很多时候只需要一个很粗的“Constitutional”就可以界定什么事情可以做什么事情不可以做,而不用事无巨细的告诉你不可以抢银行不可以搞破坏。
因此Anthropic提出了AI宪法(Constitutional AI),全流程都使用AI监督AI,没有人工介入,因此Anthropic称这种范式为RLAIF (RL from AI Feedback)。
首先使用一个未经安全对齐的RLHF(Helpful RLHF)模型,使用一些对抗prompt(容易产生有害输出)获得一个有害的response,通过定义“宪法”让模型自我批评/改写,获得一个无害的SL-CAI(Supervised Learning Constitutional AI)模型。

随后继续使用SL-CAI生成QA对,继续由模型自己打标签认为哪一个答案是更优秀的一个。最终使用这个RM的soft label到常规的RLH(AI)F的流程中。获得RL-CAI模型。同时这个过程也可以主动添加“think step by step”获得CoT版本的RL-CAI。
模型最终的效果有帮助性介于未经过无害性微调的RLHF(Helpful RLHF)和经过有害性微调RLHF(HH RLHF)模型的中间。同时无害性显著强于两者。

这篇文章提供了一个低成本的数据迭代视角,不再局限于有明确正确/错误的理工科,可以让模型自我批判相对灵活的guideline,并且验证了有效性。
1.2.2. 过程正确
上面提到了使用ORM来做模型回答是否正确的判别方式,虽然我们已经做到了结果正确,但是ORM这里显然有存在个问题,就是模型生成存在过程是错误的,但是结果是对的情况。这部分数据会对模型的判断产生影响,同时还有更一定的CAP(Credit Assignment Problem)[3][4]问题,既结果是对的,但是究竟是哪一步对结果的影响是最大的?
对于一些强推理问题,很多文章证明了必须使用类似于CoT[6]的做法来获得过程并提升结果的准确性,越来越多的论文也证明一条强推理任务必须需要一个高质量CoT才可以完成,小模型+无限长的CoT可以解决世界上任何问题[11][12]。因此如果我们的中间CoT过程可以像上文的critics一样有明确的分界线,使用上文类似的thoughts选择,是不是就可以拿到一条高质量推理链路呢?
也就是说,如果有一个新的范式,模型可以以CoT格式输出获得更优秀的结果的同时,会有一个模型不断检查CoT路径是否正确,是不是就既可以过程正确,又可以结果正确了呢?
因此OpenAI设计了一个新的reward model训练方式——PRM[2](Process-supervised Reward Models)。它通过对证明过程中的每一步进行标注,从而判断每一条CoT是否正确。标签分为三类,除了明确的错误、正确之外,还新增了一个无法判断(ambiguity)。开源了800k这类数据(PRM800k)。

相比ORM,PRM的训练也有一些变化。可能是考虑到分布转移(distribution shift),PRM没有继续使用ORM的分类任务,而是沿用了Generate任务。整体方式变成:
- 每个中间step中使用一个
request_rating_token
和一个placeholder
连接。 - 每一个step都取出
placeholder
前的logit继续生成下一个token,获得rating。
Train:
-------------------->rating_for_step_1
question_tokens, |
solution_step1_tokens, request_rating_token, placeholder,
solution_step2_tokens, request_rating_token, placeholder,
|-------------------> rating_for_step_2
solution_step3_tokens, request_rating_token ------> rating_for_step_3
通过这种方式,可以通过一次计算就搞定一个sample的训练[31,32]。只不过需要一些工程支持,目前OpenRLHF已经支持了这种训练方式。
相比ORM的训练方式,优势为:
- 快,一次训练n个step,例如PRM800K实际上只有12k个sample,极大加速了训练流程。
- 模型的分布转移(distribution shift)情况更小,模型更容易训练。
整体看PRM的效果显著强于ORM和投票。

并且由于PRM的介入,模型的其他能力也得到了一定的上涨。比如这篇论文在Math上做的实验,一些OOD实验表明对于物理、化学等领域的性能也得到了显著增长。这种cookie为模型其他(理工科)领域的能力上涨提供了一定的便利性。

一个示例,PRM模型在检测到计算错误后,显著降低了后续流程的分数。该测试用例只获得了0.48分。

到这里,问题就解决了,我们自动化的拿到了正确的结果和正确的过程。
但是似乎还有更好地解决方案….
上面提到,虽然Let’s Verify Step by Step[2]使用了更加先进的PRM来作为reward model,但是LLM Critics Help Catch LLM Bugs[8]还有一个改进项,那就是Force Sampling Beam Search(FSBS),通过sample 级别的beam search来获得更加优秀的整体输出。那为什么不将这两个结合起来呢?
恭喜你,你(几乎)发现了o1。
其实纵观OpenAI这几篇工作的目的以及附录中的一些内容,其实可以发现OpenAI很多工作都是为了人工打标做的铺垫,不管是自动校验结果的[7]还是自动code review的[8],这两篇工作[7][8]做了大量的对比human vs human+model的测评效率以及准确性。考虑到ChatGPT(尤其是3.5)使用的是RLHF而不是RLAIF[9],猜测OpenAI一开始可能也只是想降低标注成本,随着模型性能的不断提升,逐渐的发现可以用来做self-critic甚至于RLAIF[9]在作为强化学习的reward信号。
整体思路还是极其连贯的,因为xx所以我想xx。不过这条路走下去的挑战依然是一些主观的评价,相比理工科正确性很强,模型可以很好的进行critic,例如文学艺术创作这类主观性很强的任务,如何进行自动化测评依然是未来一个较大的挑战,虽然例如“AI宪法”提供了一个可能的路线,但是人类朴素价值观的相近和对创作的开放态度,这依然是一个很大的gap。这一点上即使是OpenAI目前也没有找到比较合适的reward model训练方法。
从上文中OpenAI的技术演进路线可以发现,强化学习在其中占据了非常重要的位置,但LLM和RL的结合并不简单。
- 强化学习中的Agent、State、Action等要素在NLP语境中分别指什么?
- 语言模型又是如何根据Reward更新的?
2.1. RLHF

RLHF是之前成功的LLM+RL算法,他的Agent就是LLM,state就是当前的输出,action就是token。
如上图,RLHF 的完整工作流程可以分为监督微调、奖励模型训练、强化学习微调三个阶段。
在RLHF-PPO阶段,一共有四个主要模型,分别是:
- Actor Model:这就是我们想要训练的目标语言模型,一般用SFT阶段产出的模型来对它做初始化。
- Critic Model:它的作用是预估期望总收益 Vt,一般用Reward Model初始化。
- Reward Model:它的作用是计算即时收益 Rt,用Rank Loss训练(通过排序序列学会打分)。
- Reference Model:它的作用是在RLHF阶段给语言模型增加一些“约束”,防止语言模型训歪(朝不受控制的方向更新,效果可能越来越差),一般用SFT阶段产出的模型来对它做初始化。

其中:
- Actor/Critic Model在RLHF阶段是需要训练的;而Reward/Reference Model是参数冻结的。
- Critic/Reward/Reference Model共同组成了一个“奖励-loss”计算体系,我们综合它们的结果计算loss,用于更新Actor和Critic Model
RLHF-PPO训练过程:
- 第一步,我们准备一个batch的prompts。
- 第二步,我们将这个batch的prompts喂给Actor模型,让它生成对应的responses。
- 第三步,我们把prompt+responses喂给我们的Critic/Reward/Reference模型,让它生成用于计算actor/critic loss的数据,按照强化学习的术语,我们称这些数据为经验(experiences)。critic loss我们将在后文做详细讲解,目前我们只把目光聚焦到actor loss上。
- 第四步,我们根据这些经验,实际计算出actor/critic loss,然后更新Actor和Critic模型。Actor 的 loss 函数是通过 discount reward 和 importance ratio 来计算,Critic 的 loss 通过当前的预测值和真实值加上下一时刻的预测值之间的差值来计算。
2.2. 蒙特卡洛树搜索(MCTS)
RLHF是很好的把RL用在NLP任务中的方法,o1在它的基础上又做了新的工作,为了打开模型推理的解空间,o1应该使用了MCTS之类的树搜索算法,MCTS是一种用于解决强化学习问题的高效的树搜索算法,可以平衡利用和探索。MCTS使用模拟来构建一个 MDP 树。评估状态存储在一个搜索树中。评估状态集合是通过迭代以下四个步骤增量式地构建的:
- 选择:在树中选择一个未完全扩展的单结点。这意味着它至少有一个子结点尚未被探索。
- 扩展:通过从该节点应用一个可用的行动(由 MDP 定义)来扩展该结点。
- 模拟(Rollout):从一个新结点中,对 MDP 进行一次Rollout。如果搜索树是有限的,可以进行完整的随机模拟,使其达到终止状态。但如果搜索树是无限的,可以只在其中执行一段时间,然后估计结果。
- 反向传播:最后,将结点的价值反向传播到根结点,使用期望价值更新途中经过的每个祖先结点的价值。
2.2.1. AlphaGo Zero中的MCTS
AlphaZero结合了MCTS和RL,MCTS是主体,RL起到了加速搜索速度的作用。在Self Play过程中,对于某个AI棋手,它会用MCTS搜索,对当前状态 S 下各个可能落子(Action)都去搜一下,每个位置经过搜索之后,能获得每个落子位置赢棋的概率分布 π ,从中选择概率最大的位置来落子,之后另一个AI棋手也采用类似的思路去落子……这么一来一回直到分出胜负( z 指出谁是胜者,Reward信号)。

【a图】表示自对弈过程 。在每一个位置,使用最新的神经网络执行一次MCTS搜索。根据搜索得出的概率进行落子。终局时根据围棋规则计算胜者,
是每一步时执行MCTS搜索得出的结果(柱状图表示概率的高低)
【b图】表示更新神经网络参数过程。使用原始落子状态作为输入,得到此棋盘状态
下下一步所有可能落子位置的概率分布
和当前状态
下选手的赢棋评估值
以最大化
与
相似度和最小化预测的胜者
和局终胜者的误差来更新神经网络参数
, 下一轮迭代中使用新神经网络进行自我对弈。
树搜索流程

【a图】表示模拟过程中遍历时选 Q+U 更大的作为落子点
【b图】叶子节点的扩展和评估。使用神经网络对当前状态进行评估。
【c图】更新行动价值 Q 等于此时根状态 s 所有子树评估值 V 的平均值
【d图】当MCTS搜索完成后,返回这个状态 s 下每一个位置的落子概率 π
总结:MCTS就是一个高效的平衡利用和探索(剪枝)的树搜索算法
2.2.2. NLP任务中的MCTS
参考AlphaGo Zero的做法,假设Action是每一个句子(Action可以有不同的层级,后面会讨论,这里只讲NLP任务中MCTS的做法)。在搜索时会用策略网络 P 和价值网络 V 来快速寻找最优搜索路径,选择概率最大的Action作为当前状态下的行为,由模型生成针对这个行为下response。将response并入用户问题,形成新的State,依次往后走,直到产生问题的答案。
具体搜索过程:
- 从状态 S 出发,搜索某个“句子”指向正确答案的概率时,以 max(Q+U) 的方式寻找最优下一状态 S′ ,而 Q 函数与价值网络 V(S) 正相关, U 函数与策略网络 P(S,A) 正相关,所以 max(Q+U) 的含义是通过价值网络和策略网络的指引,来寻找高质量的搜索路径
- 当搜索到叶结点的时候,会进行节点扩展,并用策略网络和价值网络估算初始化相关搜索参数,之后由低向上更新最优路径上所有状态对应的 Q 函数。
- O1搜索时与下棋不同的地方在于:如果要往下一状态转移,还需要根据当前选到的行为,产生对应的Hidden CoT tokens,这个步骤可由Best-of-N Sampling策略来完成。
参数更新过程:
- 当每个候选的“句子”经过一轮搜索后会得到所有行为的分布概率 π ,用于更新策略网络 P(S,A) 。
- 对于搜索过程每个被选中“句子”通过Best-of-N Sampling得到的对应Hidden CoT tokens序列,可以拿到PRM赋予这个tokens序列对应的Process Reward分数),用来更新价值网络 V(S) 。
3. o1:技术路线猜想与复现
3.1. o1的实现猜想
本节主要是对o1的实现做一些猜测,猜测的信息来源主要是一些OpenAI研究员以及一些分析。
正如前文提到的,小模型+无限长的CoT可以解决世界上任何问题[11][12]。因此,o1一定是一个通过使用超长CoT来强化模型输出正确答案能力的模型。

那接下来将以以下几个部分来描述。
首先,o1是一个模型并非一个系统,因此o1这类模型需要很强的推理能力,并且需要较强的对话能力来做self-critic这类动作。

考虑到o1在System card中一直提到的o1-mini的世界知识很差[20],猜测o1是一个from scratch训练的小模型。因此将整体的技术栈拆解为:
- pre-training阶段:
- 强化推理能力
- post-training阶段:
- sft:
- 继续强化推理能力
- RL:
- 探索如何扩大模型的解空间
- 训练一个更优秀的reward model
- inference阶段:
- Best of N

3.1.1. Pre-Train阶段
这一部分因为后面RL仍然有较大的自由度,因此基模相对重要性应该比较低。因为后续使用了树搜索,甚至可以是不是那么强的模型——因为解空间足够大总有一条输出路径可以达到正确解。不过较好的预训练模型可以有效降低后续RL的计算成本。
但是预训练阶段应该需要提升模型的推理能力,目前已知的一些策略是提高例如Code、Math、论文等数据占比,减少例如cc等数据,提升模型的训练ROI。
3.1.2. SFT阶段
这一阶段和pre-training阶段的目标一致,就是强化CoT、Chat等数据占比,增强模型长CoT输出能力和对话能力。
3.1.3. 强化学习阶段
OpenAI的很多工作都做在强化上,OpenAI的强项一直都是RL,OpenAI自己对外说RL相比Pretrain阶段的提升,算力可以节约30倍。
o1的访谈可以总结出以下几点比较有效的:
- RL输出的CoT比人的更好(比如人类总是更喜欢好理解而不是逻辑严谨的内容)。
- 虽然有一些挑战(比如如何设计reward等),但是RL是可以一直走下去的一条路线。
- CoT + self-critic 可以解决世界上任何的问题。

具体来说,o1相比其他模型有其他几个挑战:
- 如何扩大模型的解空间?换句话说如何让模型输出更长、更优秀的CoT?
- 如何确定CoT质量?
3.1.3.1. 如何扩大解空间
模型需要扩大常规的解码空间,以此来获得更加优秀的长CoT和结果。
3.1.3.1.1. MCTS
MCTS是目前较多工作使用的一个扩大解空间的策略[13,14,16,24-29],也是AlphaGo Zero使用的方案。
在下文中,首先定义Action为每一次搜索中下一个动作,比如在围棋中为落子的地点。
3.1.3.1.1.1. 在解空间中搜索CoT路径
仿照AlphaZero,构造MCTS树,对于每个Action进行搜索。
经历过这些节点的搜索路径更容易达到正确的结果,因此在随后的训练中被强化。推理过程中也就依然而然的会输出这些信息获得更优秀的结果。
3.1.3.1.1.2. o1的Action
1. Thought作为Action
这是最自然的想法,o1的Hidden CoT产生过程,本质上是在让机器模仿人在解决复杂问题产生的思考过程,而人在思考复杂问题时,有比较固定且数量并不太多的“思考模式”或者可以叫“思考因子”。
比如拿到一个复杂问题,我们一般会首先明确这个问题的目标是什么,然后把复杂问题拆解成几个环节或者步骤,为了得到某一个具体步骤的解法,可能会提出一个假设,然后验证这个假设是否成立,如果不成立,那么继续提出新的假设,直到解决这个子问题…..我们也可能在过程中会进行验算并发现某些中间环节出现错误,并把错误修正过来。
比如:“拆解问题”、“复述目标”、“检查结果”、“修正错误”、“提出假设”等等。而针对每个具体的“思考因子”,可以产生符合对应分布概率的Token片段,例如self-critic可能就是检查结果这个action对应的模型输出(其实上文的criticGPT主动拼接“`,其实也是人工选择action的一种)。

这种层级的COT结构,能体现出RL和LLM的优势结合,离散行为空间比如估算给定状态S采取何种行为,即函数Q(S,A)的估算,这是RL擅长做的事情,而思考因子标签中的Token生成则是LLM擅长的事情,LLM可以根据对应“思考因子”的类型,学习调整因子标签内部Token的生成概率。
2. Token作为Action
虽然thought是一个更简单更直观的方案,但是可能OpenAI可能用的并不是这类方案,理由如下:
- Hyung Won Chung最近的演讲说:不应该教机器如何去思考而是去激发他们学习如何去思考。
- o1开发人员采访视频中提到的,o1开发过程的“aha”时刻正是发现模型自发涌现诸如“反思”、“重试”这样的“思考因子”。
同时,OpenAI非常重视Scaling,倾向于不要教AI做事,要让AI自己去学习。
Give a man a fish, and you feed him for a day.
Teach a man to fish, and you feed him for a lifetime.
Teach him the taste of fish and make him hungry.
—— Hyung Won Chung from OpenAI[30]
用Token作为action可以每次取当前模型输出的topk作为当前可选的action,通过这种方式可以获得无限大的解空间。但是挑战依然是解空间无限大带来的训练难题。另外,如何设计reward model也是一个很难的事情。上问提到PRM相比ORM,可以缓解CAP问题,监督信号更多,效果更好。但是使用Token级别比较难应用PRM模型,更细致的TRM(token reward model)似乎又不太有技术可行性。但是考虑到OpenAI的一个方法论就是假设有无限多的算力来做事情,因此依然是一个可能的方向。
3. Patch作为Action
通过对比大量的o1的输出,可以观察到o1的输出token长度永远为32的整数倍。这启发我们考虑上面两者的结合:如果有一个细粒度介于Thought-level和Token-level之间的Patch-level action,是不是就可以解决这一问题。
参考ViT中分patch的操作,可以定义每32个token为一个patch,作为一个action,这样搜索空间会比Token-level更小,比Thought-level更大,也避免了为模型定义如何思考的问题。
另外,从reward model角度思考,使用patch-level可以复用PRM的技术和数据——只需要将每一个thoughts按照32裁剪/padding随后训练即可。因此o1的实际做法更倾向于这样。
3.1.3.1.2. 一定是MCTS吗?
上面我们提到,使用MCTS的目的是增大模型的解空间,但是这是唯一一个增大模型解空间的方式吗?答案当然不是,并且很多人也真的认为不是MCTS。
正方认为现在已有很多文章是在做LLM+MCTS的[13,14,16,24-29],并且他们自己早期的工作FSBS[8]也有一点树搜索的味道。
反方认为首先Noam不是做MCTS的,作为o1的核心贡献者,从研究的连贯性来说,Noam使用自己擅长的CFR(Counter Factural Regret)及其变种似乎也是一个合理的答案。其次MCTS在围棋中很强,CFR在德扑里很强,但是他们只在各自的领域内有效,在LLM领域究竟谁更胜一筹依旧不好说。
但是就像上面提到的,无论使用哪种方式,本质就是打开模型的解空间,只要这个模型有任何一条路径能够达到正确结果,找到并强化这条路径就可以了。因此个人理解甚至不要求这个模型底座有多强。
Through training, the models learn to refine their thinking process, try different strategies, and recognize their mistakes——OpenAI
3.1.3.2. 如何确定CoT质量?
个人分认为,还是倾向于PRM。有说法[15]说是ORM+PRM,不太认同,ORM在很多论文中都证明ORM持续没有PRM好;而且从训练数据看,ORM的训练数据可以认为是PRM的子集(信号更密集,数据利用率更高),不太可能子集的效果要比全集好。
另外,如果真是上文分析的patch级别的MCTS,则更需要PRM(或者PRM的变种)来对树进行剪枝,缩小搜索空间。
3.1.3.3. 安全对齐
指的格外一提的是o1安全对齐策略。
相比传统的RLHF做内容安全,新的o1更可能使用了Anthropic的AI宪法模式来做内容安全,结合强大的推理能力,o1的安全性会更加优秀。

3.1.4. Inference阶段
o1如何进行infer的?猜测是token by token进行输出,推理阶段并没有使用MCTS。原因一个是o1会输出错误的猜测,如果是树搜索没理由会有错误的节点。
另外,还做了输出token长度和输出延时的关系实验[19],整体是线性的,说明并没有token被隐藏,证明了是一个token by token的输出结构。

不过考虑到o1尤其是o1-mini的价格是4o-mini的20倍,因此线上很可能有多个模型并行(但这并不影响o1是一个single model的结论),使用PRM选择BoN来选择最优的thoughts,并且用了动态的难度计算来决定N[13]。
On the 2024 AIME exams, GPT-4o only solved on average 12% (1.8/15) of problems. o1 averaged 74% (11.1/15) with a single sample per problem, 83% (12.5/15) with consensus among 64 samples, and 93% (13.9/15) when re-ranking 1000 samples with a learned scoring function——OpenAI
动态计算资源选择[13]:

那既然o1是一个token by token的输出,那模型为什么这么贵呢?o1系列不仅输出价格贵,输入价格也贵。输入输出o1-preview分别是4o的4倍/3倍。mini的输入输出均是4o-mini的20倍。
输出的多样性是能否将infer time scaling law走下去的关键,否则即使有再好的PRM也没办法选择好的BoN输出,也就达不到预设效果。
Ideally, test-time compute should modify the distribution so as to generate better outputs than naïvely sampling from the LLM itself would. In general, there are two knobs to induce modifications to an LLM’s distribution[13]
即使单个模型即使开高T,多样性还是没有办法保证(比如上文self-critic工作中,所有的critic基本都指明了一件事)。
因此做出猜测:
- 输入端:由于使用了AI宪法,system prompt变长导致的;为了增加BoN采样的多样性,使用多个prompt甚至多个模型,强制增加多样性,因此kv cache不共用,只能增加价格。
- 输出端:这个价格增长基本上就是由于是多个模型(还要有摘要模型)造成的。动机还是前面提到的增加输出多样性。
3.2. o1的复现
目前o1的几个开源工作如下:
method | model | data | code | RL | |
Open-O1 | ❌(Todo) | ✅ | ❌(Todo) | ❌ | ❌(Todo) |
O1-journey | ✅ | ❌ | ❌ | ❌ | ✅(DPO) |
其实对于复现o1,有三个核心问题:
- 如何获取输出长CoT(with critic)?
- 如何保证数据准确性?reward model?
- 获取到有效数据后,如何进行后续训练?
3.2.1. O1-Journey[22]
目前没有benchmark测评对比。
输出demo:

对于o1-journey回答上述三个问题:
3.2.1.1. 方法
3.2.1.1.1. 如何获取长CoT输出?
通过一个叫journrey的方式。假设目前有2条推理路径(Math模型自有的CoT路径):
question->step0->step1->….->step6->right_answer (这类样本叫shotcut)
还有错误路径,例如
question->step0′->step1′->….->step6′->wrong_answer
极长思维链等于
“question->step0′->step1′->….->step6′->wrong_answer”+ “emmm, 好像不太对,我想一下” + “step0->step1->….->step6->right_answer”
类似的还有其他行为,reflections, corrections, reasoning,随后经过GPT-4o改写,获得长CoT。

3.2.1.1.2. 如何保证输出准确性(reward model)
使用上面的数据训练一个sft模型,在获取到可以输出长CoT的模型,但是一个问题是上述步骤很明显有较多冗余步骤。
因此生成一批高质量CoT数据继续微调sft模型。
这一步使用PRM+o1作为奖励模型构建数据,使用微调后的DeepSeekMath-7B-Base,进行beam search搜索与剪枝。
对比了多个模型作为reward_model。但是并没有数据表明这些reward的diff多大程度影响后续步骤的结果。

3.2.1.1.3. 后续训练
现在获得了可以输出不冗余长CoT的模型,接下来就是微调一个sft模型,使其可以输出不冗余长CoT数据。
主要分为以下几步:
- 使用Abel和PRM800k微调DeepSeek-math-7b-base。
- 使用上一步生成的长CoT低冗余数据(327个)微调sft模型。
- 使用PRM800k数据集采样的prompt,对第二步的模型继续采样20个response。其中结果正确的为chosen,结果错误的为reject。对正负样本进行DPO微调。
3.2.1.1.4. 总结
创建可以输出长CoT的模型->选择一批好数据->训练一个可以输出长CoT并且每一步都高reward的模型->DPO优化。
4. 引用
- Training Verifiers to Solve Math Word Problems. http://arxiv.org/abs/2110.14168
- Let’s Verify Step by Step. http://arxiv.org/abs/2305.20050
- Steps Toward Artificial Intelligence*. https://courses.csail.mit.edu/6.803/pdf/steps.pdf
- What is the credit assignment problem? https://ai.stackexchange.com/questions/12908/what-is-the-credit-assignment-problem
- Show Your Work: Scratchpads for Intermediate Computation with Language Models. https://arxiv.org/abs/2112.00114
- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. https://arxiv.org/abs/2201.11903
- Self-critiquing models for assisting human evaluators. http://arxiv.org/abs/2206.05802
- LLM Critics Help Catch LLM Bugs. http://arxiv.org/abs/2407.00215
- Constitutional AI: Harmlessness from AI Feedback. http://arxiv.org/abs/2212.08073
- STaR: Self-Taught Reasoner Bootstrapping Reasoning With Reasoning. https://arxiv.org/abs/2203.14465
- Towards Revealing the Mystery behind Chain of Thought: A Theoretical Perspective. https://arxiv.org/abs/2305.15408
- Chain of Thought Empowers Transformers to Solve Inherently Serial Problems. https://arxiv.org/abs/2402.12875
- Scaling LLM Test-Time Compute Optimally can be More Effective than Scaling Model Parameters. http://arxiv.org/abs/2408.03314
- Accessing GPT-4 level Mathematical Olympiad Solutions via Monte Carlo Tree Self-refine with LLaMa-3 8B: A Technical Report. https://arxiv.org/pdf/2406.07394
- Reverse-o1:OpenAI o1原理逆向工程图解. https://zhuanlan.zhihu.com/p/721952915
- MUTUAL REASONING MAKES SMALLER LLMS STRONGER PROBLEM-SOLVERS. https://arxiv.org/pdf/2408.06195
- Learning to Reason with LLMs. https://openai.com/index/learning-to-reason-with-llms/
- O1 journey. https://github.com/GAIR-NLP/O1-Journey
- Reasoning Series, Part 1: Understanding GPT-o1. https://leehanchung.github.io/blogs/2024/10/08/reasoning-understanding-o1/
- OpenAI o1 System Card. https://openai.com/index/openai-o1-system-card/
- A prompt that helps Claude 3.5 Sonnet beat OpenAI’s o1 model in reasoning! https://x.com/JeremyNguyenPhD/status/1842888290376261668
- O1 Replication Journey: A Strategic Progress Report. https://github.com/GAIR-NLP/O1-Journey
- Open O1: A Model Matching Proprietary Power with Open-Source Innovation. https://github.com/OpenSource-O1/Open-O1
- ALPHAZERO-LIKE TREE-SEARCH CAN GUIDE LARGE
LANGUAGE MODEL DECODING AND TRAINING. https://arxiv.org/pdf/2309.17179v1
- Towards Self-Improvement of LLMs via MCTS: Leveraging Stepwise Knowledge with Curriculum Preference Learning https://arxiv.org/pdf/2410.06508
- Accessing GPT-4 level Mathematical Olympiad Solutions via Monte Carlo Tree Self-refine with LLaMa-3 8B: A Technical Report https://arxiv.org/pdf/2406.07394
- Towards Self-Improvement of LLMs via MCTS: Leveraging Stepwise Knowledge with Curriculum Preference Learning https://arxiv.org/pdf/2410.06508
- Interpretable Contrastive Monte Carlo Tree Search Reasoning https://arxiv.org/pdf/2410.01707
- Monte Carlo Tree Search Boosts Reasoning via Iterative Preference Learning https://arxiv.org/pdf/2405.00451
- MIT EI seminar, Hyung Won Chung from OpenAI. “Don’t teach. Incentivize.” https://www.youtube.com/watch?v=kYWUEV_e2ss
- What’s the training pipeline of PRM? https://github.com/openai/prm800k/issues/3
- Questions about implmentation detail. https://github.com/openai/prm800k/issues/7
0 条评论