背景
上一篇文章介绍参数高效微调,核心目的是解决资源受限条件下的微调。区别于参数高效微调,指令微调的目标是提升模型的任务泛化能力,使其无需任务特定训练即可通过自然语言指令解决新任务(零样本/少样本学习)。本文列出的是指令微调中比较经典的方法/例子,其中包含有另一些如CoT/强化学习等知识点,将在以后的文章中再研究。
指令微调(Instruction Tuning)
- 核心思想:通过指令-输出对训练模型遵循人类意图
- 关键要素:
- 高质量指令数据构造
- 多样化任务覆盖
- 对抗性指令鲁棒性训练
- 应用场景:对话系统、任务型助手
Flan-T5
Flan-T5 是首次系统化研究指令微调的文章,基于T5模型,通过大规模多任务训练和指令模板优化,显著提升模型在零样本、少样本和推理任务中的表现。
1. 多任务指令微调
- 任务混合:Flan-T5 在 1,836 个任务上进行微调,涵盖分类、问答、翻译、生成、推理(CoT)等任务。
- 指令模板:每个任务使用多样化模板(含示例或无示例),增强模型对指令的理解。
2. 指令模板设计
-
模板多样性:同一任务设计多个指令模板,例如:
-
零样本模板:直接给出任务描述。
text
"将以下英文翻译成中文:{input}"
-
少样本模板:包含示例输入-输出对。
text
"示例: 输入:Hello, how are you? 输出:你好,你好吗? 现在翻译:{input}"
-
CoT 模板:要求模型生成推理步骤。
text
"解决以下数学问题,并给出步骤: 问题:小明有5个苹果,吃了2个,又买了3个,现在有多少个苹果? 解答:首先,小明吃掉2个苹果,剩下5-2=3个;然后买了3个,总数是3+3=6。答案是6。 问题:{input}"
-
3. 模型训练策略
- 混合任务训练:将所有任务的指令模板混合,随机采样训练。
- 优化目标:基于 T5 的文本生成目标,输入为指令+问题,输出为答案或推理过程。
- 计算效率:仅用预训练计算量的 0.2%-1.6%(例如 Flan-T5-XXL 仅需 7.6E19 FLOPs)。
优势总结
- 任务泛化性:通过指令模板适应未知任务,无需额外训练。
- 推理能力:CoT 数据使模型具备分步推理能力。
- 多语言支持:在 TyDiQA 等任务中支持 8 种低资源语言。
- 效率与性能平衡:小规模模型(如 Flan-T5-XXL)性能接近甚至超越更大模型(如 PaLM-62B)。
InstructGPT
InstructGPT通过**监督微调(SFT) + 强化学习人类反馈(RLHF)**对齐语言模型与人类意图,分为三阶段:
1. 监督微调(Supervised Fine-Tuning, SFT)
-
目标:用高质量指令-回答对微调预训练模型,初步对齐人类意图。
-
数据构建:人工编写多样化的指令(如问答、创作、推理),并提供标准回答。
示例指令-回答对:
text
指令:解释量子纠缠的概念。 回答:量子纠缠是量子力学中的现象,两个或多个粒子在相互作用后,其量子状态无法单独描述,即使相隔遥远,测量一个粒子会瞬间影响另一个的状态。
-
训练方式:基于GPT-3架构,用交叉熵损失函数微调模型,使其生成符合示例的回答。
2. 奖励模型训练(Reward Model, RM)
-
目标:训练一个能评判回答质量的奖励模型,代替人工标注。
-
数据构建:对同一指令生成多个回答,人工对回答质量排序。
示例排序数据:
text
指令:写一首关于秋天的诗。 回答1:秋天来了,树叶黄了。(质量低:过于简单) 回答2:金风拂面叶纷飞,霜染层林似画帷。孤雁南翔声渐远,斜阳影里故人归。(质量高:语言优美)
标注员将回答2排序高于回答1。
-
训练方式:用排序数据训练奖励模型(基于SFT后的模型),输出回答的分数差异(如回答2得分>回答1)。
3. 强化学习微调(Reinforcement Learning, RL)
-
目标:用奖励模型引导模型生成更符合人类偏好的回答。
-
训练方式:
- 策略(Policy):SFT后的模型。
- 奖励信号:来自RM模型的评分。
- 优化方法:近端策略优化(PPO),最大化奖励并控制模型偏离原始分布。
优化示例:
- 初始生成回答:“量子纠缠是粒子间的关联。”
- 经过RL优化后生成:“量子纠缠是指两个粒子共享量子态,即使相隔遥远,测量一个会立即决定另一个的状态,爱因斯坦称其为‘鬼魅般的超距作用’。”
- 奖励模型会对更详细、准确的回答给出更高分,驱动模型改进。
Self-Instruct
Self-Instruct通过迭代生成-过滤-微调的闭环过程,从少量种子任务出发,逐步扩展数据。流程分为四阶段:
1. 指令生成(Instruction Generation)
目标:利用现有任务池生成新指令。
方法:
- 种子任务:初始任务池包含175个人工编写的任务(如“写一首关于春天的诗”)。
- 提示模板:用8个示例(6个种子任务+2个生成任务)作为上下文,引导模型生成新指令。
案例:
-
输入示例(模型看到的上下文):
任务1:写一篇关于人工智能的短文 任务2:将以下句子翻译成法语 任务3:生成10个科幻故事标题 ...
-
模型生成:可能输出新指令如“设计一个健康饮食的周计划”。
2. 分类任务识别(Classification Task Detection)
目标:区分指令是否为分类任务(需多标签输出)。
方法:
- 用31个示例(12分类+19非分类)作为上下文,提示模型判断。
- 例如,模型看到“判断这句话的情感是积极还是消极”后,能识别为分类任务。
案例:
- 生成指令“判断以下动物是否为哺乳类” → 分类任务
- 生成指令“写一封辞职信” → 非分类任务
3. 实例生成(Instance Generation)
方法:根据任务类型选择生成策略。
A. 非分类任务:输入优先方法(Input-First Approach)
步骤:先生成输入,再生成对应输出。
案例:
- 指令:设计一个健康饮食的周计划
- 输入生成:模型生成“用户需求:素食、低卡路里”
- 输出生成:模型输出一份7天素食菜谱,包含早中晚餐。
B. 分类任务:输出优先方法(Output-First Approach)
步骤:先定义分类标签,再生成对应输入。
案例:
- 指令:判断以下动物是否为哺乳类
- 输出生成:模型先确定标签(是/否)
- 输入生成:
- 标签“是” → 输入“鲸鱼”
- 标签“否” → 输入“企鹅”
4. 过滤与后处理(Filtering)
目标:去除低质量或重复数据。
方法:
- 去重:ROUGE-L相似度<0.7(如“写诗”和“创作诗歌”视为重复)。
- 格式过滤:排除包含“图像”“图表”等模型无法处理的指令。
- 逻辑过滤:输入与输出矛盾的实例(如输入“猫”,输出“哺乳类:否”)。
案例:
- 保留:指令“生成Python代码计算斐波那契数列”+输入“n=5”→输出正确代码。
- 过滤:指令“画一个柱状图”→因涉及图像被排除。
迭代过程
- 初始任务池:175种子任务 → 生成新任务 → 过滤后加入池中。
- 每轮迭代:用更新后的任务池生成更多指令。
- 最终生成:52K指令、82K实例(含35%无输入指令,如直接要求写诗)。
核心特点对比
维度 | Flan-T5 | InstructGPT | Self-Instruct |
---|---|---|---|
提出背景 | Google基于T5的指令微调模型 | OpenAI基于GPT-3的对齐模型 | 华盛顿大学提出的指令数据生成方法 |
核心方法 | 多任务指令微调(含CoT数据) | 监督微调(SFT)+ 强化学习(RLHF) | 自生成指令-输出对,无需人工标注 |
训练数据 | 1.8K人工标注任务,覆盖对话、推理、代码等 | 人工标注的指令数据 + 人类偏好排序数据 | 模型自动生成的指令数据 |
模型架构 | 编码器-解码器(T5系列) | 仅解码器(GPT系列) | 通用方法,可适配任意模型架构 |
计算成本 | 较低(微调成本为预训练的0.2%-1.6%) | 高(依赖大规模预训练和RLHF) | 低(仅需生成数据并微调) |
模型 | 最佳适用场景 | 推荐场景举例 |
---|---|---|
Flan-T5 | 需要高效推理、跨任务泛化的场景 | 数学解题、多语言问答、代码生成 |
InstructGPT | 高安全要求、自然对话和创作场景 | 客服对话、内容创作、教育辅导 |
Self-Instruct | 数据稀缺或需快速生成指令数据的场景 | 冷启动任务适配、学术研究、低成本微调实验 |