思维链1¶
摘要¶
推理是人类智能不可或缺的基本认知过程, 在人工智能领域引起了广泛的关注. 值得注意的是, 最近的研究表明, 思维链能够显著增强LLM的推理能力, 这引起了学术界和产业界的广泛关注. 该综述系统的调查了相关研究, 并通过细致的分类总结了先进的方法, 提供了新颖的视角. 此外, 他们还深入研究了当前的前沿领域, 并划分了挑战和未来的方向. 此外, 他们还参与了开放性问题的讨论, 他们希望这篇综述能够成为初学者的入门读物... 促进未来的研究, 资源已经在他们的网站上发布.
简介¶
在人类的认知领域中, 推理作为关键枢纽, 对于理解世界和形成决策至关重要. 随着预训练规模的不断发展, 大型语言模型(LLMs)在众多下游任务中展现出越来越强的能力. 最近, 研究者发现LLMs能够通过上下文学习展现逐步推理的能力, 这一现象被称为链式思维(CoT)推理. 普遍观察到, CoT提示显著增强了LLMs的推理能力, 尤其是在复杂任务中.
图1展示了一个链式思维推理的例子. 与直接给出答案不同, 链式思维推理提供了一个逐步推理的过程. 具体来说, 它将复杂的问题分解为可管理的步骤(思路), 简化了整体推理过程, 并在各个推理步骤之间建立连续(链条)以确保没有忽略任何重要条件. 此外, 链式思维推理提供了一个可以观察的推理过程, 使得用户可以理解模型的决策轨迹, 并提高最终答案的可信度和可解释性.
得益于CoT Prompting的卓越表现, 他收到了学术界和工业界的广泛关注, 演变成了prompt engineering领域中的一个独特的研究分支. 此外, 它已经成为AI autonomous agents领域中的一个关键组成部分. 然而, 这些研究仍然缺乏系统性的综述和分析. 为了弥补这一空白, 作者提出本研究以对CoT推理进行全面而详尽的分析. 具体来说, 本文深入探讨了链式思维推理的更广泛范畴, 他们称之为generalized chain-of-thought (XoT). XoT推理的核心理念是通过逐步推理的方法, 逐渐揭开复杂问题的层层面纱.
他们的贡献总结如下: (1) Comprehensive Survey: 这是第一个专门针对XoT推理的全面综述; (2) Meticulous taxonomy: 他们引入了一个精细的分类法; (3) Frontier and Future: 他们讨论了新的前沿, 概述了其挑战, 并为未来研究提供了启示; (4) Resources: 他们公开提供这些资源, 以便促进社区研究的发展.
综述的组织: 他们首先介绍背景和预备知识; 接着从不同的视角呈现基准测试和先进方法; 此外, 他们还讨论了前沿研究, 并概述了挑战和未来方向; 最后, 他们进一步讨论了开放性问题.
背景和预备知识¶
背景¶
在过去的几年中, 随着预训练规模的不断扩大, 语言模型展现出众多新能力, 例如上下文学习和链式思路推理. 伴随着这一驱使, 预训练后提示逐渐取代了预训练后微调, 成为自然语言处理领域的新范式.
预备知识¶
在本节中, 他们将介绍标注提示和链式思维推理的预备知识. 他们定义了以下的符号: 问题\(\mathcal{Q}\), 提示词\(\mathcal{T}\), 概率语言模型\(p_{LM}\)和预测\(\mathcal{A}\).
首先, 他们考虑少样本标准提示场景, 其中提示\(\mathcal{T}_{SP}\)包含指令\(I\)和少样本示例(若干问答对). 模型将问题和提示作为输入, 并产生答案预测\(\mathcal{A}\)作为输出, 如下列公式所示:
接下来, 他们考虑在保持少样本情况下使用思维链提示. 提示词\(\mathcal{T}_{CoT}\)包含指令, 问题, 答案以及推理过程\(e_i\). 在链式思维推理中, 模型不再直接生成答案, 而是先逐步的推理轨迹\(\mathcal{R}\), 然后再给出答案\(\mathcal{A}\), 如下列公式所示:
CoT推理的优势¶
作为一种新的推理范式, 链式思维推理具有多种优势. (1) Boosted Reasoning. 链式思维推理将复杂问题分解为可管理的步骤, 并在这些步骤之间建立联系, 从而促进推理; (2) Offering Interpretability. 链式思维推理提供可观察的推理轨迹, 使得用户可以理解模型的决策, 使推理过程透明且可信; (3) Advance Collaboration. 细粒度的推理轨迹有助于用户和系统之间的交互, 使得能够改变模型的执行轨迹, 从而促进由LLMs驱动的自主代理的发展.
基准¶
在本节中, 他们将简要概述评估推理能力的各项基准, 包括数学推理, 常识推理, 符号推理, 逻辑推理以及多模态推理. 基准概述如表所示(表太大了, 没放下).
- 数学推理: 数学推理构成了人类智力的基础. 在解决问题, 决策和理解世界方面发挥着关键作用. 它通常用来被评估LLMs的一般推理能力
- 常识推理: 常识推理对于日常生活中的交流以及对世界的感知至关重要,它评估了语言模型对世界的理解能力
- 符号推理: 符号推理将语义进行重构, 并作为检验语言模型在模拟原子操作能力方面的试验平台
- 逻辑推理: 逻辑推理至关重要, 因为它是理性思考, 文件问题解决和可解释决策的基石
- 多模态推理: 多模态推理将文本思维和来自自然世界的感官体验, 如视觉场景和听觉声音无缝整合, 从而创造出更加丰富, 更加全面的信息理解
符号推理
假设有两个前提:
- 所有人都会死亡
- 苏格拉斯是人
我们可以将这些前提符号化, 令\(P(x)\)表示\(x\)是人, \(Q(x)\)表示\(x\)会死亡. 那么, 第一个前提可以表示为: \(\forall x\,(P(x) \rightarrow Q(x))\); 第二个前提可以写为: \(P(\text{Socrates})\)根据逻辑推理规则, 我们可以得出: \(Q(\text{Socrates})\), 即苏格拉底会死亡.
模型¶
本节讨论了来自三个视角的先进XoT方法: prompt construction, topological variations和enhancement methods.
XoT提示词构建¶
基于在构建Chain-of-thought提示所需的人力投入, 他们将构建方法分为以下三类: 1) 手动XoT; 2) 自动XoT; 3) 半自动XoT.
手动提示词构建¶
Wei等人在他们的工作中首先提出了chain-of-thought prompting, 通过人工标注自然语言形式的推理过程(rationale)来引导模型逐步推理. 此外, Fu等人发现使用复杂的推理链作为示例可以进一步提高推理性能. 然而, 自然语言形式的推理可能会出现不一致的推理过程. 为了缓解推理中的中间错误, PAL, PoT, MathPrompter和NLEP等工作利用编程语言形式的推理过程, 将问题求解转化为程序生成, 并通过外部程序执行器获得确定的答案. 虽然人工XoT展现了更好的性能, 但是对推理过程(rationale)的人工标注会显著增加成本, 并在示例选择上带来难题.
编程语言形式的推理过程
下面给出一个简化示例, 展示如何将推理过程转化为编程语言形式并通过程序执行来获得答案. 请注意, 这仅是为了演示原理, 并非真实的复杂推理:
问题示例: "已知方程 x + 2 = 5, 求 x 的值. "
# 1. 定义已知条件
equation = "x + 2 = 5"
# 2. 根据方程, 分析运算逻辑:
# 将方程的右侧(5)减去左侧的常数(2)即可求出 x
# 即 x = 5 - 2
# 3. 计算答案
x_value = 5 - 2
# 4. 输出最终结果
answer = x_value
print("The value of x is:", answer)
执行结果:
在这个示例中, 我们把"x + 2 = 5"这样的问题转换成了简单的程序片段. 程序的逻辑部分就相当于"编程语言形式的推理过程": 先解析方程, 再进行运算, 最后输出解. 通过在编程语言中逐步执行这些逻辑步骤, 我们就可以避免在纯自然语言推理中可能出现的中间错误, 并且只需查看程序最终的执行结果就能得到确定的答案.
自动提示词构建¶
一些研究在零样本环境中设计了特定的指令来激发CoT推理, 比如在问题后面添加"Let's think step by step". 还有其他类型的指令, 包括编写程序来解决问题, 在推理之前起草计划, 基于任务信息生成元指令以及角色扮演等等.
然而, 由于缺乏明确定义的示例来提供指导, 基于指令的方法表现得及其不稳定. 另一条研究路径是基于自动生成的推理过程(通常由零样本CoT生成)进行少样本推理, 从而提高推理的稳定性. 这些方法的重点在于选择合适的示例. Zhang等人通过聚类来选择多样化的推理过程, Zou等人则根据问题的pattern来构建示例以提高泛化能力, Wan等人将答案熵作为筛选指标, 而Xu等人通过Gibbs采样来迭代选择示例.
构建示例
下面给出四种方法的简单示例, 以帮助理解它们是如何选择示例的:
- 假设我们有一道题目: "Two dogs and three chickens together have how many legs?"
- 我们使用零样本CoT或其它方法, 自动生成了10条推理过程, 可能在推理顺序, 语言风格, 或中间结论上存在差异.
- 由于这些推理过程过于相似或冗余, Zhang等人的方法会先对这10条推理过程进行聚类, 将彼此在推理方式上最接近的过程分到同一簇.
- 接着, 从每个聚类中选出一个最能代表该簇特征的推理过程, 形成多样化的示例集.
- 这样就能避免使用的推理过程在思路上过于重复, 同时保留不同类型的推理示例, 提升整体的泛化性.
- 假设我们拥有一个题库, 每个问题都带有自动生成的零样本CoT推理过程.
- 现在来了一道新题: "In a right triangle with legs of lengths 3 and 4, what is the length of the hypotenuse?"
- Zou等人的方法会先识别这个问题的pattern, 例如"几何问题(直角三角形)".
- 然后, 在已经存储的示例中, 会优先挑选与"直角三角形"或"几何"相关的推理过程作为few-shot示例.
- 通过匹配问题pattern, 就能更有针对性地为模型提供示例, 从而在新问题上得到更好的推理效果.
- 假设我们想解一道题: "What is the sum of the digits of 183?"
- 首先, 我们使用零样本CoT方法生成了多条推理过程和相应的答案, 例如:
- 推理过程A: 最终答案12
- 推理过程B: 最终答案12
- 推理过程C: 最终答案13
- 推理过程D: 最终答案12
- 可以看到, 大多数推理都得出了12, 只有少数结果为13.
- 我们把答案看作一个分布(例如12: 3次, 13: 1次), 并计算它的熵. 若熵小, 表明模型对问题的回答相对稳定, 可以作为较可靠的示例.
- 如果答案熵过大(比如不同推理过程给出五花八门的答案), 则表示模型对该题并不稳定, 也就不适合作为示例.
- 假设我们有一个大型示例库, 每条示例都包含一段问题及其自动生成的推理过程.
- 一开始, 随机从示例库中挑选若干条示例作为初始few-shot示例, 用于推理新的问题.
- 当我们发现某些示例在推理过程中效果较差时, 就使用Gibbs采样的思路进行迭代更新:
- 在下一次迭代中, 随机替换掉效果不佳的一些示例, 换成库里其他示例.
- 再用新的示例集进行推理评估, 得到更好的表现后继续迭代.
- 最终, 通过多轮迭代, 演化出一套能在整体上表现更优的示例集.
半自动提示词构建¶
基于自动提示词构建中的few-shot learning(就是刚才介绍的第二段), 半自动方法结合了少量人工标注的rationales来获得监督信号. 它们关注如何通过bootstrapping获取高质量的rationales, 并选择合适的demonstrations来促进推理. Shao等人通过交替进行正向和方向的合成过程生成高质量的rationales, Pitis等人在遇到具有挑战性的问题时迭代扩展示例, 从而缓解了有限人工监督的问题. 与之相对, 有些研究则优化demonstraction selection. Shum等人和Lu等人利用policy gradient optimization来学习示例选择策略, 而Ye和Durrett等人在开发集上进行搜索并使用两个proxy metrics来选择合适的demonstraction.
自举
在机器学习和自然语言处理等领域中, "bootstrapping"(有时也写作"自举"或"自举法")指的是一种迭代式的自我改进过程. 简单来说, 模型会先用少量高质量的人工标注或已有数据进行初始训练, 然后利用这个初始模型在更多未标注或部分标注的数据上做预测. 这些新预测再经过一定的筛选, 修正或验证, 产出新的可信度较高的"自动标注"数据, 最后把这部分数据再次并入训练集, 重新训练模型. 通过不断重复上述过程, 模型可以逐步积累更多的高质量训练数据, 自我完善并提升性能, 这就像"拽着自己的鞋带把自己拉起来"一样, 因而得名"bootstrapping".
这三种方法的优劣¶
手动提示依赖于高质量的推理标注, 这能带来更好的性能. 然而, 它面临高人工成本与领域迁移方面的挑战. 相比之下, 自动提示无需人工成本并可实现自由的领域迁移. 然而, 由于缺乏监督信号, 它往往存在错误和不稳定性. 半自动提示在性能与成本之间找到了平衡点, 因此在下游应用中更具适用性.
-
Chu, Z., Chen, J., Chen, Q., Yu, W., He, T., Wang, H., Peng, W., Liu, M., Qin, B., & Liu, T. (2024). Navigate through enigmatic labyrinth a survey of chain of thought reasoning: Advances, frontiers and future (No. arXiv:2309.15402). arXiv. https://doi.org/10.48550/arXiv.2309.15402 ↩