07-强化学习对齐RLHF
阶段 7:强化学习对齐(RLHF / RLAIF)
教学目标
- 理解强化学习在 LLM 对齐中的作用和必要性
- 掌握 RL 统一框架,理解 DPO、PPO、GRPO、CISPO 的本质区别
- 深入理解每个算法的损失函数和训练流程
- 了解 Agentic RL(多轮 Tool-Use 强化学习)的设计
- 能够运行至少一种 RL 对齐训练并分析效果
课时安排
- 理论讲解:2.5 课时(RL 框架 + 各算法原理 + Agentic RL)
- 训练实验:1.5 课时(运行 DPO/GRPO + 效果对比)
7.1 为什么需要强化学习对齐?
7.1.1 SFT 的局限性
SFT 后的模型虽然学会了"回答问题",但存在以下问题:
| 问题 | 示例 |
|---|---|
| 回答可能不准确 | 虚假信息、事实错误 |
| 可能产生有害内容 | 偏见、歧视、危险建议 |
| 可能过于冗长 | 不必要的重复和啰嗦 |
| 可能不一致 | 同一问题不同次回答差异大 |
| 可能不符合人类偏好 | 虽然语法正确但"不是用户想要的" |
7.1.2 RLHF/RLAIF 的目标
SFT 后: 模型能回答问题,但质量参差不齐 RLHF/RLAIF 后: 模型学会"区分好坏",倾向于生成高质量回答 核心变化: 从"模仿训练数据中的回答" → 到"优化人类偏好的奖励信号"7.1.3 RLHF vs RLAIF
| 方式 | 奖励来源 | 代表模型 | MiniMind 使用 |
|---|---|---|---|
| RLHF | 人类标注者打分 | InstructGPT, ChatGPT | ❌ |
| RLAIF | AI 模型自动打分 | MiniMind | ✅ |
MiniMind 使用RLAIF(AI 反馈的强化学习),因为:
- 无需人类标注,成本更低
- 可重复、可扩展
- 适合教学场景
7.2 RL 统一框架
7.2.1 核心公式
MiniMind 将所有偏好优化(PO)算法统一为一个框架:
J_PO = E[ f(r_t) · g(A_t) - h(KL_t) ]其中三个组件:
- 策略项f(r_t):基于奖励的函数(控制策略更新方向)
- 优势项g(A_t):基于优势的函数(控制更新幅度和方向)
- 正则项h(KL_t):KL 散度惩罚(防止策略偏离太远)
7.2.2 四种算法的对比
| 算法 | 策略项 f® | 优势项 g(A) | 正则项 h(KL) | 训练模型数 | 训练复杂度 |
|---|---|---|---|---|---|
| DPO | log π_w / π_l | 无显式优势项 | 隐含在 β 中 | 1 | 最低 |
| PPO | min(r, clip®) | R - V(s) | β·E[KL] | 2(Actor + Critic) | 最高 |
| GRPO | min(r, clip®) | (R-μ)/σ 组内归一化 | β·KL_t | 1 | 中等 |
| CISPO | clip(r,0,ε)·A·log π | (R-μ)/σ | β·KL_t | 1 | 中等 |
7.2.3 算法选择指南
资源充足 + 追求效果 → PPO 资源有限 + 追求效率 → DPO 最新主流 + 效果平衡 → GRPO / CISPO 简单快速 + 原型验证 → DPO7.3 DPO(Direct Preference Optimization)
7.3.1 核心思想
DPO 绕过了传统的"训练奖励模型 → 强化学习优化"两阶段流程,直接用偏好对数据进行优化。
传统 RLHF: 偏好数据 → 训练奖励模型 → PPO 优化 DPO: 偏好数据 → 直接优化策略7.3.2 DPO 数据格式
{"chosen":[{"role":"user","content":"请解释什么是机器学习"},{"role":"assistant","content":"机器学习是人工智能的一个分支,它使计算机能够从数据中学习模式和规律,而不需要被明确编程。常见的方法包括监督学习、无监督学习和强化学习。"}],"rejected":[{"role":"user","content":"请解释什么是机器学习"},{"role":"assistant","content":"机器学习就是一种学习的方法。它让机器自己学习。具体我也不知道怎么说。"}]}7.3.3 DPO 损失函数
L_DPO = -E[ log σ(β · (log π_θ(y_w|x) - log π_ref(y_w|x) - log π_θ(y_l|x) + log π_ref(y_l|x))) ] 简化理解: L_DPO = -E[ log σ(β · (logit(好回答) - logit(坏回答)) ) ] 目标: 最大化好回答的对数概率,最小化坏回答的对数概率 β 控制对参考策略的偏离程度7.3.4 DPO 训练
cdminimind/trainer python train_dpo.py输出:out/dpo_768.pth
7.4 PPO(Proximal Policy Optimization)
7.4.1 核心思想
PPO 是经典的强化学习算法,通过奖励模型(在 MiniMind 中由 AI 扮演)给模型输出打分,然后优化策略最大化奖励。
7.4.2 PPO 训练流程
┌──────────────────────────────────────────────────┐ │ PPO 训练循环 │ │ │ │ 1. 从当前策略生成回答 y │ │ π_θ(y|x) → y │ │ │ │ 2. 使用奖励模型/AI 评分 │ │ R(y, x) → r │ │ │ │ 3. 使用 Critic 网络估计价值 │ │ V(x) → v │ │ │ │ 4. 计算优势函数 │ │ A = r - v │ │ │ │ 5. 计算 PPO Clip 损失 │ │ r_t = π_new(y|x) / π_old(y|x) │ │ L = -min(r_t·A, clip(r_t, 1-ε, 1+ε)·A) + β·KL│ │ │ │ 6. 更新 Actor 和 Critic 网络 │ └──────────────────────────────────────────────────┘7.4.3 PPO 代码核心
# 简化的 PPO 损失计算defppo_loss(new_log_probs,old_log_probs,advantages,beta=0.1,epsilon=0.2):# 重要性采样比率ratio=torch.exp(new_log_probs-old_log_probs)# PPO Clip 损失surr1=ratio*advantages surr2=torch.clamp(ratio,1-epsilon,1+epsilon)*advantages policy_loss=-torch.min(surr1,surr2).mean()# KL 散度惩罚kl_div=(new_log_probs-old_log_probs).mean()total_loss=policy_loss+beta*kl_divreturntotal_loss7.4.4 PPO 训练
cdminimind/trainer python train_ppo.py输出:out/ppo_actor_768.pth(Actor 模型)+out/ppo_critic_768.pth(Critic 模型)
7.5 GRPO / CISPO
7.5.1 GRPO(Group Relative Policy Optimization)
GRPO 是 DeepSeek 提出的优化算法,核心创新是组内归一化替代 Critic 网络:
PPO: 需要 Critic 网络 V(x) 来估计基线 GRPO: 用同组采样的平均奖励作为基线 组内归一化优势: A_i = (R_i - mean(R_group)) / std(R_group) 其中: R_group = 同一个 prompt 采样 G 个回答的奖励集合 R_i = 第 i 个回答的奖励优势:
- 不需要训练 Critic 网络(节省一半模型)
- 组内归一化自动适应不同难度的 prompt
7.5.2 CISPO(Conervative ISPO)
CISPO 是 GRPO 的保守变体,通过额外的裁剪操作进一步稳定训练:
CISPO 的策略项: clip(ratio, 0, ε) · A · log π_θ(y|x) 与 GRPO 的区别: GRPO: min(ratio, clip(ratio, 1-ε, 1+ε)) · A CISPO: clip(ratio, 0, ε) · A · log π_θ(y|x)7.5.3 GRPO / CISPO 训练
cdminimind/trainer# GRPO 训练python train_grpo.py--loss_typegrpo# CISPO 训练(修改 loss_type 即可)python train_grpo.py--loss_typecispo输出:out/grpo_768.pth
7.5.4 GRPO 与 DPO/PPO 的对比
| 维度 | DPO | PPO | GRPO/CISPO |
|---|---|---|---|
| 训练模型数 | 1 | 2 | 1 |
| 需要 Critic | 否 | 是 | 否(组内归一化) |
| 需要偏好对 | 是 | 否(需要奖励模型) | 否(需要奖励函数) |
| 训练稳定性 | 高 | 中 | 中-高 |
| 效果 | 好 | 好(数据充足时) | 好(DeepSeek 验证) |
| MiniMind 推荐 | ✅ 快速验证 | ✅ 效果上限高 | ✅ 最新主流 |
7.6 Agentic RL(多轮 Tool-Use 强化学习)
7.6.1 什么是 Agentic RL?
Agentic RL 将强化学习扩展到多轮工具调用场景,训练模型学会:
- 何时使用工具
- 选择哪个工具
- 如何组织工具调用序列
- 如何整合工具结果给出最终回答
7.6.2 训练流程
┌──────────────────────────────────────────────┐ │ Agentic RL 训练 │ │ │ │ 1. 给定一个需要工具的问题 │ │ "计算 (123 + 456) × 789 / 3" │ │ │ │ 2. 模型生成多轮动作 │ │ Round 1: 调用计算器 → 123+456=579 │ │ Round 2: 调用计算器 → 579×789=456,831 │ │ Round 3: 调用计算器 → 456831/3=152,277 │ │ Round 4: 给出最终回答 → "结果是 152,277" │ │ │ │ 3. 计算综合奖励 │ │ R = R_answer + R_tool + R_format - R_unfin │ │ │ │ 4. 使用 CISPO 优化策略 │ └──────────────────────────────────────────────┘7.6.3 奖励函数设计
R(τ) = R_answer + R_tool + R_format + R_rm - R_unfinished 其中: R_answer : 最终答案是否正确(0 或 1) R_tool : 工具调用是否正确(0 或 1) R_format : 输出格式是否符合要求(0 或 1) R_rm : 推理过程中的推理步骤质量 R_unfinished: 未完成时惩罚(0 或 -1)7.6.4 Agentic RL 训练
cdminimind/trainer# 基本训练python train_agent.py# 使用 SGLang 作为 rollout 引擎(更快)python train_agent.py--rollout_enginesglang--sglang_base_urlhttp://localhost:8998输出:out/agent_768.pth
7.6.5 效果对比
MiniMind 官方评测(数学 Tool Use 任务,20 题):
| 模型 | 正确率 |
|---|---|
| minimind-3 full_sft | 12/20 =60% |
| minimind-3 agent (CISPO) | 17/20 =85% |
Agentic RL 将数学工具调用的正确率从 60% 提升到 85%,提升了25 个百分点。
7.7 数据集
7.7.1 RLAIF 数据集
| 文件 | 大小 | 用途 |
|---|---|---|
rlaif.jsonl | 24MB | PPO/GRPO/CISPO 训练 |
dpo.jsonl | 53MB | DPO 偏好对齐训练 |
agent_rl.jsonl | 86MB | Agentic RL 训练 |
agent_rl_math.jsonl | 18MB | 数学推理 Agent 训练 |
7.7.2 下载
modelscope download--modelgongjy/minimind_dataset\--include"dpo.jsonl"\--include"rlaif.jsonl"\--include"agent_rl.jsonl"\--local_dir./dataset实践任务
任务 7.1:DPO 训练(必做)
- 下载 DPO 数据集
- 运行 DPO 训练
- 对比 DPO 前(SFT)和 DPO 后的回答质量
cdtrainer&&python train_dpo.pycd..&&python eval_llm.py--load_from./out/dpo_768.pth测试问题建议:
- “用三步解释什么是深度学习”
- “Python 的列表和元组有什么区别?”
- “写一个判断质数的函数”
任务 7.2:RL 算法对比(选做)
运行多种 RL 算法,对比效果:
# DPOpython train_dpo.py# GRPOpython train_grpo.py--loss_typegrpo# CISPOpython train_grpo.py--loss_typecispo| 算法 | 训练 Loss | 训练时间 | 回答质量(主观评分 1-5) |
|---|---|---|---|
| DPO | |||
| GRPO | |||
| CISPO |
任务 7.3:DPO 数据分析(选做)
# 分析 DPO 偏好对数据importjson chosen_lengths=[]rejected_lengths=[]withopen('dataset/dpo.jsonl','r',encoding='utf-8')asf:forlineinf:data=json.loads(line)chosen_text=' '.join(msg['content']formsgindata['chosen'])rejected_text=' '.join(msg['content']formsgindata['rejected'])chosen_lengths.append(len(chosen_text))rejected_lengths.append(len(rejected_text))print(f"Chosen 平均长度:{sum(chosen_lengths)/len(chosen_lengths):.0f}字符")print(f"Rejected 平均长度:{sum(rejected_lengths)/len(rejected_lengths):.0f}字符")print(f"数据总量:{len(chosen_lengths)}对")# 分析好回答和坏回答的长度差异# 通常好回答更长、更完整任务 7.4:Agentic RL 测试(选做)
# 运行 Agentic RL 训练(需要 SGLang 后端)python train_agent.py--rollout_enginesglang--sglang_base_urlhttp://localhost:8998# 测试工具调用能力python eval_toolcall.py--weightagent挑战任务(选做)
- 设计自己的奖励函数,修改 Agentic RL 的奖励计算逻辑
- 对比不同 RL 算法在特定任务(如数学推理、代码生成)上的表现差异
下一阶段预告
在阶段 8 中,我们将学习模型部署与应用。将训练好的 MiniMind 模型部署为 OpenAI 兼容的 API 服务,集成到 vLLM、ollama 等推理框架,并接入 FastGPT、Dify 等 RAG 应用。
