前两章我们分别介绍了COT的多种使用方法以及COT的影响因素。这一章更多面向应用,既现实场景中考虑成本和推理延时,大家还是希望能用6B的模型就不用100B的大模型。但是在思维链基础和进阶玩法中反复提到不论是few-shot还是zero-shot的思维链能力似乎都是100B左右的大模型才有的涌现能力,而在小模型上使用COT甚至会带来准确率的下降。

至于为啥小模型无法进行COT,论文[5]通过把小模型回答错误但大模型可以回答正确的问题进行归纳总结,认为小模型的COT能力受到有限的语义理解和数学计算能力的限制。不过我们在实际尝试中发现小模型的few-shot理解能力似乎是更大的短板,表现在小模型无法很好理解抽象few-shot中的推理模板和样本间的共性。

不过以上的观点都是针对模型的先天能力,那我们是否可以把COT推理作为一种生成风格,或者NLP任务类型,通过微调让模型获得COT能力呢ψ(`∇´)ψ

想要让小模型拥有COT能力,多数方案是通过COT样本微调来实现的,以下Reference[1]-[4]中的4篇论文的核心差异就在COT样本构造和微调方式。以下我们把几篇论文合在一起来说,下图来自[3]

COT样本

以下Reference中的论文都是使用大模型来生成COT样本不过在数据集,COT样本构建和过滤机制上存在差异。

论文[1]使用了GSM8k的数据集,用Code-Davinci-002随机生成40个的思维链推理,选择答案正确的一条作为训练样本。样本生成这块写的相对比较模糊。

论文[2]优化了COT样本准确率。使用Palm540B和GPT3 175B模型,用8个few-shot样本来引导模型生成COT,这里为了提高大模型COT的准确率,作者修改了指令,在few-shot+question之后会直接给出正确答案作为Hint,来引导模型倒推出正确的COT,同样是只过滤答案正确的样本

论文[3]优化了思维链的多样性。考虑同一个问题其实有很多种解法,以及不同的解法间往往存在逻辑共性,与其让模型拟合单一的推理结果,不如让模型从多个推理路径中去抽象重要信息。因此论文提出了diverse reasoning,每个样本用text-davinci-002生成多个思维链,保留所有答案正确且推理逻辑不同的样本。并且在论文中验证了一个样本生成更多思维链会带来显著的效果提升

论文[4]优化了COT数据集的多样性,整了个COT Collection数据集包含1.88M的COT样本。具体的数据筛选和构建逻辑详见论文。使用了Codex来生成思维链,方案融合了[2]和[3]

模型训练

不同论文选择了不同的student模型,指令样本构建和指令微调方式,简单对比如下

论文 微调模型 微调样本 微调方式
[1] FlanT5 250M~11B Few-shot-COT+Zero-shot-COT+Few-shot-Answer Only 蒸馏:Top5 Token的KL距离
[2] T5 60M~11B Zero-shot-COT 指令微调SFT
[3] GPT-3 0.3B~6.7B prompt模板Zero-shot-COT 指令微调SFT
[4] FlanT5 T0 Few-Shot-COT + Zero-shot-COT 两步指令微调

以上不同的指令样本Looklike如下,差异包括是否有few-shot上文,是否有COT推理

在指令样本构建上多数是直接输入问题,输出COT思维链的,但个人其实更偏好few-shot的COT方案。因为在实际应用中,其实需要分析和推理的很多场景都是非标准化的,远远不是解个数学题或者QA这类标准化问题可以覆盖。这种情况下需要定制场景所需的推理逻辑,这时zero-shot肯定就不行了,需要few-shot来给出不同场景所需的不同推理链路。例如问诊的流程要先问当前症状,病程,病史,用药,再基于用户不同的回答,选择是化验,拍片,还是听诊开药等等。因此大模型和小模型的能力差异除了小模型自身的推理能力有限,还有小模型的In-Context理解能力有限,而few-shot样本微调被证明可以提升模型In-context理解能力。

再说下微调的部分,除了常规的指令微调方案之外,[1]采用了蒸馏方案,不熟悉蒸馏的可以先看下Bert推理太慢?模型蒸馏。简单来说就是让Student模型拟合Teacher模型的分布,分布可以是对齐输出层也可以进一步对齐模型中间层,损失函数一般是两个分布的KL散度或者MSE。这里作者使用的蒸馏方案是对齐输出层分布,考虑OpenAI的接口每次只返回Top5 Token对应的概率,因此只对Student模型每步解码的Top5 Token计算KL散度作为loss。蒸馏过程还有一些例如tokenizer对齐的细节,详见论文

[4]采用了两步微调,第一步在指令微调模型的基础上,使用范围更广的COT Collection样本集对模型进行COT微调,再在该模型的基础上,使用单一领域/任务的COT样本进一步微调,效果会有进一步提升。这一点其实可能说明COT推理本身除了是一种生成风格,也是一种模型能力,所以不同的推理数据集之间存在可迁移性,我们在单任务推理中混入数学COT也发现有效果提升。

Insights

效果其实不用太多说,小模型在经过以上COT训练后,在对应数据集上都有很显著的能力提升。考虑不同论文使用的模型checkpoint不同,Benchmark数据集的划分也不同所以可比性不高,以及现在的很多random split的方案真的说不清楚是否有信息泄露问题。建议大家在自己的业务使用中去寻找更合适的方案。这里想更多说下论文中提到的一些insight

  • COT能力提升以其他任务能力下降为代价

论文[1]发现在数学COT能力提升的同时,模型在BigBench(BBH)上的打分会出现显著的下降,并且这个过程是随微调逐渐发生的。论文指出的可能原因是小模型能承载的能力有限,因此不像大模型可以许广泛任务上有很好的表现,小模型单一能力的提升,可能会以通用能力损失为代价。虽然这里我有些存疑,感觉BBH的效果下降也可能是因为COT的生成风格和很多通用任务的生成风格存在差异,如果在COT微调时在中加入额外的指令,把直接生成推理转化成基于指令推理的条件生成任务,可能会降低对其他任务的影响。

  • 小模型COT也存在规模效应

论文几乎都提到了这一点,简单说就是越大的模型越好,所以在ROI允许的范围内选择最大的小模型哈哈~

  • 使用Few-shot-COT微调,会同时提升zero-shot和few-shot能力,反之不成立

以上发现也是论文[1]使用混合样本(fewshot+zeroshot+无cot)样本进行微调的原因。其实比较好理解,因为COT推理的生成风格和其他指令任务是存在差异的(哈哈zero-shot-cot在我看来就像是无缘无故,别人问你问题,你本来可以直接给个答案,结果你突然开启柯南模式开始叭叭的推理)。因此如果用zero-shot-cot微调,会直接影响模型的解码分布,而使用few-shot-cot微调,充分的上文让模型更多拟合COT条件解码概率,只会有部分能力迁移到无条件解码概率,且对其他指令任务的影响也会更小。

  • 多步推理任务上COT微调可能比常规指令微调效果更佳,模型规模效应更明显

论文[3]对比了在同一个任务上使用COT样本微调和使用只有答案的常规样本微调,整体上在需要多步推理的任务上,COT微调有更明显的模型规模效应,随模型变大COT微调的效果会显著超过常规微调。

  • COT数据集的质量和数量都和重要

论文[2]论证了COT数据集存在规模效应,样本越多,微调效果越好,这里的规模效应可能更多来自思维链的多样性覆盖。而论文[3]论证了相同数量的COT样本,人工筛选的正确推理样本对比从模型预测答案正确的COT中采样相同量级的样本,效果会有显著提升。毕竟1个错误的样本可能需要10个正确的样本来纠偏,因此在保证数据集多样性和规模的同时,更有效的样本过滤逻辑也很重要。


reference

[1] Specializing Smaller Language Models towards Multi-Step Reasoning

[2] Teaching Small Language Models to Reason

[3] Large Language Models are Reasoning Teachers

[4] The CoT Collection: Improving Zero-shot and Few-shot Learning of Language Models via Chain-of-Thought Fine-Tuning

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

解密Prompt系列11. 小模型也能COT-先天不足后天来补的更多相关文章

  1. 解密Prompt系列6. lora指令微调扣细节-请冷静,1个小时真不够~

    上一章介绍了如何基于APE+SELF自动化构建指令微调样本.这一章咱就把微调跑起来,主要介绍以Lora为首的低参数微调原理,环境配置,微调代码,以及大模型训练中显存和耗时优化的相关技术细节 标题这样写 ...

  2. 解密Prompt系列2. 冻结Prompt微调LM: T5 & PET & LM-BFF

    这一章我们介绍固定prompt微调LM的相关模型,他们的特点都是针对不同的下游任务设计不同的prompt模板,在微调过程中固定模板对预训练模型进行微调.以下按时间顺序介绍,支持任意NLP任务的T5,针 ...

  3. 解密Prompt系列3. 冻结LM微调Prompt: Prefix-Tuning & Prompt-Tuning & P-Tuning

    这一章我们介绍在下游任务微调中固定LM参数,只微调Prompt的相关模型.这类模型的优势很直观就是微调的参数量小,能大幅降低LLM的微调参数量,是轻量级的微调替代品.和前两章微调LM和全部冻结的pro ...

  4. 解密Prompt系列4. 升级Instruction Tuning:Flan/T0/InstructGPT/TKInstruct

    这一章我们聊聊指令微调,指令微调和前3章介绍的prompt有什么关系呢?哈哈只要你细品,你就会发现大家对prompt和instruction的定义存在些出入,部分认为instruction是promp ...

  5. 解密prompt系列5. APE+SELF=自动化指令集构建代码实现

    上一章我们介绍了不同的指令微调方案, 这一章我们介绍如何降低指令数据集的人工标注成本!这样每个人都可以构建自己的专属指令集, 哈哈当然我也在造数据集进行时~ 介绍两种方案SELF Instruct和A ...

  6. 11.Java 加解密技术系列之 总结

    Java 加解密技术系列之 总结 序 背景 分类 常用算法 原理 关于代码 结束语 序 上一篇文章中简单的介绍了第二种非对称加密算法 — — DH,这种算法也经常被叫做密钥交换协议,它主要是针对密钥的 ...

  7. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  8. 3.Java 加解密技术系列之 SHA

    Java 加解密技术系列之 SHA 序 背景 正文 SHA-1 与 MD5 的比较 代码实现 结束语 序 上一篇文章中介绍了基本的单向加密算法 — — MD5,也大致的说了说它实现的原理.这篇文章继续 ...

  9. 2.Java 加解密技术系列之 MD5

    Java 加解密技术系列之 MD5 序 背景 正文 结束语 序 上一篇文章中,介绍了最基础的编码方式 — — BASE64,也简单的提了一下编码的原理.这篇文章继续加解密的系列,当然也是介绍比较基础的 ...

  10. C++11 并发指南七(C++11 内存模型一:介绍)

    第六章主要介绍了 C++11 中的原子类型及其相关的API,原子类型的大多数 API 都需要程序员提供一个 std::memory_order(可译为内存序,访存顺序) 的枚举类型值作为参数,比如:a ...

随机推荐

  1. 【实践篇】基于CAS的单点登录实践之路

    作者:京东物流 赵勇萍 前言 上个月我负责的系统SSO升级,对接京东ERP系统,这也让我想起了之前我做过一个单点登录的项目.想来单点登录有很多实现方案,不过最主流的还是基于CAS的方案,所以我也就分享 ...

  2. 最好用的.NET敏捷开发框架-RDIFramework.NET V3.6版全新发布 100%源码授权

    RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...

  3. 联系我们html代码

    Syntor by Aceto 11 Boleyn Court, Manor Park, Runcorn, Chesire WA7 1SR +44 (0) 1928 579865 + 44 (0) 1 ...

  4. 从源码角度深入解析Callable接口

    摘要:从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小. 本文分享自华为云社区<一个Callable接口能有多少知识点?>,作者 ...

  5. 如何借助分布式存储 JuiceFS 加速 AI 模型训练

    传统的机器学习模型,数据集比较小,模型的算法也比较简单,使用单机存储,或者本地硬盘就足够了,像 JuiceFS 这样的分布式存储并不是必需品. 随着近几年深度学习的蓬勃发展,越来越多的团队开始遇到了单 ...

  6. Godot 4.0 文件系统特性的总结

    关于文件系统,官方文档犹抱琵琶半遮面,有一些很独特的特性并没有集中地摆出来,导致用的时候晕头转向. 这里总结了目前我发现的Godot文件系统的一些特性. 这是专门针对导出后的,因为一些操作在编辑器里面 ...

  7. intellij IDEA安装JDBC报错 No suitable driver found for jdbc:mysql://localhost:3306

    项目场景: 本地尝试使用intellij IDEA加载JDBC连接MySQL,尝试实现增删改查,本来想做一个小Demo. 问题描述 报错: java.lang.ClassNotFoundExcepti ...

  8. 文心一言 VS chatgpt (7)-- 算法导论2.3 3~4题

    三.使用数学归纳法证明:当n刚好是2的幂时,以下递归式的解是 T(n)=nlgn.若n=2,T(n)=2:若n=2^k,k>1,T(n)=2T(n/2)+n. 文心一言: chatgpt: 首先 ...

  9. 2021-01-05:mysql的自增id的实现逻辑是什么样子的?

    福哥答案2021-01-05:答案来自这个链接:[ 每日一面 - mysql 的自增 id 的实现逻辑是什么样子的?](https://zhanghaoxin.blog.csdn.net/articl ...

  10. vue全家桶进阶之路11:计算属性

    Vue2 中的计算属性是指在组件中声明的计算属性,它们的值是根据其他数据计算得出的,并且会根据依赖数据的变化而自动更新.计算属性可以在模板中使用,与普通属性一样使用,但是它们具有以下优点: 缓存:计算 ...