前面对微调(Fine-tuning)的学习中,提到指令微调。当时,不清楚何为指令微调,也一直没来得及仔细学习。
什么是指令微调?LLM经过预训练后,通过指令微调提升模型的指令遵循能力。所谓指令,就是针对具体下游任务,有明确的要求和目的,一般有相应的模板来让指令更加明确。基于指令数据微调语言模型,就是指令微调。
当然,在谷歌的FLAN(https://ar5iv.labs.arxiv.org/html/2109.01652)系列论文中,有一点意外的效果,在针对某些任务进行指令微调后,语言模型在其他未经过微调的任务上的性能也提升了。就是说,人家大模型,是具备举一反三的能力的!
在FLAN系列的论文中,谷歌提出了指令微调的概念,通过自然语言指令描述的任务数据集对预训练后的语言模型进行微调,用于提高语言模型的零样本学习能力。
FLAN(Finetuned Language Net)的论文中展示了指令微调——在通过指令描述的多个数据集上微调语言模型——显著提高了在未见任务上的零样本性能。文章采用了一个137B参数的预训练语言模型,并在超过60个通过自然语言指令模板描述的NLP数据集上进行了指令微调,然后评估在未见任务类型上的性能。FLAN显著提高了其未修改版本的性能,在评估的25个数据集中的20个上超越了零样本175B GPT-3,甚至在ANLI、RTE、BoolQ、AI2-ARC、OpenbookQA和StoryCloze上大幅度超越了GPT-3的少量样本性能。
来看一下FLAN这篇文章的几张图,快速理解FLAN模型的潜力和指令微调方法。
图1展示FLAN模型如何通过指令微调在未见任务上实现出色的零样本性能,并与GPT-3模型的性能进行了直观的比较。图的上半部分展示了指令微调的流程,其中预训练的语言模型在多种任务上进行微调,这些任务以指令的形式表述。在推理时,即使在指令微调期间未见过自然语言推理(NLI)任务,模型也会被评估在NLI任务上的性能。图的下半部分展示零样本FLAN模型对比零样本和少量样本GPT-3模型在三个未见任务类型(自然语言推理、阅读理解和闭卷问答)上的性能提升。
图2对比了指令微调(Instruction Tuning)与预训练-微调(Pretrain-Finetune)和提示(Prompting)两种方法。
√ 预训练-微调(Pretrain-Finetune):这种方法通常需要许多特定任务的示例,并且为每个任务训练一个专门的模型。这通常涉及到在特定任务A上进行微调,并在任务A上进行推理。
√ 提示(Prompting):这种方法通过少量样本提示或提示工程来提高模型的性能。在这种方法中,预训练的语言模型(LM)在推理时通过提示来改善任务A的性能。
√ 指令微调(Instruction Tuning):这种方法结合了预训练-微调和提示的优点,通过使用微调期间的监督来改进语言模型对推理时文本交互的响应。在指令微调中,模型在多个任务上进行微调,这些任务通过自然语言指令来描述,然后在未见的任务上进行推理。
指令微调的核心思想是利用自然语言指令来教授模型执行任务,这样即使在未见任务上,模型也能够遵循指令来执行任务。
图3描述了用于研究的各个数据集以及它们所属的任务簇。具体来说,图3展示了62个文本数据集,这些数据集被聚合成一个单一的集合,并且根据它们的任务类型被分类到12个不同的任务簇中。每个簇内的数据集具有相同的任务类型。图中的两种颜色标识两类不同的任务, “NLU” 代表 “Natural Language Understanding”(自然语言理解),而 “NLG” 代表 “Natural Language Generation”(自然语言生成)。
图4展示了用于自然语言推理(Natural Language Inference, NLI)任务的多个指令模板(instruction templates)。
从头开始创建一个包含许多任务的指令调整数据集将非常耗费资源,所以,文章将社区现有的数据集转换为为指令格式。汇总的62个文本数据集,这些数据集在TensorFlow Datasets上公开可用。
对于每个数据集,手动编写了十个独特的模板,这些模板使用自然语言指令来描述该数据集的任务。这十个模板中的大多数描述了原始任务,但为了增加多样性,对于每个数据集,还包括了多达三个“反转任务”的模板(例如,对于情感分类,包括了要求生成电影评论的模板)。然后,在所有数据集的混合体上对预训练的语言模型进行指令调整,每个数据集中的例子都通过为该数据集随机选择的指令模板进行格式化。