Finetuned Language Models Are Zero-Shot Learners、Scaling Instruction-Finetuned Language Models
Finetuned Language Models Are Zero-Shot Learners
这篇论文第一次提出了instruction tuning的概念,下图展示了instruction tuning的工作流程以及性能对比:
作者把62个NLP数据集分成了12个类,训练时在11个上面微调,在1个上面测试zero-shot效果,这样可以保证模型真的没见过那类任务,看模型是不是真的能理解「指令」,此外所有使用的数据集作者都将其转变成了指令模式的数据:
像Prompt一样,作者也会为每个任务设计10个指令模版,测试时看平均和最好的表现:
值得注意的是,在分类问题上,以往的工作往往选择概率更高的预测作为模型的输出,但是这是不完美的,因为同一个意思的答案可能有多种表述方式,这就会导致概率的降低,因此对于这种问题,作者选择提供限定好的选项。
经过实验得到了以下结果:
参与预训练的任务的种类越多,预训练模型的能力越强。
模型的参数量大于某一界限的时候Instruction Tuning的方法才能起效。
指令的设置对模型的性能有很大的影响。
Scaling Instruction-Finetuned Language Models
在Flan最开始提出的时候,Flan只是用在了预训练语言模型上,但是这篇文章当中对Flan的适用范围以及使用的数据集等做了进一步的扩展研究,具体来说本文在PaLM以及T5上重点研究了以下三个方面:(1)任务数量的扩展(1.8K微调任务),(2)模型规模的扩大(540B参数),(3)在CoT数据上进行微调,各自对Instruction Tuning方法的影响。研究结果表明,Instruction Tuning对多种模型类别(PaLM、T5、U-PaLM)、prompt设置(零样本、少样本、CoT)和评估基准(MMLU、BBH、TyDiQA、MGSM、开放式生成、RealToxicityPrompts)均能显著提高模型性能和泛化能力。因此作者得出结论————Instruction Tuning是一种普适的,可以提高预训练语言模型性能和可用性的方法。
Flan Finetuning
作者将在数据集上使用一系列指令模板进行指令微调的过程称为Flan(Finetuning language models)。
这项工作的数据集采用了混合的数据集,共计473个数据集,146个任务类别,1836个不同的任务(这里的任务指的是数据集——任务类别的组合,一个数据集可能有多个任务类别,这样就得到了1836个任务)。
其中CoT数据集的使用方式如下,下图用例子展示了是否使用例子以及是否使用CoT的组合:
实验结果如下图所示:
Finetuning with chain-of-thought annotations
这项工作还研究了CoT数据对模型效果的影响:
首先,加入CoT数据集,总是能对LLM的效果产生正面影响,且Flan-PaLM的表现要比PaLM好很多,如下图所示:
其次,对于CoT benchmarks,CoT数据集对效果提升很明显,而对于non-CoT benchmarks,CoT数据集对于模型效果并没有太大的影响。
第三,对于不进行Flan的Palm模型,CoT文本的加入并不能够带来效果的提升;对于Flan之后的Palm模型,CoT能够明显的提升模型的效果;Flan本身也能够给模型带来足够的效果提升。
第四,添加少量示例进行few-shot learning要比zero-shot learning效果更好。
最后,Instruction Tuning可以促进prompt tuning。
总结对比Finetune、Prompt、Instruction、CoT
首先总结下prompt方法的发展思路,一开始大家通过完形填空的方式发掘语言模型的能力,在few-shot上获取比较好的效果,因为完形填空更符合预训练的形式,后面p-tuning提出连续的token,但是还是依赖hard token作为初始化,并且比较敏感,也是在full-shot上证明了prompt方法比传统的finetune好,之前大家更多关注的是few-shot上的效果,后面出了很多花式魔改相关的论文,比如给Verbalizer融合知识或者直接去掉什么的,这里就不过多介绍了。注意—-在这之前预训练模型都是跟着一起训练的!后面谷歌的prompt tuning诞生,在T5上通过freeze预训练模型,只调添加在第一层的soft prompt,在full-shot上就能和finetune上效果相当,这样新坑出现了,后面出了一系统工作,比如PPT、P-tuning v2和SPoT等,这里也不详细介绍了。
Instruction Tuning和Prompt Tuning的核心一样,就是去发掘语言模型本身具备的知识。而他们的不同有以下几点:
首先,Prompt是去激发语言模型的补全能力,比如给出上半句生成下半句、或者做完形填空,这从prompt的模板上就可以看出来(例如将情感分类任务转换成prompt模板:“带女朋友去了一家餐厅,她吃的很开心,这家餐厅太__了!”,然后再将补全的词语映射到分类上得到positive);
而Instruction Tuning则是激发语言模型的理解能力,通过给出更明显的指令,让模型去理解并做出正确的行动,这从instruction的模板上也可以得到体现(例如情感分类任务的Instruction模板:“instruction:请判断这句话的情感,并从positive、negative、don’t know中选一个作为答案。input:带女朋友去了一家餐厅,她吃的很开心。output: positive。”)。
此外,Prompt在没微调的模型上也能有一定效果,而Instruction Tuning则必须对模型微调,让模型知道这种指令模式。
Prompt针对每个任务,单独生成prompt模板(hard prompt or soft prompt),然后在每个任务上进行full-shot微调与评估,其中预训练模型参数是freeze的;Instruction针对每个任务,单独生成instruction(hard token),通过在若干个full-shot任务上进行微调,然后在具体的任务上进行评估泛化能力(zero shot),其中预训练模型参数是unfreeze的。
finetune、prompt、instruction的工作方式如下图所示:
Chain-of-thought则是一种处理复杂问题或执行多步骤任务的技巧,通常用于大型预训练语言模型中。这种方法允许模型在多个步骤中生成连贯的回答,从而更好地解决问题或完成任务。在CoT方法中,模型的输出被视为一个序列,每个部分都是一个独立的“思考链”或步骤,模型通过将先前的输出作为后续输入的一部分来迭代地生成这些部分,这样可以让模型在一定程度上模拟人类解决问题的过程。