重新理解思维链 (CoT/Chain-of-Thought)。什么时候有效?为什么有效?
最近读到了两篇很震撼的论文,对我的震撼程度不亚于第一次读到 Zero-shot CoT 有效的那篇论文,也就是我们现在熟知的「Let's think step by step.」
之前看到
@北邻 的分享,CoT 之所以有效,是因为模型训练数据中有 CoT 的模式,或者说有相应的 Language Templates. 在这两篇论文中对这个概念有了进一步的理解。
总结为三个方面。
CoT 什么情况下更有效?
- 当任务复杂且需要多步骤推理时
- 在更大的模型中,使用直接提示词的方法,但性能提升不明显时
- CoT 推理在单步骤任务 (或者说简单任务) 如匹配、序列标记和单选题中效果并不明显
总的来说,如果不是经过特别微调的模型,CoT 在至少具有 20 亿参数的大语言模型里使用,效果才明显;换句话说,在小模型里,CoT 并没有特别的优势。
其次是在这个大语言模型 (LLM) 的预训练数据中,包含了与任务直接相关且有相互逻辑联系的数据 (或者说知识),CoT 才会有明显的效果。
CoT 是如何工作的?
CoT 技术并非在教授模型推理方法,而是在鼓励模型识别出与任务相关的推理所需的基础知识,并通过中间步骤将这些知识以一种逻辑结构串起来。
关于 CoT 的一些事实:
1. 模型必须具备与任务相关的知识才能用 CoT 推理出正确的结果
2. 从 ICL (In-Context Learning) 的角度看,CoT 在提供多样化示例时效果更显著
3. CoT 推理的关键在于提供与问题相关的理由并正确安排推理步骤
4. 使用 CoT 样式的数据进行微调对有效实施 CoT 推理非常有帮助
5. 使用 Few-shot CoT (提供示例上下文的 CoT) 的时候,示例中的错误推理也能推导出正确答案 (或直说对推导出正确结果的影响没那么大)
其中,以上的第 2 点和第 4 点,在前几天学习 Medprompt (
m.okjike.com) 的时候感受很明显。因为其在数据预处理阶段,就是在生成 CoT 样式的数据。从预处理后的向量数据集中查询问题相关的例子做 Few-shot CoT 就是第 2 点的提供多样化示例。
从写提示词的角度来看,简单的任务不需要使用 CoT;给模型提供例子的时候,尽量多样化且与问题相关,最好是例子的推理步骤写法符合 CoT 的样式;结果不甚理想时,仔细查看步骤,看是否需要拆分和调整顺序。
这两篇论文强烈推荐读一下原文。
Igniting Language Intelligence:
arxiv.orgReasoning emerges from the locality of experience:
arxiv.org