聊天机器人训练数据集分解 | AI生成和翻译
问题: 请解释这个 SFT 数据混合以及像 <|user_start|>、<|user_end|>、<|assistant_start|> 和 <|assistant_end|> 这样的特殊 token。
答案:
该表格描述了用于训练预训练语言模型使其具备聊天机器人行为的监督微调(SFT) 数据集。在预训练(在大规模文本上预测下一个 token)之后,模型会在高质量的指令-回复样本上进行微调。
该 SFT 数据集总计包含 1,071,759 个对话样本。
| 数据集 | 行数 | 包含原因 |
|---|---|---|
| SmolTalk | 460K | 通用对话、问答、助手的辅助行为 |
| MMLU ×3 | 300K | 逻辑推理和知识类问题 |
| SimpleSpelling | 200K | 学习拼写纠正 |
| SpellingBee | 80K | 统计单词中的字母个数(LLM 常感困难的任务) |
| GSM8K ×4 | 32K | 小学数学应用题 |
| Identity | 1K | 让模型知道自己的名字、创建者和角色 |
| 自定义代码 + SEC | 1K | 专业编程以及 SEC/金融类对话 |
让我们逐一分析。
1. SmolTalk (460K)
这是占比最大的一部分。
它包含普通的聊天机器人对话,例如:
用户:解释一下递归。
助手:递归是指函数调用自身...
模型学习:
- 回答问题
- 维持对话
- 保持礼貌
- 遵循指令
- 适当地拒绝不安全请求
这主要将语言模型转变为聊天机器人。
2. MMLU ×3 (300K)
MMLU 代表大规模多任务语言理解(Massive Multitask Language Understanding)。
它包含多项选择题,例如:
问题:
哪颗行星离太阳最近?
A. 金星
B. 水星
C. 地球
D. 火星
正确答案:
B. 水星
×3 通常意味着数据集被重复或扩充了三次,以便在训练中产生更大影响。
如果不重复,模型可能没有足够的更新次数来学习推理任务。
3. SimpleSpelling (200K)
例子:
用户:
纠正这个拼写:
recieve
助手:
receive
或
纠正:
acomodation
助手:
accommodation
这提高了拼写准确性。
4. SpellingBee (80K)
此数据集教授字母计数。
例子:
用户:
"strawberry" 中有几个字母 r?
助手:
3
这看起来简单,但基于 token 的语言模型历来在这方面表现不佳,因为它们基于 token(而非单个字符)进行推理。
专门的训练样本有助于提高这种能力。
5. GSM8K ×4 (32K)
GSM8K 是一个知名的小学数学问题数据集。
例子:
Tom 有 5 个苹果。
他又买了 3 个。
他现在有多少个苹果?
答案:
8
同样,×4 表示他们对数据集进行了过采样,以在训练中赋予数学问题更大的权重。
6. Identity (1K)
这教会助手其身份。
例子:
是谁创造了你?
我是由 X 公司创造的。
或
你是什么模型?
我是 XYZ-7B。
没有这些示例,模型的回答可能会不一致。
7. 自定义代码 + SEC (1K)
这些是人工整理的对话。
例如:
编程:
用 Python 写一个二分查找。
金融:
解释一下 SEC 10-K 年报。
虽然只有 1,000 个示例,但它们通常是高质量的,并且是根据项目目标定制的。
为什么要混合多个数据集?
每个数据集教授一种不同的能力。
| 数据集 | 学习到的技能 |
|---|---|
| SmolTalk | 对话能力 |
| MMLU | 推理能力 |
| GSM8K | 数学能力 |
| SimpleSpelling | 拼写能力 |
| SpellingBee | 字符计数能力 |
| Identity | 角色一致性 |
| 自定义数据集 | 领域专业知识 |
通过不依赖单一数据集,模型在多项技能上变得更强。
这些特殊 token 是什么?
<|user_start|>
<|user_end|>
<|assistant_start|>
<|assistant_end|>
这些是插入到训练文本中用于标记谁在说话的特殊控制 token。
例如,一个对话会被转换成连续的 token 序列:
<|user_start|>
什么是 Python?
<|user_end|>
<|assistant_start|>
Python 是一种编程语言。
<|assistant_end|>
模型看到的不是独立的“消息”。它只看到一串连续的 token。
这些特殊 token 告诉它:
- 用户消息从哪里开始
- 用户消息在哪里结束
- 助手应该从哪里开始回复
- 助手的回复在哪里结束
SFT 训练如何工作
假设一个训练示例是:
<|user_start|>
将 "hello" 翻译成法语。
<|user_end|>
<|assistant_start|>
Bonjour。
<|assistant_end|>
在 SFT 期间:
- 整个对话被输入到 transformer。
- 损失通常仅在助手的 token(
Bonjour。和结束标记)上计算。 - 用户的 token 提供上下文,但在训练损失中被掩盖。
概念上:
输入:
<用户> 将 "hello" 翻译成法语。
目标:
Bonjour。
这教会模型根据先前的对话生成助手的回复。
与预训练的关系
预训练使用纯文本,例如:
法国的首都是巴黎。
并训练模型在任何位置预测下一个 token。
而 SFT 使用结构化的对话:
<|user_start|>
解释注意力机制。
<|user_end|>
<|assistant_start|>
注意力机制让每个 token 可以选择性地关注其他 token...
<|assistant_end|>
目标仍然是下一个 token 预测,但现在模型学习的模式是:
用户消息 → 助手回复
而不仅仅是继续任意的互联网文本。
这就是为什么 SFT 是将通用语言模型转变为遵循指令的对话式助手的阶段。
