解密Prompt系列11. 小模型也能COT-先天不足后天来补
前两章我们分别介绍了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-先天不足后天来补的更多相关文章
- 解密Prompt系列6. lora指令微调扣细节-请冷静,1个小时真不够~
上一章介绍了如何基于APE+SELF自动化构建指令微调样本.这一章咱就把微调跑起来,主要介绍以Lora为首的低参数微调原理,环境配置,微调代码,以及大模型训练中显存和耗时优化的相关技术细节 标题这样写 ...
- 解密Prompt系列2. 冻结Prompt微调LM: T5 & PET & LM-BFF
这一章我们介绍固定prompt微调LM的相关模型,他们的特点都是针对不同的下游任务设计不同的prompt模板,在微调过程中固定模板对预训练模型进行微调.以下按时间顺序介绍,支持任意NLP任务的T5,针 ...
- 解密Prompt系列3. 冻结LM微调Prompt: Prefix-Tuning & Prompt-Tuning & P-Tuning
这一章我们介绍在下游任务微调中固定LM参数,只微调Prompt的相关模型.这类模型的优势很直观就是微调的参数量小,能大幅降低LLM的微调参数量,是轻量级的微调替代品.和前两章微调LM和全部冻结的pro ...
- 解密Prompt系列4. 升级Instruction Tuning:Flan/T0/InstructGPT/TKInstruct
这一章我们聊聊指令微调,指令微调和前3章介绍的prompt有什么关系呢?哈哈只要你细品,你就会发现大家对prompt和instruction的定义存在些出入,部分认为instruction是promp ...
- 解密prompt系列5. APE+SELF=自动化指令集构建代码实现
上一章我们介绍了不同的指令微调方案, 这一章我们介绍如何降低指令数据集的人工标注成本!这样每个人都可以构建自己的专属指令集, 哈哈当然我也在造数据集进行时~ 介绍两种方案SELF Instruct和A ...
- 11.Java 加解密技术系列之 总结
Java 加解密技术系列之 总结 序 背景 分类 常用算法 原理 关于代码 结束语 序 上一篇文章中简单的介绍了第二种非对称加密算法 — — DH,这种算法也经常被叫做密钥交换协议,它主要是针对密钥的 ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- 3.Java 加解密技术系列之 SHA
Java 加解密技术系列之 SHA 序 背景 正文 SHA-1 与 MD5 的比较 代码实现 结束语 序 上一篇文章中介绍了基本的单向加密算法 — — MD5,也大致的说了说它实现的原理.这篇文章继续 ...
- 2.Java 加解密技术系列之 MD5
Java 加解密技术系列之 MD5 序 背景 正文 结束语 序 上一篇文章中,介绍了最基础的编码方式 — — BASE64,也简单的提了一下编码的原理.这篇文章继续加解密的系列,当然也是介绍比较基础的 ...
- C++11 并发指南七(C++11 内存模型一:介绍)
第六章主要介绍了 C++11 中的原子类型及其相关的API,原子类型的大多数 API 都需要程序员提供一个 std::memory_order(可译为内存序,访存顺序) 的枚举类型值作为参数,比如:a ...
随机推荐
- TIM-PWM输出,占空比改变时机对输出波形的影响
一.实验概述 以下说明描述三种改变PWM占空比的方式,对于当前PWM输出波形的影响 1.禁止预装载功能,在PWM某一周期波形输出过程中改变占空比值(ccp) 2.禁止预装载功能,在PWM某周期波形输出 ...
- SRAM 测试总结
SoC随着工艺进步设计复杂度增加,embeded sram也越来越多.在40nm SoC产品Sram一般在20Mbits左右,当工艺发展到28nm时Sram就增加到100Mbits.如果考虑AI产品, ...
- 【源码分析】XXL-JOB的执行器的注册流程
目的:分析xxl-job执行器的注册过程 流程: 获取执行器中所有被注解(@xxlJjob)修饰的handler 执行器注册过程 执行器中任务执行过程 版本:xxl-job 2.3.1 建议:下载xx ...
- Linux tinyhttpd编译总结
编译环境:ubuntu16.04 x64 直接make编译tinyhttpd弹出如下错误和打印信息 其中报出两个错误信息,一个是cannot find -lsocket,另外一个就是pthread_ ...
- 前端js几种加密/解密方法
https://www.jianshu.com/p/4c236d83ea04 https://blog.csdn.net/guxingsheng/article/details/84451573 vu ...
- [双目视差] 立体匹配算法推理 - SGBM算法(二)
文章目录 立体匹配算法推理 - SGBM算法(二) 一.SGM算法 二. 后处理 立体匹配算法推理 - SGBM算法(二) 一.SGM算法 SGM算法的全称为Semi-Global Matching, ...
- 2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能。
2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能. 答案2023-05-04: 这段代码实现了使用 libswscale 库 ...
- Prism Sample 9 ChangeConvention
上个例子跳过了ViewModelLocator,因是采用约定的方式最为方便. 如果有人要修改约定,自定义view和viewModel的默认自动定位方式,怎么办呢? 在app.xaml.cs重写以下方法 ...
- Selenium - 元素定位(3) - CSS进阶
Selenium - 元素定位 CSS 定位进阶 元素示例 属性定位 # css 通过id属性定位 driver.find_element_by_css_selector("#kw" ...
- Windows与网络基础
Windows 基础命令 一.目录和文件的应用操作 1.cd命令 cd /d d:\ //切换到d盘目录,因为改变了驱动器,所以要加上/d选项 cd c:\ //如果没有改变驱动器号,就不需要加/d选 ...