[Reasoning 1] Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

ArXiv 2201.11903

Intro

In-Context Learning已经发现模型会根据few-shot示例进行模式上的模仿

对于比较简单的任务有效,面对复杂的数学题等,模型参数加大也无法取得很好的效果

已有的方法

  • 给模型大量问题—推理过程—答案数据,进行训练
    • 缺点:贵
  • 直接 Few-shot Prompting
    • 缺点:相当于让模型通过单次前向传播,在参数内部进行推理,但是一旦语义和计算产生偏差,最后的结果往往不好

模型往往只能通过Few-Shot了解输出的格式,而无法学会求解过程

Idea

  • 核心想法:解决问题应该是拆成多个步骤

不要试图让模型单次前向传播做过于复杂的内容

  • 核心假设
    • 模型是知道怎么推理的,也具备这个能力,关键就是如何激发这个能力
    • 标准 Prompt 需要提供合适的输出结构来激活它、留有思考空间

最重要的思想转变不是多写一些解释,而是:

把自然语言 token 当作模型的计算空间。

因此作者尝试在Prompt的示例中添加CoT

让模型已模式模仿的形式,也会在输出时进行一定的CoT输出,从而进行了显式的推理

这个方法某种程度激发了模型的潜在推理能力

Exp

有一个有趣的实验现象(注意是2022年的模型)

  • 小模型CoT反而降低水平
  • 大模型CoT确实有提升

因此CoT方法不会为模型带来推理能力的提升,而是激发了模型本身的能力

小模型不具备这个能力,因此没有什么效果

Limits

  • 对于模型仍然是单次的输出,因此过于复杂的任务,无法通过一次CoT想明白(状态、步骤没法被很好的切分)

[Planning 1] Language Models as Zero-Shot Planners: Extracting Actionable Knowledge for Embodied Agents

2201.07207

Intro

以往LLM只用来处理NLP任务

Idea

LLM从大量数据集中必然已经知道一些生活中的任务是有什么顺序的

也就是人类通常怎么完成某个任务

核心假设:大型语言模型已经从文本中隐式学到了大量“如何完成日常任务”的程序性知识。

核心想法:让冻结的 LLM 生成计划,再把自由语言计划翻译成环境允许的原子动作。


这篇论文挖掘了LLM内部知识,证明了LLM可以成为Agent的高层规划器

[Agent 1] ReAct: Synergizing Reasoning and Acting in Language Models

2210.03629

奠基之作

Intro

当时的技术路线

  • LLM CoT
    • 无法接触外部世界
  • LLM Action:观察环境 -> 执行动作 -> …循环
    • 缺少推理

对于人类来说做事应该是:

  • 先想一下,做一个动作,看看结果,再根据结果继续思考

Idea

作者认为Agent应该具备如下能力

  • Reasoning:决定为什么这样做
  • Acting:真正影响或查询外部环境
  • Observation:接收行动产生的真实反馈

Reasoning某种程度上承担了一些记忆、规划的工作

同时只改变内部上下文,不会对外界造成改变

Agent具备了Action和Reasoning的两种动作

[Reasoning 2] Self-Consistency Improves Chain of Thought Reasoning in Language Models

2203.11171

Intro

前序工作:

1CoT Prompt
23模型生成唯一一条推理链
45得到唯一答案

基本采用的是Greedy Decoding(每次采用概率最高的token进行推理)

因此很容易产生错误累积,模型推理产生了思考,但没有检测思考是否正确


已有的方法是训练额外的 verifier

1模型生成多个答案
23另一个验证模型进行评分
45选择最高分答案

但是肯定比较需要成本与数据质量

作者的方法是:不训练任何新模型,仅利用同一个 LLM 自身输出的分布完成筛选

Idea

核心假设:提升的关键不是“找更多高概率表达”,而是“探索真正不同的推理路径,并观察答案是否汇聚”。

希望拦截的是:偶然的中间错误

通过:温度、topK、topP等参数,完成采样,进行投票。

  • 温度:温度越高,概率分布会更平缓,反之会更尖锐
  • topK:选择概率最高的K个,重新归一化概率后再随机取样
  • topP:在概率累积到P的最小集合中进行采样

The answer is xxx. 是固定写法,直接解析这一句话提取答案

Limits

  • 它能过滤随机错误,但无法保证中间过程正确,也无法修复模型共同持有的系统性错误。

[Reasoning 3] Tree of Thoughts: Deliberate Problem Solving with Large Language Models

2305.10601

Intro

Self-Consistency虽然通过推理多样性,一定程度解决了推理过程中的偶然错误的问题

但是对于单条CoT,仍然无法避免中间错误积累到后续答案

Idea

  • 将推理拆成多个中间推理状态
  • 用 LLM Judge 对各候选打分(如:好 / 坏 / 有潜力)
  • 进行BFS/DFS进行探索

这样本质上推理是可以回溯的

[Reasoning 4] SELF-REFINE: Iterative Refinement with Self-Feedback

2303.17651v2

代表了Reflection架构

Intro

 1Prompt Engineering
 2 3Chain-of-Thought
 4让模型写出推理过程
 5 6Self-Consistency
 7尝试多条推理路径并投票
 8 9ReAct
10推理与环境行动交替进行

早期工作致力于如何让模型:

  • 如何生成更好的答案
  • 如何更好的探索路径
  • 如何更好的与环境交互

但是都基于一个隐藏假设:模型第一次给出的答案,就是当前链条的结果,不再更改

Idea

核心假设:模型能产生好答案模型第一次输出就是好答案是不一样的

给模型的Prompt中可能存在非常多条件

但是模型的第一次输出,可能会有一些对条件满足质量的参差不齐

因此应该给模型机会,让模型自己去调整、优化

完整流程:

1生成初始答案 y₀
2
3for t = 0, 1, 2, ...:
4    fbₜ = Feedback(x, yₜ)
5
6    if 达到任务标准 or t 达到最大轮数:
7        return yₜ
8
9    yₜ₊₁ = Refine(x, 历史答案, 历史反馈)

[Planning 2] Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Model

Intro

早期CoT需要让模型根据few-shot示例模仿进行思考

随着模型指令遵循能力的上升,实质上只需要Let's think step by step.

相当于进行了zero-shot的CoT

Idea

核心假设:很多错误不是因为模型完全不会推理,而是因为它没有先明确整个任务需要哪些步骤。

核心想法:让模型的思考更有结构,防止步骤遗漏


CoT 证明了中间推理有价值。

Plan-and-Solve 进一步提出:

中间推理本身也应该被组织,而不是任由模型自由展开。

这是从 ReasoningPlanning 的一次重要概念转变。

[Planning 3] HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face

arxiv.org/pdf/2303.17580

Intro

早期LLM只专注于文字,对其他模态能力较差

但是先前工作已经发现LLM具备规划能力,因此似乎可以使用LLM对各个专家模型进行组织

Method

  • 任务规划:ChatGPT 把用户请求拆解成有依赖顺序的子任务列表,标注每个子任务的输入输出关系。

  • 模型选择:从 Hugging Face 模型库检索,让 ChatGPT 根据描述文字选出最适合的模型。

  • 任务执行:按依赖顺序调用对应模型的 inference API,上一个子任务的输出作为下一个的输入。

  • 结果整合:把所有模型的返回结果收集起来,让 ChatGPT 总结成自然语言回答给用户。

[Agent 2] Reflexion: Language Agents with Verbal Reinforcement Learning

2303.11366

Intro

之前的工作在单个任务上失败后,在第二次尝试大概率也会出错

ReAct在单次任务中,能够通过当前环境的反馈,动态调整行动

但不过报错信息并不能足够丰富,可能会只是一个success/fail,能从环境中获取的奖励非常有限


通过RL进行训练代价极高

而LLM非常擅长理解语言,那么能不能把奖励转化为语言呢

Idea

  • Actor:实际上可以使用ReAct作为一次尝试的Actor
  • Evaluator:用于根据Actor的一次轨迹,生成奖励(判断这次尝试做的怎么样,值多少分)
  • Self-Reflection:根据轨迹、奖励,生成经验总结,放入到内存中