这一章我们聊聊指令微调,指令微调和前3章介绍的prompt有什么关系呢?哈哈只要你细品,你就会发现大家对prompt和instruction的定义存在些出入,部分认为instruction是prompt的子集,部分认为instruction是句子类型的prompt。详情获取:更多信息
对比前三章介绍过的主流prompt范式,指令微调有如下特点
-
面向大模型:指令微调任务的核心是释放模型已有的指令理解能力(GPT3中首次提出),因此指令微调是针对大模型设计的,因为指令理解是大模型的涌现能力之一。而prompt部分是面向常规模型例如BERT
-
预训练:与其说是instruction tunning,更像是instruction pretraining,是在预训练阶段融入多样的NLP指令微调,而非针对特定下游任务进行微调,而之前的promp主要服务微调和zeroshot场景
-
multitask:以下模型设计了不同的指令微调数据集,但核心都是多样性,差异化,覆盖更广泛的NLP任务,而之前的prompt模型多数有特定的任务指向
-
泛化性:在大模型上进行指令微调有很好的泛化性,在样本外指令上也会存在效果提升
-
适用模型:考虑指令都是都是sentence形式的,因此只适用于En-Dn,Decoder only类的模型。而之前的prompt部分是面向Encoder的完形填空类型
下面我们介绍几个指令微调相关的模型,模型都还是那个熟悉的模型,核心的差异在于微调的指令数据集不同,以及评估侧重点不同,每个模型我们只侧重介绍差异点。按时间顺序分别是Flan, T0,InstructGPT, TK-Instruct
Google: Flan
paper: 2021.9 Finetuned Langauge Models are zero-shot learners
模型:137B LaMDA-PT
一言以蔽之:抢占先机,Google第一个提出指令微调可以解锁大模型指令理解能力
谷歌的Flan是第一个提出指令微调范式的,目的和标题相同使用指令微调来提升模型的zero-shot能力。论文使用的是137B的LAMDA-PT一个在web,代码,对话, wiki上预训练的单向语言模型。
指令集
在构建数据集上,谷歌比较传统。直接把Tensorflow Dataset上12个大类,总共62个NLP任务的数据集,通过模板转换成了指令数据集
为了提高指令数据集的多样性,每个任务,会设计10个模板,所以总共是620个指令,并且会有最多3个任务改造模板。所谓的任务改造就是把例如影评的情感分类任务,转化成一个影评生成任务,更充分的发挥已有标注数据构建更丰富的指令数据集。哈哈感觉这里充满了人工的力量。
为了保证数据集的多样性和均衡性,每个数据集的训练样本限制在3万,并且考虑模型对一个任务的适应速度取决于任务数据集大小,因此按使用数据集样本大小占比按比例采样混合训练。
效果
效果上137B的指令微调模型大幅超越GPT3 few-shot, 尤其是在NLI任务上,考虑NLI的句子对基本不会在预训练文本中自然作为连续上下句出现。而指令微调中设计了更自然地模板带来了大幅的效果提升。</