目录
文章目录
- 目录
- 有监督微调(SFT)
- 指令微调
- 具备泛化能力的指令数据集
- 指令数据集生成方法
- 多轮对话指令数据样本
- SFT 数据集特征
有监督微调(SFT)
事实上,LLM 所拥有的海量知识都是源于预训练语料的,预训练是 LLM 强大能力的根本来源。但是,预训练赋予 LLM 的能力,却还需要 SFT 将其激发出来。
因为,经过预训练的 LLM 好像一个博览群书但又不求甚解的书生,对什么问题都可以流畅地接出下文,但却无法理解问题本身,只会 “死记硬背”。这一现象的本质是因为 LLM 的预训练任务是经典的 CLM(从上文预测下一个 token)。
而 SFT 就是教这个博览群书的学生如何正确的去运用它的知识,即 Instruction Alignment(指令对齐),让 LLM 和人类期望的指令输出进行匹配和对齐。强大的指令理解能力与文本生成能力使 LLM 能够直接、高效、准确地响应用户指令,从而真正向通用人工智能的目标逼近。
指令微调
首先对 PLM 和 LLM 的 SFT 要进行区分和对比:
- Task-specific SFT:对于能力有限的 PLM,需要针对每一个下游任务单独进行 SFT 以优化模型在该任务上的表现。例如:要解决文本分类问题,需要对 BERT 进行文本分类的微调;要解决实体识别的问题,就需要进行实体识别任务的微调。但这些微调并不通用。
- Multi-task SFT:对于能力强大的 LLM,往往不再对指定任务进行 SFT,而是优化模型的 “通用指令遵循能力”,即能够理解并回复用户的指令。
所以严格的讲,针对 LLM 的 Multi-task SFT 采用的是 “指令微调” 方法,数据样本是由用户手动撰写的高质量 “指令-响应对”。如下所示,一般 SFT 所使用的指令数据集包括以下 3 个键:
{"instruction":"用户输入的指令","input":"执行该指令可能需要的补充输入,没有则置空","output":"用户希望模型在收到该指令后做出的回复"}# e.g.{"instruction":"将下列文本翻译成英文:","input":"今天天气真好","output":"Today is a nice day!"}具备泛化能力的指令数据集
泛化的含义是 LLM 即便在执行未训练过的 instruction 时也能够表现良好。为了使 LLM 能够获得泛化的指令遵循能力,需要收集大量多种类型的 “指令-响应对” 来对 LLM 进行 SFT,同时也需要相对较大的指令数据量。
- 数据的数量:一般来说,在单个任务上 500~1000 的训练样本就可以获得不错的微调效果。但是泛化表现良好的 LLM 的数据量一般在数 B 量级的 token。
- 数据的多样性:指令数据集的覆盖范围越大越好,并且要注意多种类型的指令数据之间的配比。例如:OpenAI GPT-3 微调的 InstructGPT(ChatGPT 前身)使用了来自于用户使用其 API 的十种指令:
指令数据集生成方法
事实上,ChatGPT 的成功很大一部分来源于其高质量的人工标注数据。但高质量指令数据集的获取成本很高,需大量人工设计、标注、筛选的投入。
为降低数据成本,业界也提出了使用 ChatGPT 或 GPT-4 来生成指令数据集的方法。例如,开源指令数据集 Alpaca 就是基于一些种子 Prompt,通过 ChatGPT 来生成更多的指令,然后再对指令进行回复来构建的。
多轮对话指令数据样本
多轮对话的含义是 LLM 在每一次对话时能够参考之前的对话历史来给出回复,而不会忘记前面的内容。实际上,LLM 能否支持多轮对话与预训练没有关系,而是与 SFT 有关。
如果要使 LLM 支持多轮对话,就需要在 SFT 时将指令数据样本构造为多轮对话的格式,目前绝大部分 LLM 均使用了多轮对话的指令数据样本来进行 SFT。
构造多轮对话指令数据样本一般有 3 种方式:
- 将前面所有对话历史作为 input,将模型的最后一次回复作为 output,直接拟合最后一次回复。缺点是会丢失大量中间信息。
- 将 N 轮对话构造成 N 个样本,缺点是造成了大量重复计算。
- 直接要求 LLM 预测每一轮对话的输出,是最合理的多轮对话构造方式。
SFT 数据集特征
一个可参考的微调过程如下所示,垂直领域 Post-pretrain 后,先进行通用 SFT 训练,提升模型对通用的指令理解和语言跟随能力。然后再进行垂直领域 SFT 训练,提升模型在垂类领域中的指令理解和语言跟随能力。
垂直领域 Post-pretrain:
- 无标注数据量:要求有大量高质量的行业预训练语料,通常是 Billion 级的 tokens,1B 约等于 13.3 亿个汉字。
- 领域专业性数据: 包含领域内常见的专业术语和词汇,以确保模型能够正确理解和使用这些术语。例如,在金融领域,包括金融教材、公司公告、研究报告等;在医疗领域,包括临床文献、病历记录、药品说明书等。但实际上,对于某些领域或任务,高质量、标注好的数据可能非常稀缺,限制了后预训练过程的效果。
- 多样性和广泛性: 确保语料库涵盖特定领域内的各种场景、主题和任务。这有助于模型更全面地理解领域内的多样性。
通用 / 垂直领域 SFT:
- 有标注指令集数据量:少量高质量人工标注的指令集,通常为数千条数据。
- 领域特定性与通用性矛盾:后预训练过程旨在使模型适应特定领域或任务的需求,但过度的领域特定化可能导致模型在通用任务上表现下降。如何在领域适应性与通用性之间找到平衡点是一个挑战。
- 混合训练提升通用能力:仅用单一领域数据进行模型训练,模型很容易出现灾难性遗忘现象,其他领域的能力出现下降。在领域训练过程中加入通用数据进行混合训练,在增强用户垂类场景能力的同时,保持其原本的通用能力。若仅需要使用指定垂类场景下的能力,可以直接进行训练;若需要模型保持通用能力的同时,提升垂类场景的能力,可以选择数据配比进行混合训练。经验上推荐配比为 1:5,即 1 份领域数据,5 份通用语料。
- 迁移学习难度:将后预训练好的模型迁移到新的任务或领域时,可能面临数据分布差异、任务复杂度变化等问题,需要设计有效的迁移学习策略来提高模型的适应能力。