前两章我们分别介绍了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]
以下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也发现有效果提升。
效果其实不用太多说,小模型在经过以上COT训练后,在对应数据集上都有很显著的能力提升。考虑不同论文使用的模型checkpoint不同,Benchmark数据集的划分也不同所以可比性不高,以及现在的很多random split的方案真的说不清楚是否有信息泄露问题。建议大家在自己的业务使用中去寻找更合适的方案。这里想更多说下论文中提到的一些insight
论文[1]发现在数学COT能力提升的同时,模型在BigBench(BBH)上的打分会出现显著的下降,并且这个过程是随微调逐渐发生的。论文指出的可能原因是小模型能承载的能力有限,因此不像大模型可以许广泛任务上有很好的表现,小模型单一能力的提升,可能会以通用能力损失为代价。虽然这里我有些存疑,感觉BBH的效果下降也可能是因为COT的生成风格和很多通用任务的生成风格存在差异,如果在COT微调时在中加入额外的指令,把直接生成推理转化成基于指令推理的条件生成任务,可能会降低对其他任务的影响。
论文几乎都提到了这一点,简单说就是越大的模型越好,所以在ROI允许的范围内选择最大的小模型哈哈~
以上发现也是论文[1]使用混合样本(fewshot+zeroshot+无cot)样本进行微调的原因。其实比较好理解,因为COT推理的生成风格和其他指令任务是存在差异的(哈哈zero-shot-cot在我看来就像是无缘无故,别人问你问题,你本来可以直接给个答案,结果你突然开启柯南模式开始叭叭的推理)。因此如果用zero-shot-cot微调,会直接影响模型的解码分布,而使用few-shot-cot微调,充分的上文让模型更多拟合COT条件解码概率,只会有部分能力迁移到无条件解码概率,且对其他指令任务的影响也会更小。
论文[3]对比了在同一个任务上使用COT样本微调和使用只有答案的常规样本微调,整体上在需要多步推理的任务上,COT微调有更明显的模型规模效应,随模型变大COT微调的效果会显著超过常规微调。
论文[2]论证了COT数据集存在规模效应,样本越多,微调效果越好,这里的规模效应可能更多来自思维链的多样性覆盖。而论文[3]论证了相同数量的COT样本,人工筛选的正确推理样本对比从模型预测答案正确的COT中采样相同量级的样本,效果会有显著提升。毕竟1个错误的样本可能需要10个正确的样本来纠偏,因此在保证数据集多样性和规模的同时,更有效的样本过滤逻辑也很重要。