MokioMind 各训练阶段数据样本对比
本文基于当前已经下载到
MokioMind/dataset目录中的真实数据集,介绍预训练、SFT、LoRA、DPO、PPO、GRPO 和 Agent RL 各阶段的数据结构、训练目标与核心差异。
1. 总览
不同阶段最大的区别不是问题内容,而是数据为模型提供了什么监督信号。
| 阶段 | 数据告诉模型什么 | 主要文件 |
|---|---|---|
| Pretrain | 给定一段文本,预测下一个 Token | pretrain_t2t_mini.jsonl |
| SFT | 用户提出问题时,助手应该如何回答 | sft_t2t_mini.jsonl |
| LoRA | 与 SFT 相同,但只更新少量附加参数 | lora_*.jsonl |
| DPO | 同一个问题下,哪个回答更好 | dpo.jsonl |
| PPO | 只提供问题,模型在线回答并接受奖励 | rlaif.jsonl |
| GRPO | 同一问题生成多份回答,按组内奖励比较 | rlaif.jsonl |
| Agent RL | 提供问题、工具定义和可验证结果 | agent_rl*.jsonl |
最简记忆方式:
text
Pretrain:给模型一段文本
SFT:给模型一个标准答案
LoRA:用较少参数学习标准答案
DPO:给模型一个好答案和一个差答案
PPO:模型现场回答,由 Reward 和 Critic 判断
GRPO:模型现场回答多次,回答之间互相比较
Agent RL:模型调用工具,用标准结果或执行结果验证
2. 预训练 Pretrain
2.1 数据文件
text
dataset/pretrain_t2t_mini.jsonl
2.2 真实样本
jsonl
{"text":"为宠物起一个好听的名字1. 小白2. 子璇3. 小豆4. 柔柔5. 小花6. 小虎7. 小熊8. 小鲤9. 小黄10. 小狗"}
另一些预训练样本虽然内容看起来像问答,但依然被存储为普通文本:
jsonl
{"text":"根据以下输入的问题,生成一句话回答。你觉得寿司好不好吃?作为一名AI,我没有味觉,无法品尝食物......"}
2.3 训练目标
预训练只做 Next-Token Prediction:
text
输入:为宠物起一个好听的名
目标:字
输入:为宠物起一个好听的名字
目标:1
特点:
- 每条数据只有一个
text字段。 - 没有
user、assistant等角色。 - 几乎所有非 Padding Token 都参与 Loss。
- 模型学习语言规律、知识和文本续写能力。
- 即使文本语义上是问答,模型仍将它当作连续文本处理。
数据进入模型前会经历:
text
原始 text
↓ Tokenizer
截断至 max_seq_len - 2
↓
添加 BOS 和 EOS
↓
使用 PAD 补齐
↓
生成 input_ids、labels、attention_mask
3. 监督微调 SFT
3.1 数据文件
text
dataset/sft_t2t_mini.jsonl
3.2 真实样本
json
{
"conversations": [
{
"role": "user",
"content": "最近越来越多人关注健康饮食,但到底该吃什么、怎么搭配才科学?有没有什么实用的方法或工具能帮助我们更好地规划饮食?"
},
{
"role": "assistant",
"content": "健康饮食需遵循'均衡膳食'原则,建议每日摄入谷物、蔬菜、水果、蛋白质和乳制品。可使用饮食规划工具辅助记录和规划。"
}
]
}
3.3 多轮对话结构
json
{
"conversations": [
{
"role": "user",
"content": "什么是机器学习?"
},
{
"role": "assistant",
"content": "机器学习是让计算机从数据中学习规律的方法。"
},
{
"role": "user",
"content": "它如何训练?"
},
{
"role": "assistant",
"content": "通常使用损失函数、反向传播和优化器训练。"
}
]
}
3.4 训练目标
SFT 通常只对 Assistant 的回答计算 Loss:
text
System 内容 → 作为上下文,不计算 Loss
User 内容 → 作为上下文,不计算 Loss
Assistant 内容 → 作为标准答案,计算 Loss
Padding → 不计算 Loss
模型学习的是:
text
看到这样的用户问题
→ 应该生成这样的助手回答
部分实际样本还带有:
json
{
"role": "assistant",
"content": "最终回答",
"reasoning_content": "内部推理过程"
}
当前 MokioMind 主要读取 content;reasoning_content 是否参与训练,取决于 Chat Template 是否显式处理该字段。
4. LoRA 微调
LoRA 与全参数 SFT 使用相同的数据格式,区别只在参数更新方式。
4.1 身份 LoRA
数据文件:
text
dataset/lora_identity.jsonl
真实样本:
json
{
"conversations": [
{
"role": "user",
"content": "hi"
},
{
"role": "assistant",
"content": "Hello! I am MiniMind, an AI assistant developed by Jingyao Gong. How can I assist you today?"
}
]
}
它主要让模型学习固定身份、语气和表达风格。
4.2 考试 LoRA
数据文件:
text
dataset/lora_exam.jsonl
真实样本:
json
{
"conversations": [
{
"role": "user",
"content": "2型糖尿病的特点是____。\nA. 中老年病人多见,从不发生酮症\nB. 常以慢性并发症为首发症状\nC. 30岁前发病者往往症状严重\nD. 胰岛功能正常\n答案:"
},
{
"role": "assistant",
"content": "B"
}
]
}
4.3 医疗 LoRA
数据文件:
text
dataset/lora_medical.jsonl
真实结构:
json
{
"conversations": [
{
"role": "user",
"content": "头发稀少细软可以植发吗"
},
{
"role": "assistant",
"content": "是的,头发稀少和细软的情况下,植发是一种可能的解决方案......"
}
]
}
4.4 SFT 与 LoRA 的区别
| 全参数 SFT | LoRA |
|---|---|
| 更新模型的大部分或全部参数 | 冻结基础模型,只更新低秩矩阵 |
| 显存与存储开销较大 | 显存与存储开销较小 |
| 权重文件较大 | Adapter 权重较小 |
| 适合充分训练 | 适合身份、风格和领域定制 |
因此:
text
SFT 与 LoRA 的数据格式相同
区别在于训练参数,而不是数据结构
5. DPO 偏好训练
5.1 数据文件
text
dataset/dpo.jsonl
5.2 真实样本
json
{
"chosen": [
{
"role": "user",
"content": "章鱼的外壳是由什么构成的?"
},
{
"role": "assistant",
"content": "章鱼没有壳,这就是为什么它们能够挤进小空间。章鱼身体唯一坚硬的部分是它的喙。"
}
],
"rejected": [
{
"role": "user",
"content": "章鱼的外壳是由什么构成的?"
},
{
"role": "assistant",
"content": "章鱼的外壳由一种专门的蛋白质和壳聚糖构成......"
}
]
}
这里:
text
chosen → 正确回答
rejected → 包含虚构信息的错误回答
5.3 训练目标
text
提高 chosen 的相对概率
降低 rejected 的相对概率
同时避免策略模型偏离原始 SFT 模型太远
DPO 与 SFT 的区别:
text
SFT:问题 + 一个标准回答
DPO:同一个问题 + 一个好回答 + 一个差回答
DPO 训练时不需要调用 Reward Model,因为偏好标签已经通过 chosen 和 rejected 写在数据里。
不过,制作偏好数据时可能使用:
- 人工标注
- 强模型评审
- 规则筛选
- Reward Model 打分
6. PPO 强化学习
6.1 数据文件
text
dataset/rlaif.jsonl
6.2 真实样本
json
{
"conversations": [
{
"role": "user",
"content": "学校第一天运来3200千克煤,第二天运来2400千克煤。这些煤计划烧7个月,平均每个月烧煤多少千克?"
},
{
"role": "assistant",
"content": ""
}
]
}
最后一条 Assistant 故意留空,因为回答需要由模型在训练过程中在线生成。
模型可能生成:
text
总煤量为 3200 + 2400 = 5600 千克,
平均每月烧 5600 ÷ 7 = 800 千克。
6.3 PPO 训练流程
text
Prompt
↓
Actor 在线生成一份回答
↓
Reward Model 或规则给出实际奖励 Reward
↓
Critic 预测期望奖励 Value
↓
Advantage = Reward - Value
↓
更新 Actor 和 Critic
例如:
text
Reward = 0.9
Critic Value = 0.6
Advantage = 0.9 - 0.6 = +0.3
Advantage 为正时,提高该回答的生成概率;为负时,降低该回答的生成概率。
PPO 通常涉及:
- Actor
- Old Actor
- Reference Model
- Critic
- Reward Model 或规则奖励
这条真实数据没有独立参考答案字段,因此答案是否正确主要依赖外部 Reward Model 的判断。
7. GRPO 强化学习
MokioMind 的 GRPO 与 PPO 使用相同的 rlaif.jsonl 数据。
7.1 数据结构
json
{
"conversations": [
{
"role": "user",
"content": "学校第一天运来3200千克煤,第二天运来2400千克煤。这些煤计划烧7个月,平均每个月烧煤多少千克?"
},
{
"role": "assistant",
"content": ""
}
]
}
7.2 与 PPO 的区别
区别不在数据格式,而在训练时如何使用同一条数据。
PPO 通常生成一份回答:
text
回答:5600 ÷ 7 = 800 千克
Reward:0.9
Critic 预测:0.6
Advantage:+0.3
GRPO 针对同一个 Prompt 生成一组回答:
text
回答 1:800 千克 Reward 1.0
回答 2:700 千克 Reward 0.0
回答 3:约 800 千克 Reward 0.8
回答 4:5600 千克 Reward 0.1
......
然后计算:
text
Advantage_i =
(Reward_i - 组内平均 Reward)
÷
(组内 Reward 标准差 + 极小值)
因此:
text
高于组内平均分 → 提高生成概率
低于组内平均分 → 降低生成概率
PPO 和 GRPO 的核心区别:
| PPO | GRPO |
|---|---|
| 回答与 Critic 的预期比较 | 同一道题的多份回答互相比较 |
| 需要 Critic | 不需要 Critic |
| 通常生成一份或少量回答 | 通常生成一组回答 |
| 模型数量更多 | 生成开销更大 |
8. Agent RL 与可验证奖励
8.1 数据文件
text
dataset/agent_rl.jsonl
dataset/agent_rl_math.jsonl
8.2 真实数学样本
json
{
"conversations": [
{
"role": "system",
"content": "",
"tools": "[{\"function\":{\"name\":\"calculate_math\",\"description\":\"计算数学表达式的结果\"}}]"
},
{
"role": "user",
"content": "算算8**2"
},
{
"role": "assistant",
"content": ""
}
],
"gt": [
"64"
]
}
字段含义:
text
tools → 模型可以调用的工具
user → 需要解决的问题
assistant → 空字符串,等待模型在线生成
gt → Ground Truth,标准答案
可以构造以下奖励:
text
最终答案等于 64 → Reward +1.0
成功调用计算工具 → Reward +0.5
最终答案错误 → Reward 0
工具调用格式不合法 → Reward -0.2
这种奖励称为可验证奖励,不必额外训练神经网络 Reward Model,通常比开放式模型打分更加可靠。
8.3 当前兼容性限制
当前 MokioMind 的 RLAIFDataset 没有处理 gt 和 tools 字段,因此 agent_rl_math.jsonl 不能直接用于现有 PPO/GRPO 脚本。
要使用该数据,需要扩展:
RLAIFDataset- Chat Template 的工具定义注入
- 数学答案校验奖励
- 工具调用的执行逻辑
- 工具调用格式奖励
9. 同一道题在各阶段的结构
使用"8 的平方是多少"进行横向比较。
9.1 Pretrain
jsonl
{"text":"8的平方是64,因为8×8=64。"}
含义:让模型学习文本续写。
9.2 SFT / LoRA
json
{
"conversations": [
{
"role": "user",
"content": "8的平方是多少?"
},
{
"role": "assistant",
"content": "64"
}
]
}
含义:让模型模仿标准回答。
9.3 DPO
json
{
"chosen": [
{
"role": "user",
"content": "8的平方是多少?"
},
{
"role": "assistant",
"content": "64"
}
],
"rejected": [
{
"role": "user",
"content": "8的平方是多少?"
},
{
"role": "assistant",
"content": "16"
}
]
}
含义:让模型偏好正确回答,远离错误回答。
9.4 PPO
json
{
"conversations": [
{
"role": "user",
"content": "8的平方是多少?"
},
{
"role": "assistant",
"content": ""
}
]
}
含义:模型现场生成回答,由 Reward Model 和 Critic 提供训练信号。
9.5 GRPO
输入与 PPO 相同,但模型会生成多份回答:
text
64、16、8、64、32、64......
含义:对多份回答分别打分,然后进行组内相对比较。
9.6 Agent GRPO
json
{
"conversations": [
{
"role": "system",
"content": "",
"tools": "...calculate_math..."
},
{
"role": "user",
"content": "算算8**2"
},
{
"role": "assistant",
"content": ""
}
],
"gt": [
"64"
]
}
含义:模型可以调用工具,并直接用 gt 判断最终结果是否正确。
10. 最终总结
数据结构的演化
text
预训练
{"text": "原始文本"}
↓
SFT / LoRA
{"conversations": [问题, 标准回答]}
↓
DPO
{"chosen": [问题, 好回答], "rejected": [问题, 差回答]}
↓
PPO / GRPO
Prompt → 模型在线生成 → Reward
↓
Agent RL
Prompt + Tools → 模型在线生成/调用工具 → GT 或执行结果验证
监督信号的演化
text
Pretrain:下一个 Token
SFT / LoRA:标准 Assistant 回答
DPO:Chosen 相对于 Rejected 的偏好
PPO:Reward 减去 Critic Value
GRPO:回答 Reward 相对于组内平均 Reward
Agent RL:标准答案、单元测试或工具执行结果
理解每个字段最终如何转化为 input_ids、labels、loss_mask、reward 和 advantage,就理解了大模型不同训练阶段的数据设计与训练目标。