从零手搓大语言模型:强化学习对齐篇(DPO / GRPO / PPO)
本文为"从零手搓大语言模型"系列第 5 篇,系统梳理 LLM 后训练阶段的强化学习方法论与实现差异。
一、为什么需要强化学习对齐
SFT 让模型学会了对话,但"会说话"不等于"说得好"。模型可能:
- 生成不安全/有害内容
- 回答冗长无重点
- 在多种合理回答中缺乏偏好导向
强化学习对齐的目标是让模型生成更符合人类偏好的回答——更安全、更有帮助、更简洁。
二、三种主流方法的对比
| 维度 | DPO | GRPO | PPO |
|---|---|---|---|
| 全称 | Direct Preference Optimization | Group Relative Policy Optimization | Proximal Policy Optimization |
| 是否需要奖励模型 | 否 | 否 | 是 |
| 数据来源 | 人工标注的好坏回答对 | 模型自己生成多个回答 | 模型生成 + 奖励模型打分 |
| 探索能力 | 无(静态数据) | 有(在线采样) | 有(在线采样) |
| 实现复杂度 | 低 | 中 | 高 |
| 训练稳定性 | 高 | 较高 | 低(超参敏感) |
| 代表应用 | Llama 2, Zephyr | DeepSeek-R1 | ChatGPT(早期) |
三、DPO:直接偏好优化
3.1 核心思想
跳过奖励模型训练,直接从偏好数据中学习。给定同一问题的两个回答(chosen 和 rejected),让模型更倾向于生成 chosen。
3.2 数据格式
{
"chosen": [
{"role": "user", "content": "如何学编程"},
{"role": "assistant", "content": "建议从 Python 入手,循序渐进..."}
],
"rejected": [
{"role": "user", "content": "如何学编程"},
{"role": "assistant", "content": "编程很简单啊随便学学就会了"}
]
}
3.3 训练架构
DPO 需要两个模型同时存在:
model, _ = init_model(config, 'full_sft') # 策略模型(正在训练)
ref_model, _ = init_model(config, 'full_sft') # 参考模型(冻结不动)
ref_model.requires_grad_(False)
两者初始权重相同,但只有策略模型会被更新。参考模型作为"基准线",防止策略模型偏离原始行为过远。
3.4 Loss 计算
# 策略模型对好/坏回答的概率比
pi_logratios = chosen_policy_log_probs - reject_policy_log_probs
# 参考模型对好/坏回答的概率比
ref_logratios = chosen_ref_log_probs - reject_ref_log_probs
# DPO loss:让策略模型的偏好程度超过参考模型
loss = -logsigmoid(beta * (pi_logratios - ref_logratios))
直观理解:策略模型相对于参考模型更加偏好 chosen 回答时,loss 下降;否则 loss 上升。beta(=0.15)控制允许偏离参考模型的程度。
3.5 超参数特点
学习率极低(4e-8,比 SFT 小 250 倍),仅对偏好方向做微小调整,避免遗忘已有能力。
四、GRPO:组内相对策略优化
4.1 核心思想
不依赖外部标注数据,让模型对同一 prompt 生成多个回答,组内排名后自我改进。
4.2 流程
1. 给定 prompt:"解释什么是机器学习"
2. 模型生成 N=8 个不同回答(通过采样)
3. 对每个回答用规则/AI 打分(如:流畅度、准确性、格式)
4. 计算组内优势值:高分回答 → 正优势,低分回答 → 负优势
5. 用 PPO 风格的策略梯度更新模型
4.3 与 DPO 的本质区别
DPO 从外部数据学习偏好(被动),GRPO 从自身生成中学习(主动探索)。模型的好坏对比标准不是人给的静态数据,而是自己当前能力下的相对排名。
4.4 奖励函数设计
MiniMind 中 GRPO 的奖励信号来源于自动化规则:
- 文本长度是否合理
- 是否包含重复片段
- 数学题是否答对(可验证场景)
- 格式是否正确
这类自动化反馈称为 RLAIF(RL from AI Feedback),区别于依赖人类标注的 RLHF。
五、PPO:近端策略优化
5.1 核心思想
训练一个独立的奖励模型(Reward Model),然后用强化学习(PPO 算法)让策略模型最大化奖励。
5.2 系统组成
PPO 训练时需要 4 个模型/组件同时工作:
| 组件 | 作用 |
|---|---|
| 策略模型(Actor) | 正在训练的生成模型 |
| 参考模型(Reference) | 冻结的基准模型,防止偏离 |
| 奖励模型(Reward Model) | 对生成结果打分 |
| 价值模型(Critic) | 预估每个状态的期望回报 |
5.3 复杂度分析
PPO 的工程复杂度最高:需要维护多个模型、处理异步采样、平衡探索与利用、调节多组超参数(clip ratio, GAE lambda, KL penalty 等)。但其理论上限也最高。
六、Agentic RL:多轮工具调用强化
MiniMind 还提供了 train_agent.py,将 GRPO 扩展到多轮 Tool Use 场景:
Prompt → 模型决定是否调用工具 → 调用工具 → 获取结果 → 继续回答
└── 奖励信号:最终结果是否正确(由 ground truth 校验)
模型需要学会"何时调工具、调哪个工具、传什么参数",这是 RLAIF 在 Agent 场景的自然延伸。
七、训练全流程回顾
随机初始化
│
▼ Pretrain(学语言规律,lr=5e-4)
│
▼ SFT(学对话格式,lr=1e-5)
│
├── LoRA(可选:领域适配,仅训 1.5% 参数)
│
▼ DPO/GRPO/PPO(对齐人类偏好,lr=4e-8 ~ 1e-6)
│
▼ 可部署的对话模型
每个阶段的学习率递减,反映了"知识越丰富,调整应越审慎"的原则。
八、实践建议
- 入门建议:先跑 DPO(实现最简单),再研究 GRPO(理解在线采样),最后看 PPO
- 小模型限制:64M 参数的模型在强化学习阶段的效果提升有限,偏好对齐在百亿级模型上效果更显著
- 数据质量:DPO 的效果高度依赖偏好数据质量;GRPO 的效果取决于奖励函数的设计
- 训练稳定性:DPO > GRPO > PPO,工程实现难度也是如此
九、小结
强化学习对齐是 LLM 从"能说话"到"说好话"的关键一步。三种方法各有取舍:DPO 最简单但缺乏探索,PPO 最强大但最难调,GRPO 是实用的折中方案。在 DeepSeek-R1 验证了 GRPO 在推理能力训练中的有效性后,GRPO 正成为业界越来越主流的选择。
系列总结
本系列 5 篇文章覆盖了大语言模型从零训练的完整流程:
| 篇目 | 主题 | 核心内容 |
|---|---|---|
| 第 1 篇 | 模型结构 | Transformer Decoder-Only、RoPE、GQA、SwiGLU、RMSNorm |
| 第 2 篇 | 数据处理与预训练 | Tokenizer、数据格式、训练循环、混合精度 |
| 第 3 篇 | 有监督微调 | Chat Template、对话格式、loss mask、超参差异 |
| 第 4 篇 | LoRA 微调 | 低秩分解、参数冻结、动态注入、权重合并 |
| 第 5 篇 | 强化学习对齐 | DPO、GRPO、PPO 原理与实现对比 |
模型的本质是参数矩阵,训练的本质是将随机数值调整为能准确预测下一个 token 的有意义数值。全部核心算法均可使用 PyTorch 原生实现,不依赖第三方高层封装。理解每一行代码的含义,是深入理解大语言模型内部机制的必经之路。
更多推荐


所有评论(0)