5.指令微调与对齐
指令微调和对齐是让大语言模型从"续写文本"转变为"遵循指令"的关键技术。本章介绍如何让模型学会理解和执行人类指令,并输出符合人类偏好的回答。
# 5.1 指令微调(Instruction Tuning)
# 5.1.1 什么是指令微调
预训练模型的目标是预测下一个词,它擅长续写文本,但不擅长回答问题:
用户输入:中国的首都是哪里?
预训练模型:中国的首都是哪里?这是一个常见的地理问题...(继续续写)
指令微调后:北京是中国的首都。
1
2
3
2
3
指令微调通过在指令-响应格式的数据上训练,让模型学会:
- 理解用户意图
- 按照指令执行任务
- 生成有用的回答
# 5.1.2 指令数据格式
基础格式
{
"instruction": "将以下句子翻译成英文",
"input": "今天天气很好",
"output": "The weather is nice today."
}
1
2
3
4
5
2
3
4
5
对话格式
{
"messages": [
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": "什么是机器学习?"},
{"role": "assistant", "content": "机器学习是人工智能的一个分支..."}
]
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 5.1.3 指令数据的多样性
高质量的指令数据应该覆盖多种任务类型:
| 任务类型 | 示例 |
|---|---|
| 问答 | 回答关于事实、概念的问题 |
| 生成 | 写文章、故事、代码 |
| 改写 | 翻译、摘要、风格转换 |
| 分析 | 情感分析、分类、提取信息 |
| 推理 | 数学计算、逻辑推理 |
| 对话 | 多轮交互、角色扮演 |
# 5.1.4 SFT 的训练目标
监督微调(Supervised Fine-Tuning, SFT)的目标是最大化正确输出的概率:
L_SFT = -∑ log P(y_i | x, y_<i)
1
通常只对输出部分计算损失,忽略指令部分,让模型只学习"如何回答"。
# 5.2 人类反馈强化学习(RLHF)
# 5.2.1 为什么需要 RLHF
SFT 让模型学会遵循指令,但可能存在问题:
- 输出不够有帮助
- 包含有害或偏见内容
- 风格不符合预期
RLHF 通过人类反馈进一步优化模型,使其输出更符合人类偏好。
# 5.2.2 RLHF 的三个阶段
阶段一:监督微调(SFT)
在指令数据上进行监督微调,得到初始策略模型。
阶段二:训练奖励模型(RM)
- 收集人类偏好数据:对同一问题的多个回答进行排序
- 训练奖励模型:学习预测人类偏好
人类标注:回答A > 回答B > 回答C
奖励模型学习:score(A) > score(B) > score(C)
1
2
2
阶段三:强化学习优化(PPO)
使用 PPO 算法,根据奖励模型的反馈优化策略模型:
目标:最大化奖励,同时不偏离 SFT 模型太远
L = E[R(x, y)] - β · KL(π || π_SFT)
1
2
3
2
3
# 5.2.3 RLHF 的挑战
| 挑战 | 描述 |
|---|---|
| 标注成本高 | 需要大量人类标注偏好数据 |
| 训练不稳定 | 强化学习训练容易不稳定 |
| 奖励黑客 | 模型可能找到欺骗奖励模型的方式 |
| 实现复杂 | 需要同时维护多个模型 |
# 5.3 直接偏好优化(DPO)
# 5.3.1 DPO 的动机
DPO(Direct Preference Optimization)简化了 RLHF 流程,无需训练奖励模型和使用强化学习。
RLHF:SFT → 训练 RM → PPO 优化
DPO: SFT → 直接优化
1
2
2
# 5.3.2 DPO 原理
DPO 将奖励函数重参数化,直接用策略模型表示,将偏好优化转化为一个简单的分类问题:
L_DPO = -E[log σ(β · log(π(y_w|x)/π_ref(y_w|x)) - β · log(π(y_l|x)/π_ref(y_l|x)))]
1
其中:
- y_w:偏好的回答(chosen)
- y_l:不偏好的回答(rejected)
- π_ref:参考模型(通常是 SFT 模型)
# 5.3.3 DPO 数据格式
DPO 需要成对的偏好数据:
{
"prompt": "如何学习编程?",
"chosen": "学习编程可以从以下几个步骤开始:1. 选择一门语言...",
"rejected": "编程很难学,你可能学不会。"
}
1
2
3
4
5
2
3
4
5
# 5.3.4 DPO vs RLHF
| 特性 | RLHF | DPO |
|---|---|---|
| 训练流程 | 复杂(需要 RM + PPO) | 简单(直接优化) |
| 稳定性 | 较差 | 较好 |
| 计算成本 | 高 | 低 |
| 实现难度 | 高 | 低 |
# 5.4 其他对齐方法
# 5.4.1 ORPO
ORPO(Odds Ratio Preference Optimization)将 SFT 和偏好优化合并为一个阶段,无需单独的 SFT 步骤。
# 5.4.2 SimPO
SimPO(Simple Preference Optimization)进一步简化 DPO,不需要参考模型。
# 5.4.3 KTO
KTO(Kahneman-Tversky Optimization)基于前景理论,只需要二元反馈(好/坏),不需要成对比较:
{"prompt": "...", "completion": "...", "label": true} // 好的回答
{"prompt": "...", "completion": "...", "label": false} // 坏的回答
1
2
2
# 5.5 对齐的评估
# 5.5.1 评估维度
| 维度 | 说明 |
|---|---|
| 有帮助性 | 回答是否解决了用户问题 |
| 真实性 | 信息是否准确 |
| 无害性 | 是否包含有害内容 |
| 流畅性 | 语言是否自然流畅 |
# 5.5.2 常用基准
- MT-Bench:多轮对话能力评估
- AlpacaEval:指令遵循能力评估
- TruthfulQA:真实性评估
# 5.6 最佳实践
# 5.6.1 训练流程
预训练模型 → SFT(指令微调) → 偏好对齐(DPO/RLHF) → 评估与迭代
1
# 5.6.2 数据质量要点
SFT 数据:
- 指令清晰、多样
- 回答准确、完整
- 覆盖目标任务场景
偏好数据:
- chosen 和 rejected 差异明显
- 标注一致性高
- 覆盖常见的偏好维度
# 5.6.3 常见问题
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 模型不遵循指令 | SFT 数据不足 | 增加高质量指令数据 |
| 回答过于冗长 | 训练数据偏长 | 加入简洁回答的样本 |
| 输出有害内容 | 缺少安全对齐 | 加入安全相关的偏好数据 |
编辑 (opens new window)
上次更新: 2025/12/19, 15:17:48