有点意思的论文 2410.13639
A COMPARATIVE STUDY ON REASONING PATTERNS OF OPENAI’S O1 MODEL
简而言之就是曼彻斯特大学,浙大和中科大还有一些开源的项目组一些一起研究OpenAI O1的人,来发O1为什么牛B的论文
正常,研究红楼梦毕竟也有红学(我是一集红楼梦也没看过,书和电视都没看过)。。。
文章主要讲分析猜测和评估OpenAI的推理模式在不同任务上的效果
同时也利用不同的模型比如GPT4o,Gemma,LLama, Qwen等尝试利用分析出来的O1的推理方式
也尝试过在链式推理的过程中使用不同的PRM(process reward model),包括LLama,GPT4o,甚至人类...
评估的标准主要是在:
1- 常识推理:其中选择HotpotQA和Collie来评估LLM的常识推理能力。HotpotQA主要关注需要LLM使用多个支持文档来回答的常识推理问题。Collie需要LLM根据不同层次的生成标准生成符合特定丰富组合约束的文本。
2-数学:直接使用AIME基准来评估模型的数学能力,AIME 22、AIME 23和AIME 24中的90个问题。
3-编码:使用USACO 竞赛的铜牌级别来测试LLM的编码技能。USACO专注于算法和问题解决能力。
因为现有的模型能力无法支持O1级别的链式推理,所以用GPT4o,Llama这些模型来实现的话,需要利用prompts来incontext-tunning,或者进行function calling来实现对每个step去找PRM分析best answer
计算方法,选择了四种方法可能得链式推理方式:
Best-of-N (BoN)。它使LLM为给定输入生成多个 N 输出,然后选择最合适的响应作为输出。
Step-wise BoN。它使LLM分析一个问题并将其分解为几个子问题。对于每个步骤,模型根据之前的子问题和答案生成 N 个响应,然后使用奖励模型选择最佳响应。这个过程反复进行,直到获得原始问题的最终答案。
Self-Refine。通过迭代反馈和改进,提高LLM的初始输出。
Agent Workflow。LLM智能体通过结构化工作流将复杂任务分解为较小的子任务,规划其执行并利用各种工具来实现其目标。(其实就是Agentic rag)
图表解释
这张图表显示了不同模型和方法在四个基准(HotpotQA、Collie、USACO、AIME)上的性能结果。这些基准分别用于测试常识推理、编码和数学能力。
表格说明
Setting(设置):分为Direct(直接生成)和Test-Time(测试时计算)。直接生成的意思就是模型直出,比如O1-preview和O1-mini,或者GPT4o直出,Test-Time的意思就是用外力(prompt,Agent)来模仿类似O1的可能性推理步骤。
Baselines(基线):列出了O1-preview、O1-mini、GPT-4o等模型。
N:表示生成的输出数量。
Overall(整体):各模型和方法总体表现。
Commonsense Reasoning(常识推理):包括HotpotQA和Collie两个子任务的表现。
Code(编码):包括USACO任务的表现。
Math(数学):包括AIME任务的表现。
通过解读,可以看出O1-mini在大多数子任务中表现优异(比O1-preview牛B,只是在code上谁也干不过O1-preview,看过O1的正式版评测,提升特别明显,这个后面有机会再写),尤其是在AIME数学任务中。相反,Self-Refine方法在各个任务中的表现相对较差。Agent Workflow方法在多个领域(特别是编码任务USACO)表现出色。
表里面的这个通过Test-Time的design来实现O1类似的推理方式的方法咋实现的呢?
其实也挺好理解的,我举几个例子
Best-of-N
就是在一堆答案里给选一个最好的,在强化学习领域O1的架构已经不是单一模型来support了,推理的结果一般都是呈现出多个,比如上图的多条链式推理,然后Verifier,也就是RM,reward model,会给出这些答案的一个最终的分数,选一个最好的。
这个其实挺好实现的,首先你prompt里面让GPT4o以COT形式回复。
但是这不是就一个答案吗?现在咱们让它给我生成2个以上的选择
这不就Vans了吗!
然后RM也就是Verifier来给结果打个分,这就是朴素的视线链式推理,并且BoN的方法,选出一个分数最高的,发给用户。
但是问题来了,面上来看,最终答案最好,也就是全局最好的答案,是局部最优的吗?
这还真不一定。理论上来讲只是这些答案中的最好。(子博弈。这块比较绕,我在强化学习的课程里,会陆续讲解,大家看不懂也没事,大概看个乐子就行)
第二种是啥呢?
Step-wise BoN
就是给你推理链里面的每一步得分,都由RM来打分,所以也就叫做PRM (process RM),作为这次推理里面哪一个是最好的, 然后被选择进入成为这个Tree的一个节点,然后就这么一步一步的推下去,每步推几个答案,选最后的,知道最终答案。
这个其实看着好像是比BoN牛B,但是一样犯悖论
什么悖论呢?就是局部最优(中间某一步最优)然后以它为节点继续推,推出的答案一定是最优的吗?
很显然,不是。
怎么实现呢?
其实随便瞎写写就能实现
def step_wise_bon(model, reward_model, input_text, N_intermediate, N_responses_per_step):
"""
Step-wise BoN with Reward Model.
Args:
- model: The language model used to generate responses.
- reward_model: The reward model used to score responses.
- input_text: The initial input text.
- N_intermediate: Number of intermediate steps.
- N_responses_per_step: Number of responses to generate per step.
Returns:
- final_response: The final response after all intermediate steps.
"""
# Initialize the intermediate responses with the input text
intermediate_responses = [input_text]
for i in range(N_intermediate):
step_responses = []
# Generate N_responses_per_step responses for each intermediate response
for intermediate in intermediate_responses:
responses = [model.generate(intermediate) for _ in range(N_responses_per_step)]
step_responses.extend(responses)
# Use the reward model to score and select the best response
best_step_response = max(step_responses, key=lambda response: reward_model.score(response))
# Update intermediate responses for the next step
intermediate_responses.append(best_step_response)
# The final response is the last response in the intermediate responses
final_response = intermediate_responses[-1]
return final_response
# Example usage
input_text = "What are the benefits of a healthy diet?"
N_intermediate = 3
N_responses_per_step = 5
# Assume `model` and `reward_model` are pre-defined and properly initialized
final_response = step_wise_bon(model, reward_model, input_text, N_intermediate, N_responses_per_step)
print("Final Response:", final_response)
就是分解完任务后,每一步作为循环的一个分支,每个分支完成前调一下RM,然后继续推
其实还有Beam-search,我自己做的类似O1的架构用的就是beam-search
看图的话,比较好理解
每一步都从N个答案中选出best-of-N,这也是大模型标准推理选择的decoding算法,也就是续写类任务
然后N个备选中的,比如绿色答案。就有资格再生成N个或者h个(看设计),然后这么一直推,直到树到了leaf节点,没东西可推了,比如无条件符合,或者有了最终答案。
这个和step-wise BoN的差不多,区别是树的搜索域更广,因为每一步都是Top K个,如果k=1其实就和step-wise BoN没啥区别了
下面是我的BYo1的截图,我这个的算法就是Beam-search,我实测它效果最balance一点,意思就是推理算力和时间和准确性的balance
其实还有一种就是Lookahaed Search
就是MCTS,蒙特卡洛书的带Verifier的版本,不像MCTS要随机的去一直推,因为有Verifier给打分,所以相对好一点,它每次都要推k步,然后推到底,再回头用总推理链的得分去评估,比如上图的4个链,哪个链的K步更好,然后选择以后继续在往下推K步,如果K=1,变成1步,也可以把Beamsearch当成lookahead search,某种意义上来讲,它尽力兼顾了全局和局部最优(Beamsearch只能k=1步,很难兼顾全局),我个人认为O1采用Lookahaed的算法可能性比较大,但是这玩意费算力,费显存,我自己也没弄,这个论文里也没弄
Self-Refine:
这个其实就是SCore,大家可以自己看看论文,看不懂我后面找机会讲,说白了,如果你用过早期O1,不是会发现它会自己审核自己发出来的中间步骤是否不和逻辑吗,这就是Self-Refine
def self_refine(model, input_text, iterations):
response = model.generate(input_text)
for _ in range(iterations):
response = refine_response(response)
return response
def refine_response(response):
# 定义如何改进响应的具体逻辑
return response + " (refined)"
大概这样就能实现,当然Train的时候就得加带reasoning的数据,硬去做这个self-refine,拿普通模型,还是有点别扭
Agent Workflow:
这个就纯调Agent了Agentic RAG类似的架构,也没啥可说的,调rag,调tool
前置条件都讲解完了,现在说测试结论:
Self-Refine方法的性能改进并不显著。在大多数任务中,Self-Refine相比GPT-4仅显示出了轻微的改进,并且在Collie任务中性能下降。作者认为,这是因为在反复精炼过程中,LLM可能生成稍微偏离所需格式的响应。(它模型就没经过Self-Refine测试训练过)
BoN在HotpotQA上表现相对较好。它展示了在推理阶段通过扩展时间搜索更多可能响应的必要性。然而,BoN在Collie上的性能相比原始GPT-4o有所下降。此外,当N增加时,性能略有下降。作者认为这是由于Collie严格的格式要求,限制了LLM生成的多样性输出。(可见简单的BoN拓展了动作空间就能有很好的效果,但是在玩指令遵从性比较严格的场景,动作空间越大,越难处理)
Step-wise BoN在复杂任务中的表现受限。对于Step-wise BoN,它在HotpotQA上取得了优秀成绩,但在其它限制输出文本的复杂基准上表现显著下降。作者认为这是因为逐步方法生成了许多中间步骤,但无法跟随原始问题。(和BoN一样)
Agent Workflow在所有基准上表现出显著的性能改进。Agent Workflow采用类似于Step-wise BoN的方法,将复杂任务分解为小的子任务,但设计了一系列领域特定的系统提示,从而减少了不必要的推理步骤并轻松完成长上下文推理。与Step-wise BoN相比,利用工具组合的Agent Workflow可以显著提升性能。(从O1的实际架构角度推测,确实是多模型服务,从这个角度上解读成Agent workflow,硬解释也可以)
文章也自己猜测和定义了几种O1的推理范式(注意,范式不是算法)
系统分析Systematic Analysis (SA):从问题的总体结构出发,O1首先分析输入和输出以及约束条件,然后决定选择的算法和数据结构的使用。
方法重用Method Reuse(MR):对于一些可以转化为经典问题(如最短路径或背包问题)的问题,O1可以快速重用现有方法来解决它们。
分而治之Divide and Conquer (DC):它将复杂的问题分解为子问题,并通过解决子问题来构建整体解决方案。
自我改进Self-Refinement(SR):在推理期间评估其推理过程,以确定是否存在任何问题并纠正任何错误。
上下文识别Context Identification (CI):对于一些需要额外信息输入的数据集(如HotpotQA),O1首先总结与查询相关的上下文的不同方面,然后给出相应查询的响应。
强化约束Emphasizing Constraints (EC):对于一些在生成的文本上有约束的数据集(如Collie),O1通常在推理过程中强调相应的约束。
随机选择了每个基准中的20到30个样本来统计不同推理模式的数量。如图所示,不同任务需要不同的推理模式。特别是在常识推理任务中,O1倾向于使用特定任务的全局分析方法(如上下文识别和强化约束)和分而治之方法。在数学和编码任务中,O1主要依赖分而治之和方法重用。对于Collie和AIME,O1遵循相对较短的推理过程,我们发现这也与其推理模式有关。具体而言,O1通常采用方法重用的方法,直接应用知名经典解决方案来解决数学问题,而无需多步推理。对于Collie,O1倾向于使用强化约束推理模式。这使模型能够在Collie严格的格式要求下,防止生成过长的推理过程,导致输出不符合格式要求。
再总结一下:
在常识推理任务HotpotQA上,分而治之(DC)使用频率最高。
在Collie这种强指令遵从任务中,强化约束(EC)使用频率最高。
在AIME这种数学任务中,方法重用(MR)和分而治之(DC)使用频率相等且较高。
在USACO 的coding任务中,分而治之(DC)使用频率最高。
另外作者发现了几个有逻辑的问题,值得解释一下
长上下文推理限制了Step-Wise BoN
除了生成多个响应外,Step-wise策略在扩展推理时间方面也很重要。具体来说,Step-wise方法通常会生成许多中间步骤,过长的上下文信息可能会阻碍模型从原始输入生成正确响应。如表所示,不同任务中Step-wise BoN推理的中间步骤中的平均token数量。几乎所有任务的推理tokens平均数量都超过200,这也证实了Step-wise BoN需要模型具备强大的长上下文跟踪能力。Step-wise BoN在Collie和AIME等输出文本格式和推理过程高度复杂的任务中表现较差(例如,Step-wise BoN在Collie上的准确率不到12%,在AIME上的性能仅为其他方法的一半)。然而,对于不需要严格的输出格式或复杂推理的任务(例如HotpotQA),BoN和Step-wise BoN显著提高了模型的结果(当N=4时,Step-wise BoN 比 GPT-4o 高出2.55%,BoN在HotpotQA上比GPT-4o高出0.36%)。
也就是说你的动作空间(当然指本次可选,而不是全部动作空间)越大,BoN在一般任务的表现就越好
后面也发现了,这个逻辑是8及8以下的,如果可选动作空间太大,那呈边界递减甚至衰减的态势,我个人认为最大的原因是局部最优影响了全局最优。
不同任务中推理tokens的数量
为了探究推理tokens的数量是否与O1的能力有关,作者制定了一条规则来提取O1推理tokens,并计算其在不同任务中的数量。此外,作者计算了正确和错误样本的平均token数量。为了探索输入提示长度与推理tokens长度之间的关系,作者还计算了平均输入长度。如图所示,对于同一任务,正确和错误样本的tokens数量相似,并且输入提示长度与推理tokens长度之间没有明确的相关性。相反,不同任务中的推理tokens数量存在显著差异。具体地,对于常识推理任务(如HotpotQA和Collie),O1的推理tokens长度相对较短。然而,对于更复杂的任务(如代码任务USACO和数学任务AIME),模型通常需要更长的推理过程以获得正确答案。
奖励模型限制了搜索方法的能力
这块就不讲了,不用想,肯定reward model越牛B,你推理越准确,这也没啥好讲的。
搜索空间(可选动作空间)也决定了LLM的上界
除了Agent Workflow,BoN在不同数据集上也表现相对良好,但其表现受到N值的限制。为了充分探究BoN能力的上界,在HotpotQA中增加了N值,以全面评估基于不同能力水平的LLM的BoN能力。具体来说,如图所示,比较了使用不同基线模型在不同搜索空间(即,N = 1, 4, 8, 16)下BoN 的结果。
评估了Qwen2.5-72B 和 Llama3-70B 这两个模型。结果表明,随着N值的增加,BoN的性能趋于稳定。需要注意的是,Qwen2.5和Llama3在HotpotQA数据集上都表现出色。然而,当BoN使用这三个模型作为基线模型时,随着N值的增加,性能并没有持续提高。当N > 8时,模型性能要么趋于稳定,要么下降,作者认为其原因在于搜索方法的性能与奖励模型和搜索空间共同相关。
这块刚才我也讲了一下逻辑,不赘述了。
我觉得最优价值的内容就是我写的这些。剩下其他的内容我觉得看看就行,大家感兴趣的可以自己去读一下。
最近比较忙,但是并没有忘记更新,我还会继续更新强化学习系列,敬请期待