
指令微调定义: 指令微调是一种在带有指令提示和相应输出的标记数据集上微调大模型的技术,通过提供一组概述所需操作的指南或指令,使预训练模型适应执行特定任务。
指令微调是关于使用示例来训练模型,这些示例展示了模型应该如何响应查询,用于微调大模型的数据集必须服务于你的指令目的。例如:

关于指令微调的作用描述:
我们举一个列例子,可以想象:
如果没有微调,基础大模型可能会对 “教我如何游泳” 的提示回复 “去专业的游泳馆”。
这在语法上是一种合理的完成句子的方式,但显然不能满足用户的需求,用户的初始用意应该是让大模型输出游泳的姿势动作以及如何掌控等,以帮助其学会怎么游泳。
就像之前开玩笑说会出现大量的提示语工程师(Prompt Engineer),提示语工程其实就是在做任务的微调(无参数更新),以便模型输出的结果更可能满足业务所需。
指令微调通过给予模型明确的指令和反馈,为使模型专门化提供了一种替代方法,与微调只是提供输入输出示例不同,指令微调能够利用自然语言和对话,解释期望的行为和评估标准。

指令微调和其他微调技术不冲突,指令微调通常与微调结合使用。微调提供领域知识基础,而指令微调允许高效适应
指令微调需要在标记的(输入、输出)对上进行有监督学习。指令微调与其他形式的有监督微调(SFT)的区别在于:

指令数据集可以由人工创建,也可以由其他大模型生成:
指令有两种来源:

指令数据集中的每个实例由三个元素组成:

指令微调结合了预训练-微调和提示工程这两种范式的优势。本质上,通过将提示工程的原则有机地融入到监督微调中,指令微调减少了为从微调模型中获得有效准确响应所需的提示工程和示例的数量。
下面我们一些指令数据集构建的例子
Alpaca 数据集是用于指令微调语言模型的公开数据集之一。这个数据集被用于训练Alpaca模型(Llama 2 的指令微调版本)。该数据集包含 52000 个样本,这些样本是使用 text-davinci-003 模型生成的。数据集可以直接从 Hugging Face 数据集下载。
数据字段:
Alpaca数据集构建方式是在 Self-Instruct 框架的数据生成管道基础上进行了以下修改:

https://huggingface.co/datasets/tatsu-lab/alpaca
Self-Instruct 过程是一种迭代自举算法,它从一组手动编写的指令种子集开始,并用它们来提示语言模型生成新的指令以及相应的输入 - 输出实例。然后对这些生成结果进行过滤以去除低质量或相似的实例,所得数据被添加回任务池中。这个过程可以重复多次,从而产生大量的指令数据集合,可用于微调语言模型以更有效地遵循指令。

Instruction Tuning for Large Language Models: A Survey,https://arxiv.org/pdf/2308.10792
微调通常涉及以下步骤:

指令微调和预训练模型架构一样,一般是因果解码器架构,下面左侧是模型架构,右侧是不同预训练模型在指令数据集进行微调后的变体。


指令微调阶段,模型的目标是通过最小化损失函数(通常是交叉熵损失),优化参数,使其更适应特定任务。对于指令微调,损失函数通常是:

其中T是目标输出序列的长度,
是目标输出的第
个标记,x是输入序列(即指令和上下文)。
采样交叉熵损失,计算返回结果与输入的维度相同,然后采用loss_mask不计算prompt部分的损失,代码如下:

参数高效微调方法的分类。我们识别出三大类方法:基于加法的方法、基于选择的方法和基于重参数化的方法。在加法方法中,我们进一步区分出两个主要的子类:类似Adapter的方法和软提示方法。

Scaling Down to Scale Up: A Guide to Parameter-Efficient Fine-Tuning
近年来PEFT方法的演变发展。下面左图显示同一分支上的模型具有一些共同特点,模型的垂直位置表示它们发布的时间线,右图为大模型的参数高效微调方法的分类

Parameter-Efficient Fine-Tuning Methods for Pretrained Language Models


尽管 GPT 和 BERT 等模型取得了成功,但它们的预训练和微调方法仍存在局限性。文本补全目标可能无法提供足够的上下文理解,导致理解肤浅。此外,这些方法通常缺乏详细的任务描述,限制了模型的泛化能力。
2019 年,多任务学习越来越受欢迎,T5 等模型可以同时在多个任务上进行训练。T5 数据格式由文本到文本格式和特定于任务的前缀组成,这是朝着正确方向迈出的一步。此前缀仅提供任务名称或简短提示以指示手头的任务。虽然这种方法提高了训练任务的性能,但它未能解决一个重大挑战:跨任务泛化。

T5 数据格式由文本到文本格式组成,其中输入是具有任务特定前缀的文本序列,输出是生成的文本序列。
这一限制意味着模型无法有效地推广到新的、未见过的任务,这凸显了对更先进技术的需求,以增强模型理解和适应新指令的能力。
为了克服传统预训练和微调的局限性,2021 年出现了一种新方法:指令微调。指令微调涉及在模型微调阶段向语言模型提供详细的自然语言指令。这种方法使模型能够更细致地理解任务上下文和元素之间的关系,从而使其能够更好地推广到新任务和上下文。

指令调整的泛化示例:在训练过程中,模型可能只会遇到翻译和摘要的任务。然而,在推理过程中,可以引入一个结合翻译和摘要的新任务。

指令调优的一个显著例子是谷歌的 Wei 等人于 2021 年 9 月推出的FLAN。FLAN通过利用更详细、更细致的指令来跟踪指令数据,标志着 NLP 领域的重大突破,从而显著提高了 LLM 的性能、多功能性和整体能力。FLAN 的主要特点如下:



与零样本和少样本 GPT-3 相比,FLAN 在三种未见过的任务类型上的表现,在评估的十种任务中,指令调整显著提高了性能。NLI 数据集:ANLI R1–R3、CB、RTE。阅读理解数据集:BoolQ、MultiRC、OBQA。封闭式问答数据集:ARC-easy、ARC-challenge、NQ、TriviaQA。

Flan 与 LaMDA-PT 137B、GPT-3 175B 和 GLaM 64B/64E 在自然语言推理、阅读理解、闭卷问答和翻译方面的零样本性能比较。FLAN 的性能是每项任务最多 10 个教学模板的平均值。监督模型是 T5、BERT 或翻译模型。
BigScience 于 2021 年 10 月推出的T0代表了 LLM 多任务提示训练的重大进步。该模型旨在将各种 NLP 任务重新表述为自然语言提示格式,使其能够在未见过的任务上实现强大的零样本性能,而无需针对特定任务进行微调。T0 的主要特点:

2. 指令遵循能力: T0 专门设计用于遵循自然语言指令,使其易于使用。此功能允许用户使用通俗易懂的语言与模型进行交互,使其能够理解和执行各种指令。 3. 多样化的训练数据:该模型在包含大量任务和指令的广泛数据集上进行训练,从而增强了其推广到未知任务的能力。这种多样性有助于学习广泛的技能。 T0 数据集和任务分类法。(T0+ 和 T0++ 在其他数据集上进行训练。完整列表见表 5。)颜色表示监督级别。黄色数据集是训练混合数据集。绿色数据集是保留数据集,表示训练期间未见过的任务。由于输入长度较长,Hotpot QA 被重新定义为闭卷 QA。

4. 性能增强: T0 在各种 NLP 基准测试中表现出色,通常比规模大得多的模型(最多大 16 倍)表现更好。其泛化和有效遵循指令的能力已显著提高了性能指标。

T0 任务泛化实验结果与 GPT-3 的比较(Brown 等人,2020 年)。每个点代表一个评估提示的表现。基线 T5+LM 模型与 T0 相同,只是没有多任务提示训练。GPT-3 仅报告每个数据集的单个提示。
Google 的研究人员在 FLAN 和 T0 成功的基础上,研究了 LLM 中扩展指令调整的效果。他们的研究Flan-PaLM探索了三个关键因素:
思路链 (CoT) 是一种鼓励模型逐步解决复杂问题的技术。通过将问题分解为更小、更易于管理的部分,模型可以提供更透明、更准确的解决方案。这种方法允许模型“展示其工作”,从而更容易理解其答案背后的推理过程。

各种语言模型在 1.8K 任务上进行微调,这些任务以指令的形式表达,并在未见过的任务上进行评估。微调是在有和没有样例(即零样本和少样本)以及有和没有思路的情况下进行的,从而能够在一系列评估场景中进行泛化。
Flan-PaLM 数据集和方法:在 FLAN 原有的指令调优数据集基础上,新增对话和程序合成任务,并与思维链推理任务进行合并,创建了包含 1800 个任务和 36 个任务的微调数据集,微调采用多种输入格式,包括零样本、少样本和思维链提示。

Flan-PaLM 微调数据包括 473 个数据集、146 个任务类别和 1,836 个任务。

本研究中使用的微调数据格式的组合。我们在有或没有样本的情况下进行微调,在有或没有思路链的情况下也进行微调。
主要结果和发现: Flan-PaLM 模型在多任务语言理解基准 (MMLU) 上实现了最佳性能,超越了 PaLM 和 HyperMind 的预测估计等之前的最佳模型。此外,他们的最佳模型:

分析结果表明,即使在大规模的情况下,扩展模型大小和微调任务数量也会继续提高性能。研究还发现,使用 Chain of Thought 数据进行微调可显著提高具有挑战性的未见任务的性能。此外,他们的结果表明,指令调整对不同的模型大小、架构和预训练目标都具有普遍的好处。
Self-Instruct论文研究了 LLM 是否可以为给定的指令生成实例。如果模型得到正确的提示,答案是肯定的。如下所示,向 LLM 提供了指令,并要求它为每个指令生成示例实例。

该模型针对各种任务生成输入和输出实例,例如报价、地址、工作申请表、代码编写等。构建了数据生成管道,其中包括生成指令、对任务进行分类以及过滤掉不相关的实例。
Self-Instruct 方法在 NLP 领域尤其成功,LLaMA 系列模型就是明证。从 Meta 的基础语言模型 LLaMA 开始,社区开发了各种指令调整版本,包括:

在引入了包括 FLAN、T0 和超自然指令、MetalCL 和 InstructGPT 在内的多种指令调整方法后,LLM 取得了显著的进步,能够处理以前从未遇到过的任务指令。然而,推动这些进步的数据仍然大部分无法被更广泛的研究界所获取。Google Research 的论文“ Flan 集合:设计用于有效指令调整的数据和方法”通过研究和发布更广泛、更全面的公开可用的指令调整任务、模板和方法集合来解决这一差距。

论文首先提供了公共指令调优收集的时间表,重点介绍了自 2020 年以来该领域取得的快速进展。第一波收集工作侧重于扩展数据集和任务,而第二波收集工作则涉及合成数据生成和人工反馈信号。然而,FLAN 收集工作侧重于没有人工反馈的指令泛化,展示了其前景和潜力。
FLAN 集合是一个用于大型语言模型 (LLM) 指令调优的大型数据集。它是一系列可提高各种 NLP 任务性能的任务和方法。
数据集结构:

与 CoT 数据集相比,为其他数据集创建反演非常简单。虽然其他数据集有问答对,但 CoT 数据集有一个额外的中间步骤。因此,对于 CoT 数据集,反演是作为三个组件的排列创建的