之前我们花很多章讨论过思维链,包括思维链的
- 组织结构,例如Self-Consistency,TOT,TOMT, GOT,AOT,POT
- 编排方式,例如Plan-and-Slove,Least-to-most, Verify-and-Edit,Iteration-of-Thought
- fewshot选择:AutoCOT,最优化fewshot,fewshot多样性,fewshot复杂化
- Distillation:思考能力蒸馏到小模型
- Bootstrap:让模型自我优化提升思考链路
但O1之后,思维链的一个简单但之前都没进入视野的特征引起了大家的注意,那就是思考的长度 对推理效果的影响,更准确来说是通过哪些思考步骤来有效延长思维长度对推理的影响 。这一章我们着重讨论思考长度 ,慢思考的一些特点,下一章再讨论一些实现方案。哈哈注意这里的很多观点都是各方推测,请审慎辨别~
COT长度的影响分析
- The Impact of Reasoning Step Length on Large Language Models
先上一篇分析COT长度的论文打前阵,论文得到了个很有趣的观点:COT长度比质量更重要,思考的对不对没有思考的长不长来的重要,即便思考的不对,也不太影响思考的越长,准确略越高 。对思维链的长度要求也和任务有关,任务越复杂需要的思考长度越长。但其实读完论文后我个人理解的其实是,在思考过程中通过加入问题复述、思考回顾、反思、知识回忆、公式化等思考节点可以有效提升推理效果
但思维链长度的实验论证,最难的点其实在于如何改变模型思维长度,又不引入其他Confounder来影响实验归因。我们来看下论文是如何实现的
-
zero-shot COT --- Add steps
纯指令COT引导的实现更简单些,论文单纯把"Let's think step by step"替换成了
"Let's think step by step, you must think more steps"
-
Few-shot COT - Add steps
而Few-shot COT更复杂些,因为如果单纯改变few-shot样本,增加few-shot的思考长度,其实是变相引入了任务相关的补充信息。那就无保证最终模型推理效果的提升是否来自这部分补充信息,因此需要有能改变(变长,变短)思维链长度,但又和任务不直接相关的指令引入。
论文选择从人类思考模式入手,引入了5个和任务无关,只和思考模式相关,通过在思考步骤中引入特定的步骤,改变思考长度的方式,包括
- Think about the world:让模型思考问题中的相关知识
- Read the question again:Rephrase Prompting早就证明可以有效的提升模型推理效果。
- Repeat State:每推理一段之后会进行局部总结,简化上文的推理过程。人类也会不断回顾并自己的推理过程
- Self-Verification: 增加模型对自我答案的反思。人类在给出答案前也会校验自己的推理过程。
- Make Equation:让模型尝试把问题公式化。公式化对于人类可以辅助记忆
这里可能就Think about the world不太好理解,这里我们看下论文的prompt,其实类似于定位问题中的知识(实体),在回答中复述(类比人类一边回答一边在脑海中思考对应信息)。
这里会先使用zero-shot COT,让模型基于以上5种COT增长指令生成新的Demo,再使用增长之后的Demo作为Few-shot样本。
- Few Shot COT - Compression
前面两个都是COT增加推理步骤的方案,这里论文也对比了压缩,同样为剔除任何和任务有关的信息变化,这里论文使用指令让大模型,对few shot Demo进行句子和句子的压缩合并。指令如下
txt
Please compress the following two sentences without losing any information, and make them as concise as possible
实验结果有2个和长度相关的重要结论
- 通过指令、few-shot增加推理步骤会显著带来效果提升,以下论文分别对比了和Manual-COT,AUTOCOT的效果增益。同时在复杂任务上效果会随步数增长而持续提升。
- 单纯对few-shot demo进行文字压缩就会影响推理效果
但最后我们回头再看下论文的实现,其实不能直接把效果提升和思考的长度进行等同。比如我在COT里随机加一段"略略略略略略",那八成是不能提升推理效果的。所以要审慎理解这里的思考长度。个人感觉其实更类似于模仿人类的思考过程,在推理链路中加入有效的思考模块,可以提升推理效果。那咱直接和人类类比的话,除了上面论文提到的思考模块,还有一些常见的模块其实也值得尝试
- 系统推理:把复杂问题进行并行或串行分解
- 类比推理:该问题是否和其他问题相关,是否可以迁移知识
- 溯因推理(假设检验):问题是否包含多个可能的假设,可以逐步排除或验证
- 辩证推理:从问题的多个视角进行思考,通过观点碰撞得到最终正确的结论
- 经验反思:引导模型反思回答该问题是否有其他可以借鉴的经验
- 启发式思考:引导模型使用直觉进行思考,先进行一轮答案的尝试,再进行修正。
- 场景模拟:给出一端推理后,可以针对给出的推理给个例子,如果在例子上跑不通,则需要调整思考方向
- 纠错行为:如果反思发现推理存在错误,如何得到新的修正方向,或者从指出的错误中进行学习
涉及到的模型行为其实包括:分解,类比,假设,辩证,反思,纠错,直觉,模拟,归纳,演绎,评估,总结
O1的思考有哪些特征?
- O1 Replication Journey: A Strategic Progress Report -- Part 1
论文1在复现O1之前,先让数学博士们对O1的推理路径进行了结构分析, 示例如下
作者发现,O1的思考过程中存在一些高频出现的关键词,这些关键词指引了模型下一个思考模块,例如"if","consider","possible"显示模型存在多个思考角度或假设检验路径,再例如"wait","Alternatively"显示模型再进行反思,纠错等行为。他们对思考过程中的不同思考模块进行不完全分类后得到了如下的几个特点
- 多步问题分解(Divide and conqure):模型会先定义问题,分解问题,再逐步解决各个问题,整个思考链路呈现结构化
- 关键思考节点:当出现上述的一些关键词后模型会进入一些特定的思考节点。除了上面的假设路径,反思,还有"Let me Compute"会进入公式计算,"Therefore"会进入局部结果总结
- 循环和反思节点(self-refine and consistency):模型会频繁评估,验证中间结果,并通过多次循环尝试校验一致性
- 探索假设:模型会尝试多个假设,并根据不同路径收集的信息,调整思考路径,整个思考过程非常灵活。
- 总结和验证:在得到最终结论前,模型会对结论进行校验。(个人感觉从逻辑上其实这也属于反思节点)
论文1认为O1长思考是通过模拟人类的思考过程,通过过程监督学习,让模型掌握不同的推理模式,和思考过程。
O1的思考包括哪些模式?
- A Comparative Study on Reasoning Patterns of OpenAI's o1 Model
论文2也做了类型的事情,不过更多在把思考模式进行模块化的分类,包含以下几种思考模式
- Systematic Analysis: 一上来o1会先分析问题,剖析输入输出,限制条件,再选择解决方案。其实是repeat the problem的进一步延申,先复述问题,再从系统角度分析问题。
- Method Reuse:对于可以被转化成经典问题的,模型会迅速联想相关的经典问题解法,类似经验类比。
- Divide and Conquer:多步问题分解
- Self-Refinement:和前面提到的反思评估和循环论证类似
- Context Identification:类似前面提到的Think about the world,在知识密集的QA问题上,模型会先回忆问题相关的核心知识
- Emphasizing Constraints:模型会在推理过程中复述重要的条件。
论文在不同数据集上统计分析了不同思考模式的出现频率,发现
- CommonSense问题:最常见问题分解、反思、知识回顾、和条件复述
- Code问题(USACO):更常见系统分析、经验类比、问题分解、反思
- Math问题(AIME):更常见系统分析、经验类比、问题分解
更长更更长?
文末聊个有意思的话题,就是O3亮相后,大家都被推理成本震惊到,感觉整个慢思考推理链路在变得越来越长,那后面还会继续变长么?这里聊聊我的感受(纯猜测向)~
之前从O1开始的边长,更像是在摸索让模型如何从结果学习到过程学习的一种中间产物,让模型在训练过程中降低各种shortcut,跳步,一步步扎实的学习如何推演正确结果,也就是把整个思维链显式化。而大家对思维链的剖析也更多是从常规的逻辑推理,辩证思考模式的角度去把O1的思维链按照常规人类的思考方式,进行分隔,分类,再串联起来。大家就会说那一般人解决复杂问题时本来就要经过很长的思考过程,那模型自然也是一样的呀。
但其实个人感觉,模型擅长模仿,但也擅长压缩,当我们近乎完全激发出模型显式长思维链推理效果后,下一步就该向回看,让模型学会跳步,在思维链路中寻找所谓shortest path了,那个时候才是模型推理该变短的时候。
想看更全的大模型论文·微调预训练数据·开源框架·AIGC应用 >> DecryPrompt