1.目的
指令微调是一种通过在由(指令,输出)对组成的数据集上进一步训练LLMs的过程。其中,指令代表模型的人类指令,输出代表遵循指令的期望输出。这个过程有助于弥合LLMs的下一个词预测目标与用户让LLMs遵循人类指令的目标之间的差距。
指令微调可以被视为有监督微调(Supervised Fine-Tuning,SFT)的一种特殊形式。但是,它们的目标依然有差别。SFT是一种使用标记数据对预训练模型进行微调的过程,以便模型能够更好地执行特定任务。而指令微调是一种通过在包括(指令,输出)对的数据集上进一步训练大型语言模型(LLMs)的过程,以增强LLMs的能力和可控性。指令微调的特殊之处在于其数据集的结构,即由人类指令和期望的输出组成的配对。这种结构使得指令微调专注于让模型理解和遵循人类指令。
总的来说,指令微调是有监督微调的一种特殊形式,专注于通过理解和遵循人类指令来增强大型语言模型的能力和可控性。虽然它们的目标和方法相似,但指令微调的特殊数据结构和任务关注点使其成为SFT的一个独特子集。
2.数据集处理
一些研究表明,增加构建的指令中的任务数量可以更好地提高LLM的泛化能力。同时,可以在微调指令中加入一些预训练数据,这可以使微调过程更加稳定
2.1 指令数据集的结构
指令数据集中的每个实例由三个元素组成:
- 一个指令,它是指定任务的自然语言文本序列(例如,为XX写一封感谢信给XX,写一篇关于XX主题的博客,等等);
- 为上下文提供补充信息的可选输入;
- 以及基于指令和输入的预期输出。
2.2 构建中文指令数据的几种方式:
- 纯人工构建,包括指令(instruct、prompt)和回应(response),这种方式成本较高,只应用在安全性等部分类型数据上。
- 基于大模型的蒸馏,参考self-instruct的方式,构建种子指令,通过调用大模型(GPT3.5等)构建指令以及对应的回应。这种方式成本更低、效率更高,但是会掺杂部分错误。
- 从英文指令数据翻译到中文指令数据,这种方式也可以很快构建中文指令数据,缺点一是数据中不可避免地存在翻译错误,二是因文化差异带来的语言习惯、价值观差异。
2.3 指令微调的数据集分为以下三大类:
-
泛化到未见任务(侧重任务泛化能力)
包含多样化的任务,每个任务都有专门的指令和数据样例。模型在这类数据集上训练后,可以泛化到未见过的新任务上。 -
在单轮中遵循用户指令(侧重单轮指令理解能力)
包含指令及其对应的响应,用于训练模型单轮回复用户指令。训练后,模型可以理解指令并作出回复。 -
像人类一样提供帮助(侧重连续多轮对话能力)
包含多轮闲聊对话。训练后,模型可以进行多轮交互,像人类一样提供帮助。
2.4 数据构建条件:
- 代表性。应该选择多个有代表性的任务
- 数据量。每个任务实例数量不应太多(比如数百个)否则可能会潜在地导致过拟合问题并影响模型性能
- 不同任务数据量占比。应该平衡不同任务的比例,并且限制整个数据集的容量(通常几千或几万),防止较大数据集压倒整个分布
3.模型评测
- 为确保在对齐指令上微调后,SFT模型在预训练阶段获得的通用能力以及上下文学习能力没有大幅下降。注意不能在一堆 benchmark 上看平均分数,因为平均值差异不大,并且很多任务没有代表性;只在核心的有区分度的 benchmark 评测,包括:知识蕴含能力(MMLU),推理能力(GSM8k / BBH ),代码能力(Human Eval / MBPP) 以及数学能力(MATH )。
- 另一方面,需要评测模型生成的回复是否和人类对齐。对齐能力可以通过人工评测,评价的内容包括真实性,有用性,无害性(helpfulness,harmlessness,honesty)等等,也可以通过一个足够大的,已经训练好了的RM进行评测。