Automatic Chain of Thought Prompting in Large Language Models
原文代码:https://github.com/amazon-research/auto-cot
标题翻译:大规模语言模型中的自动思维链提示
1. 内容介绍
在提示词中提供思考步骤被称为思维链(CoT),这一过程与情境学习(In-Context Learning)密切相关。
思维链提示有两大范式:
- 一种是利用“让我们逐步思考”这样的简单提示,促进LLM逐步思考
- 另一种是使用一些人工演示的例子,每个演示都由一个问题和一个通向答案的推理链组成,这一种一般效果好一点
作者想用第一种方式自动的生成推理链的演示,省去人工操作,提出了AutoCoT,它通过对具有多样性的问题进行采样并生成推理链来构建示例
2. 研究目的
左边是第一种简单提示,右边是人工添加示例的。右边的效果更好,但人工编写在示例的问题及其推理链的设计上都需要花费不少精力。
所以,为了摒弃这种人工设计,作者提出自动思维链(Auto - CoT)范式,让LLM自动构建包含问题和推理链的示例(问题与推理链对)
在生成这个示例的过程中,作者又发现:
- 如果这个示例太简单,那对CoT的学习是没有什么帮助的,比如2+3=5这种;
- 单纯依赖简单的相似性检索生成示例也有问题:要么原本的推理链可能本来就是错的,导致错误出现传递;要不就是语义太相似学不到东西
=>为了缓解这种问题,Auto-CoT强调示例问题的多样性(示例是否覆盖广泛的语义空间)
3. 前序研究
论文提出了两种基于问题采样的自动化CoT示例构建方法,用于探讨如何有效生成高质量的 CoT 示例
- Retrieval-Q-CoT:基于语义相似性检索问题作为示例
语义表示:使用Sentence-BERT将问题转化为固定大小的语义向量表示,
相似性检索:对于测试问题Qtest基于余弦相似度从数据集中检索出k个与其语义最相似的问题
生成推理链:对每个检索到的问题,利用Zero-Shot-CoT方法生成推理链
组合输入:将这k对问题+推理链作为示例,与测试问题Qtest一起输入给LLM,让LLM完成推理
优点:检索问题时能聚焦于与测试问题相关的问题,提高了示例的针对性
缺点:- 如果检索到的问题用Zero-Shot-CoT生成的推理链存在错误,错误容易复制到测试问题上(相似性误导);
- 示例过于相似时,可能无法涵盖足够广泛的语义特征
- Random-Q-CoT:随机采样问题作为示例
- 随机选择问题:从数据集中随机选k个问题
- 生成推理链:对每个问题,利用 Zero-Shot-CoT 方法生成推理链
- 组合输入:将这些随机问题和推理链与测试问题组合输入给LLM
优点:随机采样的问题多样性更高,能避免Retrieval-Q-CoT中由于语义相似性导致的错误传播
缺点:随机选择的问题可能与测试问题无关,从而降低推理链的针对性
Retrieval-Q-CoT在算术上没有Random-Q-CoT好,就是因为缺点1,Zero-Shot-CoT不保证是对的
然后就在另外两个数据集上试了一下不用Zero-Shot-CoT生成推理链,而用有标注的训练,发现Retrieval-Q-CoT就变强了
更细节的研究:
600个算术问题中,普通的使用Zero-Shot-CoT后答案出错的有128个
然后对这128个用上面两个方法,还出错的占比
Retrieval-Q-CoT出错率很高,就是因为推理链的相似性误导
继续拆分,把原始的600个问题计算语义,然后用K-Means搞了8个聚类,看看到底是哪个类别的问题错误率最高
类别2就是错误频发集群,说明Zero-Shot-CoT可能缺乏解决目标任务中一些常见问题的能力
多样性理论支持:假设一个错误推理链会对同语义类别的问题产生重大影响。如果示例来自多个类别(增加多样性),即使某些类别的推理链有误,也不会对所有测试问题产生一致性误导
看上去好像和Auto-CoT没关系,实际上是在说Auto-CoT设计中面临的挑战,Auto-CoT的最终目标是减少对人工的依赖
Retrieval-Q-CoT提供了一个警示:单纯依赖相似性检索生成示例可能会因错误推理链的累积而导致性能下降。因此,Auto-CoT不仅需要考虑相似性,还必须加入多样性
Random-Q-CoT 提供了一个启发: 多样性可以有效缓解错误传播的问题,但其完全随机的方式可能导致示例与测试问题缺乏相关性
=>质量与多样性的平衡,基于这些前序研究,终于可以设计Auto-CoT
4. Auto-CoT
4.1. 总览
包含两个主要阶段:
- 问题聚类:将给定数据集的问题划分为几个聚类;
- 示例采样:从每个聚类中选择一个有代表性的问题,然后使用Zero - Shot - CoT生成其推理链
4.1.1. 问题聚类算法
每个问题用Sentence-BERT转化为固定大小的语义向量
然后用K-Means生成k个聚类
在每个聚类里排序每个问题
4.1.2. 示例采样构造算法
从每个聚类中选一个代表性的问题
靠聚类中心最近的那个问题会被优先考虑,然后用Zero-Shot-CoT生成推理链,当作备选的示例
选择的准则是:问题不超过60tokens,推理链不超过5步
5. 实验:
5.1. 实验设置
- LLM:使用GPT-3,text-davinci-002 version with 175B parameters
- 用了10个数据集,三项任务:(1)算术推理;(2)常识推理;(3)符号推理
- 示例数量(聚类)k默认为8个,除了AQuA和Letter(4个)、CSQA(7个)以及StrategyQA(6个)这几个数据集
5.2. 基线:
- Zero-shot:直接让LLM生成答案,“the answer is…”
- Zero-shot-cot:“let’s think step by step”
- Few-shot:一些问题和答案对,但没有中间的推理过程
- Manual-cot:人工的问题-推理链-答案
5.3. 结果
Auto-cot总是比人工的好(本质上还是想抛弃人工编写)
5.4. 消融
然后研究了换一下LLM,还是能和人工编写的不相上下
前面也说了,整个过程中答案全是由Zero-shot-cot生成的,所以可能有错误的示例。所以研究了一下,直接从同一聚类中随机采样问题来构建示例
发现Auto-CoT(使用不同聚类采样)受错误示例的影响更小:即使存在50%的错误示例,其性能仍然没有显著下降
5.5. 考虑一个更复杂的流数据场景:
传统CoT的假设是测试问题的完整数据集可以提前获得,从中采样问题生成示例用于推理。
然而,在流数据场景中:测试问题以小批次(batch)逐步到达(初始没有足够多的问题用于聚类或采样),每次只能处理当前批次的问题,并且需要动态生成示例以适应后续批次的推理需求
这种拓展的叫Auto-CoT*,有Bootstrapping的特性
初始:空集合M0
- 第一批问题到达时,直接使用 Zero-Shot-CoT 生成推理链,存入M
- 对于每一新的批次使用Mb-1次(上一批存储的问题及推理链)的生成当前批次的示例,
- 用示例推理解决当前批次的问题后,连带这次生成的示例一起加入Mb
300个问题,分10批
第一批和zero-shot-cot一样,但随着问题批次的积累,生成的示例会越来越丰富,推理质量也随之提高
展示了实用性
6. 总结
大型语言模型(LLMs)已通过思维链(CoT)提示展现出推理能力。Manual-CoT的卓越性能依赖于人工设计的演示示例。为消除此类人工设计,论文提出Auto-CoT来自动构建演示样本。该方法通过多样性问题采样并生成推理链来构建演示集。在十个公开基准推理数据集上的实验表明:基于GPT-3的Auto-CoT始终达到或超越需要人工设计演示的CoT范式的性能表现。