OpenAI o1的合成数据与推理搜索是怎么实现的

背景简介

首先推荐阅读一下拾象的《LLM 的范式转移:RL 带来新的 Scaling Law》,很好地科普了一下基于 RL 的新 LLM scaling 范式。

之前我们常说的 scaling law 一般指的是 pre-train 阶段通过算力、数据、模型参数量的提升来不断提升模型智能水平。不过最近一年来看,碰到了不少瓶颈:

  • 算力 上我们受限于超大规模训练集群的各种工程挑战,例如 LLaMA 3 的 paper 里就提到他们的万卡集群每两小时就会有坏卡问题出现,所以进一步拓展到 10 万卡规模的集群目前看起来难度很大。
  • 数据方面,文本数据达到 10-20T token 量级后,需要进一步在数量级上提升目前也比较困难了。尤其是能带来“增量收益”的复杂推理方面的数据更加稀缺。

所以大家普遍有感觉,自从 GPT-4 发布后,基本没有出现让人惊艳的模型能力大幅提升的“魔法时刻”了。

不过 Claude-3.5 和 OpenAI o1 还是逐渐展现出一个新的发展方向,也就是拾象所谓的 RL 带来的新范式。RL 这个定义其实很广泛,在 OpenAI o1 里是怎么体现的呢?可以看他们的这张图:

训练和推理阶段的 scaling

左图讲的是训练时的 scaling,结合前面所说的数据量的挑战,这块结合 RL 的主要做法就是所谓的“合成数据”。

利用 LLM 合成训练数据

就如上面这张经典的图,我们可以通过 LLM 来生成一系列回答,再通过 LLM 自己作为 reward model 给回答打分,挑选出质量好的回答形成新的训练数据(这个图里是偏好数据)。大家之前普遍认为 Claude-3.5 在数学、代码等方面的能力提升很大一部分来自于这个方法。尤其是数学和代码方面比较容易形成更精确的 reward 计算(类比 AlphaZero 等)。

右图讲的是推理阶段的 scaling,这个最初的形式可能就是 Jason Wei 提出的思维链(CoT)方法了,后来的诸如 ToT 也是其拓展,跟 AlphaZero 中的 MCTS 方法很类似。

OpenAI o1 背后的运作方式

结合官方给的这张图,大家对 o1 的一个直观理解就是自带了多轮隐含 CoT 的模型,当然背后的方法可能比较复杂。这里一个很重要的点仍然是之前提到的用来筛选数据的 reward model,可以帮助在 test time 评估多个候选生成、推理步骤。

总结来看,reward model 的确是个核心,在合成数据时,能帮忙判断数据质量,提供更“稠密”的反馈信息;在 test time search 时,同样也是评估生成质量,看是否继续探索,或者及时剪枝。

问题

这两个应用 RL 的方式看起来还是比较直观的,但背后还是有许多有趣的问题,例如:

  • 模型自己生成数据给自己训练,真的能不断提升甚至超过人类能力吗?
  • 在数学和代码之外的领域,如何构建有效的 reward model?
  • 推理时进行搜索优化有哪些提高效率和效果的方法?
  • 怎么平衡训练时 scaling 和推理时 scaling 两者的算力投入?

带着这些问题,我也去找了些 paper 来读,不过个人视野范围非常有限,可能遗漏了不少重要的工作,也欢迎各位大佬推荐好的学习资料。

Synthetic Data

Reinforced Self-Training (ReST) for Language Modeling

1
https://arxiv.org/abs/2308.08998

一篇比较早的讲合成数据应用于模型训练提升的文章,方法比较直观。

迭代使用合成数据有持续提升
  • 主要分为两个阶段。Grow 阶段,让模型生成多个输出预测。
  • Improve 阶段,利用 reward model 对上面的输出数据进行过滤,选出高质量的来 fine tune。
  • Fine tune 时会混入原始数据,跟 RLHF 类似,防止模型跑偏或者 collapse。
  • 这篇文章做的是翻译任务,用 Metric X 作为 reward model,感觉有 overfit 的风险。
  • 多轮迭代能持续提升能力吗?从论文中来看效果不错,包括 grow 一次,improve 多次,或者 grow 也可以做多次,能持续提升。
  • RL 训练之后的多样性如何?文中提到仍然可以结合 best-of-N 获得 test time 的提升。
  • 这个策略看起来比较简单,如果应用于数学/代码等领域,是否会有 reward hacking 问题?后续有不少文章指出了这一点。

Self-Rewarding Language Models

1
https://arxiv.org/abs/2401.10020

前面合成数据的示意图就来自这篇文章,也是相当知名的一篇工作。

  • 跟 ReST 做 SFT 不一样,这里是使用模型自己生成内容,自己打分形成偏好数据集,进行 DPO 训练生成下一代模型。
  • 实验跑了 3 轮,有持续提升,但继续跑效果可能会饱和,注意这里效果的验证用的是一个其它模型(GPT-4)和人工评估,而不是继续用模型自己来评判。
  • 除了任务本身的微调数据外,额外准备给任务打分的评估微调数据会对 LLM-as-a-Judge 效果有额外提升。
  • 任务能力的提升也带来了评估能力的提升,有意思。
  • 吐槽了一下前面提到的 ReST 方法仅添加正面样例来做 SFT 在他们的场景中没效果,偏好数据才有效果。
  • 语言模型评估往往倾向于更长的回答,或许是一种 reward hacking 的表现。另外也有多样性丧失的风险。

Training Large Language Models for Reasoning through Reverse Curriculum Reinforcement Learning

1
https://arxiv.org/abs/2402.05808

同样是讲合成数据结合 RL,重点在 reward model 和数据构建的创新上。

巧妙的“训练课程”构建
  • OpenAI 之前发过文章表示,面向过程的 reward model(PRM)效果要显著优于面向结果的 reward model(ORM),但是面向过程需要大量的人工打标工作。同样,RLHF 也很贵。
  • 这篇文章提出了一个简单却很有效的办法,我们可以只用面向结果的 reward model,但巧妙地构建出难度循序渐进的多步推理数据,实现近似面向过程的 reward model 的效果。
  • 具体方法是,让模型生成多步推理和最终结果,然后用面向结果的 reward model 找出那些正确的。假设正确的推理过程有 5 步,分别构造已知前 4 步,推理最后 1 步,已知前 3 步,推理后 2 步,以此类推,难度逐渐提升的训练数据,这里的训练数据都可以通过面向结果的 reward model 来给出 reward,提升了奖励信号的密度。
  • 他们也使用 PPO 来进行训练优化,在具体训练时需要注意数据混合,不要用大量的简单推理问题让模型学歪了。RL 里玄学还是比较多的样子。
  • 另外一篇工作 Dense Reward for Free in Reinforcement Learning from Human Feedback,虽然讲的不是合成数据,但跟这篇文章目标类似,通过 reward model 的 attention 来构建更丰富的 reward signal。

Easy-to-Hard Generalization

合成数据能否实现“飞升”是个很有意思的问题。一开始我想到的是 OpenAI 的 weak-to-strong,但读了下发现这个主要是用于 scalable alignment,用弱模型来对齐下一代的强模型,对齐后的强模型能力会下降,但确保了安全。而我们更关心的是模型在简单问题上训练能否泛化到解决困难的问题。

Easy-to-Hard Generalization: Scalable Alignment Beyond Human Supervision

1
https://arxiv.org/abs/2403.09472

在 AlphaZero 这类游戏环境中,模型的确可以通过完全的自我探索,生成数据,训练提升来达到超过人类的水平,但对于数学这类更难定义 reward 的领域如何呢?

实验设定
  • 这篇文章主要研究模型在简单的问题上的训练后能不能泛化到解决更难的问题,主要通过数学题来进行实验。实验设定比较复杂,简单来说一方面验证在简单问题上做 SFT 看能不能解决复杂问题;另一方面在简单问题上训练 reward model,看能不能在 test time 和 RL 中提升效果。
  • 一个直觉:困难的数学问题,经过拆解后,每个推理步骤是简单的,如果每个中间步骤都正确,那么大概率也能解决困难问题,所以可能存在从简单到困难的泛化。
  • 文章做了不少实验,选几个有意思的结论。只在简单问题上做 SFT,的确能够解决一些困难问题,效果与在全量问题上做 SFT 不会差太多。
  • 只在简单问题上做的 reward model,也能大幅提升模型的整体效果(test-time search),尤其是在困难问题上,这里的泛化效果比 SFT 更明显。
  • 混合面向结果和面向过程的 reward model(OPRM)效果更好。
  • Test time search 中,带权重的投票效果最好,不过这里没有比较更复杂的 MCTS 等。
  • 进一步使用 RL 方法来提升模型,效果上来说 PPO > DPO > ReST,而且仅在简单问题上训练的 SFT model + reward model 也能超越在所有数据上跑 RL 的效果。
  • 可惜文章没有进一步研究 reward model 能不能与 SFT model 那样继续通过合成数据来提升。

The Unreasonable Effectiveness of Easy Training Data for Hard Tasks

1
https://arxiv.org/abs/2401.06751

上一篇文章中提到在简单问题上训练的效果泛化到困难问题上,甚至比用了困难数据训练的模型效果还要好。这篇文章也给出了类似的结论:

在简单问题上 fine tune 能泛化到困难问题
  • 当困难问题的数据难以收集或者噪声较大时,通常使用简单问题的数据训练就能有很好的效果。
  • 如果要解决的困难问题是大学水平的 STEM 问题,那么用多简单的数据来训练模型能达到比较好的效果?文章的结论是初中水平的问题表现就挺好了。
  • 这篇文章也提到了担心他们用的模型里已经见过评估集里的困难问题了,不过 Physics of Language Models(强烈推荐学习)里做了限定更加严格的实验,证明了这种泛化能力的存在。

Small Language Models Need Strong Verifiers to Self-Correct Reasoning

1
https://arxiv.org/abs/2404.17140

合成数据与 test time search 交叉的一个研究。

提升自我修正能力
  • 大模型默认的自我纠正能力都不太好,但可以通过训练来优化。
  • 让模型生成回答,自己进行 verify,尝试 recover,把成功的那些作为训练数据去训练 refiner,这样就能有更好的 test time search 能力(从错误中恢复)。
  • 很多人都提到“判别”比“生成”容易,但这篇文章的结论是 verifier 是整个环节中最重要的,且往往需要更大的模型来实现提升。
  • 在合成数据实践中,reward model 的能力需求是不是会比 generator/actor 更高,且更难以提升?
需要一个强力 verifier

Test-time Search

Large Language Monkeys: Scaling Inference Compute with Repeated Sampling

1
https://arxiv.org/abs/2407.21787

非常知名的一篇讲 test time search 提升模型效果的文章。

LLM “猴”海战术
  • 使用比较弱的模型生成非常多的 candidates。
  • 使用 verifier 来选择最终答案,比如单元测试,证明检查 (lean),多数投票等。
  • 如果有精确的 verifier,最终效果提升与生成 candidates 数量呈 log-linear 关系。
  • 相比精确的 verifier,多数投票,reward model(ArmoRM-Llama3-8B-v0.1) 等往往在几百个 candidates 时达到效果饱和,reward model 需要 scaling。可以参考最新的 RewardBench Leaderboard。
  • 最大化覆盖范围随着问题的不同,最合适的模型也不一样,有时候 8B 模型最好,有时候需要用 70B 模型。
  • 未来方向:如何提升模型输出多样性,多轮交互(ReAct,树搜索等),从之前的尝试中学习。

An Empirical Analysis of Compute-Optimal Inference for Problem-Solving with Language Models

1
https://arxiv.org/abs/2408.00724

一篇类似的研究 test time search 策略和效果的文章。

inference time scaling
  • 同等计算量下,小模型往往具有更好的效果。但由于各种 test time search 的效果会饱和,在饱和后就需要引入更强的模型了。
  • 普通的 MCTS 算法(ToT 也算一种)效果不好,因为经常没法达到完整的 solution。
  • Best-of-N,加权投票等也都需要 reward model,他们是基于 Llemma-34B fine tune 了一个 process reward model。
  • 设计了一种新的树搜索算法,把 budget 根据 reward 大小来分配给不同节点,有希望的节点子孙更多,当完成的 solution 增多时,budget 就相应减少。
  • 在他们的实验中,新的搜索算法虽然表现好,但仍然是会效果饱和的。也就是不能在 test time 投入无限多的算力达到完美的结果。

Scaling LLM Test-Time Compute Optimally can be More Effective than Scaling Model Parameters

1
https://arxiv.org/abs/2408.03314

研究如何平衡在训练阶段投入算力和在推理阶段投入算力,达到总体最好的效果。

不同的 test time search 算法
  • 第一个维度,利用 verifier 来搜索好的解法。比较不同的 test time 搜索算法,包括并行采样,beam search,look ahead search。
  • 预算少或者问题困难时 beam search 效果好,预算多时暴力采样效果最好,look ahead search 总体来说表现不佳,跟上一篇文章结论一致。
  • 需要使用面向过程的 reward model 来实现 beam search 等复杂搜索算法。
  • 另一个维度,让模型自我修复。Fine tune 模型,使其能在推理过程中纠正自己的错误。需要把正确结果与相似的错误答案配对,使模型学会从错误中恢复的能力。可以发现这两个维度跟 o1 的两个图很相似。
  • 总体来说 sequential 多步推理的效果比多个独立的多步推理效果好,尤其是简单问题。
  • 算力用在 pre-train 阶段好还是 test-time 好?困难的问题或者 inference load(大规模用量)比较高时,把更多算力放在 pre-train 阶段更好。
  • test time 优化的数据也可以反哺 pre-train。
算力投入的权衡

Retrieval Augmented Thought Process for Private Data Handling in Healthcare

1
https://arxiv.org/abs/2402.07812

一篇比较有趣的 RAG 结合 MCTS 的文章,应用于 healthcare 领域。领域特定的 reward model 仍然十分关键,不过文章中没有比较 MCTS 与一些更简单搜索算法的效果。

RAG 结合 MCTS

Reward Model 畅想

o1 相比 gpt-4o 的提升

OpenAI 在文章中展示了 o1 相对于 gpt-4o 在各个领域的提升,其中也包括像法律、公共关系这类偏文科的专业领域。所以他们是否已经找到了构建通用 reward model 的路径?个人有一些猜测:

  • 如果假设语言模型的能力可以分解成语言理解、世界知识、逻辑推理几部分(参考 张俊林老师的文章),那么即使是文科领域的问题,甚至像创意写作这类,是不是也会随着逻辑推理能力的提升而随之提升?
  • 另一种思路是通过“元学习”结合 LLM 的综合能力来构建通用的 reward model,输出 correctness,helpfulness,safety 等通用标签,是否也能随着 scaling 达到通用 reward model?
  • 或许也可以从人类专家的经验开始 bootstrap,一个个构建垂直领域的 reward model(可能是目前最可行的),并找到一种让他们后续自我提升的方法。不知道是否有 reward model 自我提升,scaling up 的相关研究。
  • 所谓的隐性知识如何包含在 reward model 中?这或许是下一步通过多模态能力来拓宽模型的感知范围,然后才能转化成更丰富的 reward signal,比如跟人交谈时的语气感知,面部表情判断是否是个正向反馈。

大家在构建 reward model 时有什么经验和想法,也欢迎交流讨论。