大模型(LLMs)生成SFT数据方法
📝 通俗解释:SFT(Supervised Fine-Tuning,监督微调)是让预训练大模型学会"听懂人话"的关键步骤。这就像老师教学生,先给学生一本百科全书(预训练),再通过练习题教会他具体回答问题(微调)。而生成这些"练习题"的方法,就是本文要介绍的内容。
一、SFT数据集格式篇
大模型微调时,数据集的格式通常取决于微调的具体目标和应用场景。根据搜索结果,常见的微调数据集格式主要包括以下几种:
1. 指令跟随格式
- 介绍:这种格式的数据集以指令和输出对的形式存在,用户输入一个指令,模型根据指令生成相应的输出结果。
- 数据存储方式:数据集通常采用JSON文件格式存储,例如Alpaca-52k数据集,它包含了52000条指令数据。
- Instruction/Output格式:包含一个指令和一个对应的输出。
{
"instruction": "什么是三原色?",
"output": "三原色是红、蓝、黄。"
}📝 通俗解释:这种格式就像填空题,"instruction"是题目,"output"是标准答案。模型学习的是:看到这样的问题,应该这样回答。
- Instruction/Input/Output格式:包含一个指令、一个输入和一个输出,适用于需要模型处理输入并生成输出的场景。
{
"instruction": "检查这个句子的拼写和语法错误",
"input": "他吃完饭离开了餐厅。",
"output": "这句话中有两个拼写错误。正确的句子应该是:"他吃完饭后离开了餐厅"."
}📝 通俗解释:这种格式就像作文题,给定一个输入内容(原材料),模型需要按照指令要求处理后输出结果。比如输入一段文章,输出摘要或修改建议。
2. 多轮对话格式
- 介绍:这种格式模拟用户和模型之间的多轮对话,模型通过与用户的交互来满足用户的需求。
- 数据存储方式:数据集通常采用JSON文件格式存储,例如belle_chat_ramdon_10k.json,该样例数据是从multiturn_chat_0.8M采样出1万条,并且做了格式转换。
- conversations格式:一个对话内容。
{
"id": "77771",
"conversations": [
{
"from": "human",
"value": "写一篇关于气候变化对海洋生态的影响的文章。"
},
{
"from": "gpt",
"value": "好的,以下是你要求的文章:\n气候变化对海洋生态的影响\n气候变化对海洋生态产生了广泛的影响。全球变暖导致海洋温度上升,这可能会对许多水生生物的生存、繁殖和迁移造成巨大的影响。另外,海洋酸化也是一个问题,因为大气中二氧化碳的增加导致海水中的pH值下降,使得许多生物的外骨骼变得脆弱,从而影响它们的生存和繁殖。\n此外,气候变化还会引起海平面上升,这不仅对海岸线和沿海居民产生影响,还会对许多海洋生物的栖息地造成影响..."
},
{
"from": "human",
"value": "从刚刚的文章中提取出气候变化对海洋生物繁殖的影响。"
},
{
"from": "gpt",
"value": "文章已经提到过气候变化会对海洋生物的生存、繁殖和迁移造成影响。例如,海洋酸化会使得许多生物的外骨骼变得脆弱,进而影响它们的生存和繁殖。此外,海洋温度上升也可能会对很多生物的生存和繁殖产生负面影响。"
}
],
"system": "系统提示词(选填)",
"tools": "工具描述(选填)"
}📝 通俗解释:这种格式就像微信聊天记录,"human"是用户说的话,"gpt"是AI的回答。模型学习的是:看到这样的对话历史,应该如何继续回答。这样可以让AI学会"多轮对话"的能力,而不是每次都只回答一句话。
字段说明:
id:对话 id(唯一标识符)conversations:对话内容列表from:说话人(human表示用户,gpt表示模型)value:说话内容
3. 其他辅助格式
- 包括纯文本文档格式、文本总结数据集、根据纯文本生成对话的数据集等。
- 这些格式不易直接转化为对话形式,但可以通过特定的处理转换为指令跟随或多轮对话的格式。
📝 通俗解释:有些原始数据可能是普通的文章或报告,需要通过"格式化"操作转换成训练数据。比如把一篇新闻文章转换成"总结这篇文章"的任务数据。
二、SFT数据集如何生成?
SFT数据集构建通常有两种方法:人工标注和使用LLM生成。
| 方法 | 优点 | 缺点 |
|---|---|---|
| 人工标注 | 对于构建垂直领域比较合适,可以减少有偏数据 | 成本略高 |
| LLM生成(如GPT-4) | 可以在短时间内生成大量数据 | 可能存在质量不稳定的问题 |
📝 通俗解释:人工标注就像请老师傅手把手教学生,质量有保证但花钱花时间;用LLM生成就像用印刷机批量印练习题,速度快但可能有个别题目的答案不太准确。
SFT数据集构建及微调Pipeline:
┌─────────────────────────────────────────────────────────────┐
│ Step 1: 指令数据集构建 │
├─────────────────────────────────────────────────────────────┤
│ 种子指令 ──→ LLM生成更多指令 ──→ LLM生成对应输出 │
│ ↓ │
│ 文本标签 ──→ 模板转换 ──→ 指令-输出对 │
│ ↓ │
│ 合并所有数据 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Step 2: 指令微调 │
├─────────────────────────────────────────────────────────────┤
│ 输入合并后的数据集 │
│ ↓ │
│ 监督微调 (Supervised Finetuning) │
│ ↓ │
│ 得到微调后的LLM │
└─────────────────────────────────────────────────────────────┘📝 通俗解释:整个流程就像生产"教学材料":第一步是编写和生成练习题(指令+答案),第二步是把这些练习题给模型"做",让它学会回答问题。
三、Self-Instruct 篇
3.1 什么是 Self-Instruct?
Self-Instruct(发表于2022年12月)是一个通过预训练语言模型自己引导自己来提高指令遵循能力的框架。
📝 通俗解释:Self-Instruct的核心思想是"自己教自己"。就像学生看完课本后,自己给自己出题来做,这样可以用很少的"种子题目"(人工写的题目)作为起点,让AI生成成千上万道新题目。
3.2 Self-Instruct 处理思路
整体流程:
步骤1: 随机抽取8条种子指令 → LLM生成新指令
↓
步骤2: 判断新指令是否为分类任务
↓
是分类任务 → 先生成类别标签 → 生成输入
不是分类任务 → 先生成输入 → 生成输出
↓
步骤3: 生成完整的指令-输入-输出实例
↓
步骤4: 过滤和去重 → 最终得到52K条指令数据详细步骤:
步骤1:作者从175个种子任务中随机抽取8条自然语言指令作为示例,提示InstructGPT生成更多的任务指令。
步骤2:作者确定步骤1中生成的指令是否是一个分类任务。
- 如果是分类任务:要求 InstructGPT 根据给定的指令为输出生成所有可能的选项,并随机选择特定的输出类别,提示 InstructGPT 生成相应的"输入"内容。
- 如果是非分类任务:应该有无数的"输出"选项。作者提出了"输入优先"策略,首先提示 InstructGPT 根据给定的"指令"生成"输入",然后根据"指令"和生成的"输入"生成"输出"。
步骤3:基于第2步的结果,作者使用 InstructGPT 生成相应指令任务的"输入"和"输出",采用"输出优先"或"输入优先"的策略。
步骤4:作者对生成的指令任务进行了后处理(例如,过滤类似指令,去除输入输出的重复数据),最终得到52K条英文指令。
📝 通俗解释:这个方法巧妙之处在于:
- 先让AI看几个例子,学会"出题"的格式
- 区分"分类题"(如判断正误、选择类别)和"开放题"(如写作文、回答问题),用不同策略生成
- 最后去掉重复的、低质量的题目
四、Backtranslation(回译)篇
4.1 什么是 Backtranslation?
回译在传统的机器学习中是一种数据增强方法。比如:从中文翻译成英文,再从英文翻译回中文,这样生成的中文与原来的中文在语义上是一致的,但是文本不同。
然而,SFT数据生成的回译(发表于2023年8月)则是通过输出来生成指令,具体步骤如下:
┌──────────────────────────────────────────────────────────────┐
│ Step 0: 初始化 │
│ - 输入: 无标签数据 {y_i} │
│ - 基础模型: LLaMA │
│ - 种子数据: 小规模指令-输出对 │
└──────────────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────────┐
│ Step 1: Self-Augmentation(自增强) │
│ - 训练反向模型 M_yx 用于生成指令 │
│ - 生成增强数据: A := {x̂_i, y_i} │
│ - 用种子数据+增强数据训练指令模型 M_0 │
└──────────────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────────┐
│ Step 2: Self-Curation(自筛选) │
│ - 迭代选择高质量增强数据用于下一轮训练 │
│ - Iteration 1: M_0 → 选高质量子集 → 训练 M_1 │
│ - Iteration 2: M_1 → 选高质量子集 → 训练 M_2 │
└──────────────────────────────────────────────────────────────┘📝 通俗解释:这个方法的核心思路是"逆向思维":
- 传统方法:给一个指令,让AI生成回答
- 回译方法:给一个回答/文本,让AI反向推断"什么样的问题会得到这个回答"
就像英语老师在说"帮我写一个能引出这个答案的问题",这样可以从大量无标签文本中生成训练数据。
4.2 Backtranslation 效果
实验表明,使用Backtranslation方法训练的模型(称为Humpback)在不同数据规模下,相对于text-davinci-003的胜率表现优异:
- 数据规模 10²(100条):Humpback胜率约50%
- 数据规模 10³(1000条):Humpback胜率约55%
- 数据规模 10⁴(10000条):Humpback胜率约65%
📝 通俗解释:从实验结果可以看出,即使只用了很少的种子数据(100条),通过回译方法也能生成足够质量的训练数据让模型表现不错。而且数据量越大,效果越好。这说明Backtranslation是一种高效的数据增强方法。
总结
| 方法 | 核心思想 | 适用场景 |
|---|---|---|
| 人工标注 | 人工编写指令-输出对 | 垂直领域、高质量要求 |
| Self-Instruct | 用AI生成新指令,种子任务引导 | 大规模通用指令数据 |
| Backtranslation | 从输出反向生成指令 | 从无标签文本生成训练数据 |
📝 通俗解释:这三种方法各有优劣,实际应用中经常组合使用:
- 先用人工标注少量高质量种子数据
- 用Self-Instruct大规模扩展指令多样性
- 用Backtranslation从现有文本中挖掘更多训练数据
最终目标都是:用最低成本,生成最多高质量的"练习题",让大模型学会各种任务。