DPO vs GRPO 机理 (Unsloth GRPO guide)
前三天(Day 101-103)把后训练地图、GRPO 优化器、RLVR 奖励都打通了,全是「纸面 + 确定性数学」。今天做两件事:一是把 DPO vs GRPO 的权衡讲透——为什么有了 DPO 还需要 GRPO;二是第一次碰真实训练运行时,用 Unsloth 的 LoRA+GRPO 流水线在单卡上加载 Qwen3-4B 跑一个冒烟。这是 B1→B18 曲线上从「能讲清训练」迈向「真的能跑起来」
阶段: B11 · GRPO/后训练机理 + 首跑(Day 101-110) 标签: #dpo #grpo #lora #unsloth
今日导引(由浅入深)
前三天(Day 101-103)把后训练地图、GRPO 优化器、RLVR 奖励都打通了,全是「纸面 + 确定性数学」。今天做两件事:一是把 DPO vs GRPO 的权衡讲透——为什么有了 DPO 还需要 GRPO;二是第一次碰真实训练运行时,用 Unsloth 的 LoRA+GRPO 流水线在单卡上加载 Qwen3-4B 跑一个冒烟。这是 B1→B18 曲线上从「能讲清训练」迈向「真的能跑起来」的第一步——但本仓不含训练运行时,所以今天的产出诚实地标为待 GPU。今天的「最小可判定产出」:Unsloth 环境 smoke-test 通过 + 1 条 base 模型生成样例(待 GPU)。
定位提醒:Day 101-103 是「机理 + 确定性内核」(无 GPU 可全完成),Day 104 是「环境冒烟」(待 GPU),Day 105 又回到「确定性 reward 设计」(无 GPU 可完成),Day 107-108/110 才是真训练(待 GPU)。所以本 block 的产出被自然切成「可立即完成的确定性部分」与「待 GPU 的训练部分」两类——诚实标注两者是这套笔记的底线。
1. 机理精读
DPO 与 GRPO 是后训练里两条不同的路,差异集中在「要不要在线采样」。 这决定了吞吐、显存、探索能力三者的取舍。
DPO(直接偏好优化):无采样、无显式奖励。 DPO 拿成对偏好数据「优答 y_w > 劣答 y_l」,通过一个闭式损失直接优化隐式 reward model——它不在线生成新样本,只在已有偏好对上做监督式梯度下降。后果是:吞吐高、显存低、训练稳(本质是带 reference 的分类损失),但只能学已有偏好排序里的信息,无法探索偏好对没覆盖的新策略。如果你的偏好数据里没有「更好的解法」,DPO 永远学不到它。
GRPO:在线采样、显式 group reward。 GRPO 对每个 prompt 在线采样 G 个 rollout,用确定性/RM 奖励算组相对 advantage(Day 102),所以它能探索——采样可能撞出比示范更好的策略并被强化。代价是每步算力随 G 线性增长(要生成 G 倍的 token),显存也更高(要持有 reference 策略 + 一组采样)。一句话:DPO 用数据换算力,GRPO 用算力换探索。
什么时候选哪个? 有现成高质量成对偏好数据、要的是对齐已知偏好、预算紧 → DPO;任务可验证(有 grader)、想让模型超过示范、要涌现推理 → GRPO+RLVR(R1 路线)。二者不是「谁更先进」,是不同问题的不同工具。
一个反直觉点:DPO 学不到偏好对里没有的策略。 DPO 的损失只在「y_w vs y_l」这对样本上施加梯度——它把 y_w 的概率推高、y_l 推低。如果某个更好的解法 y* 从未出现在任何偏好对里,DPO 永远不会朝它走(没有梯度指向它)。GRPO 因为在线采样,有机会采到 y*、给它高 reward、再强化——这就是「探索」的实质。所以做数学/代码这类「可能有比人类示范更优解」的任务,GRPO 的探索能力是 DPO 给不了的。
DPO 的隐式奖励是什么? DPO 损失可推出一个隐式 reward r(x,y) ∝ β·log(π_θ(y|x)/π_ref(y|x))——即「策略相对参考策略把这个回答的概率抬高了多少」。它不显式打分,但等价于在拟合一个由偏好对定义的奖励排序。理解这点就明白:DPO ≈ 把 RM 和 PPO 合并成一步监督式优化,省了在线采样,代价是丢了探索。
DPO 损失的直觉(不展开完整推导):L_DPO = −log σ(β·[log π_θ(y_w)/π_ref(y_w) − log π_θ(y_l)/π_ref(y_l)])。括号里是「优答的隐式奖励 − 劣答的隐式奖励」,σ 是 sigmoid——损失逼模型把这个差值推大,即把优答概率抬高、劣答压低。β 控制「敢偏离参考多远」(类似 GRPO 的 KL 系数角色)。三点可读出:
- 它只在 (y_w, y_l) 这一对上有梯度,没见过的 y* 无梯度(呼应「学不到偏好对外策略」)。
- β 太大 → 过度偏离参考、可能退化;β 太小 → 学不动。这与 GRPO 的 KL β 是同一类张力。
- 无 σ 饱和保护时,已经分得很开的对会梯度消失——所以 DPO 也有自己的「数据质量」依赖。
Unsloth 的工程意义:让小团队单卡也能跑 GRPO。 GRPO 在线采样 + 多策略本来很吃显存。Unsloth 的流水线把 base 模型量化(4-bit)+ 只训 LoRA adapter(低秩适配,不动 base 权重),把显存压到能在单张 T4/A100 上跑 Qwen3-4B 这类小模型的 GRPO。这把「RL 后训练」从「大厂集群专属」降维成「个人可复现」,是本 block「首跑」可行的工程前提。资源:Unsloth GRPO guide(2026-01)。
2. 推导 / 手算 / 代码走读
今天是环境/运行时日,本仓没有训练代码可走读(src/agent/train/grpo.ts 是纯数学演示,不含 Unsloth/LoRA/采样循环)。这里给 DPO vs GRPO 的「成本量级」对照(定性,非实测):
| 维度 | DPO | GRPO |
|---|---|---|
| 在线采样 | 无 | 每 prompt 采 G 个 rollout |
| 单步生成量 | 0(用现成对) | G × 生成长度 |
| 显式奖励 | 无(隐式 RM) | 有(grader/RM 打分) |
| 探索新策略 | 否 | 是 |
| 显存 | 低 | 中-高(+reference +采样) |
| 典型场景 | 有偏好对、对齐 | 可验证、要涌现 |
补一列 PPO 作三方对照(呼应 Day 101 地图):
| 维度 | PPO+RM | DPO | GRPO |
|---|---|---|---|
| critic/value 网络 | 要 | 不要 | 不要 |
| 显式 RM | 要(训出来) | 不要(隐式) | 可验证任务不要 |
| 在线采样 | 是 | 否 | 是 |
| 显存/复杂度 | 最高 | 最低 | 中 |
| 探索 | 有 | 无 | 有 |
Unsloth GRPO 流水线的关键配置项预览(今天只冒烟不配训练,但先认脸,Day 107 细调):
load_in_4bit=True:base 4-bit 量化,省显存的第一杠杆。- LoRA
r/lora_alpha/target_modules:低秩适配的容量与作用层。 - GRPO 侧(Day 107):
num_generations(即 group size G)、beta(KL 系数)、learning_rate、max_steps,以及挂载的reward_funcs列表。 reward_funcs接受多个函数(正好对应 Day 105 的多目标 reward 组合)。
Unsloth 冒烟的最小步骤(在 Colab T4 或租 A100 上,不在本仓内):
pip install unsloth,FastLanguageModel.from_pretrained("unsloth/Qwen3-4B", load_in_4bit=True)加载 4-bit base。FastLanguageModel.get_peft_model(...)挂 LoRA adapter(设 r、target_modules)。- 不训练,先做一次纯生成冒烟:给一条 prompt,
model.generate(...),确认能出文本、显存没爆。 - 截图环境信息(GPU 型号、Unsloth 版本、Qwen3-4B 加载成功)+ 首条生成文本,作为 smoke-test 证据。
这一步只验证「环境跑得起来 + base 能生成」,还没接 reward、还没训练(训练是 Day 107)。
GRPO 单步算力的粗算(理解「算力换探索」的代价):设 group size G=8、每个 rollout 平均生成 256 token、batch 内 prompt 数 B_p=16。则每个训练 step 的生成 token ≈ G × 256 × B_p = 8 × 256 × 16 = 32,768 token。DPO 同样 16 个 prompt 一步生成 0 token(用现成偏好对),只做前向+反向。这就是为什么 GRPO 必须靠 4-bit + LoRA 把单卡显存压下来才跑得动——生成是瓶颈,G 每翻倍,单步生成量翻倍。
为什么 LoRA 能让单卡跑起来:LoRA 冻结 base 权重,只在若干层插入低秩矩阵(秩 r,如 16/32),可训练参数从「全量数十亿」降到「百万级」。配合 4-bit 量化把 base 权重显存再砍约 4×,Qwen3-4B 这类模型的「base(4bit) + LoRA + reference + 一组采样」就能塞进单张 T4/A100。代价:LoRA 容量有限,复杂能力增益可能弱于全参微调——但对「在已有 base 上做 RL 对齐/推理增强」足够。
3. 今日实战
- 准备 GPU 环境:Colab T4(免费档)或租用 A100。
- 装 Unsloth,加载 Qwen3-4B(4-bit),挂 LoRA adapter。
- 跑一条 base 生成(不训练),确认显存够、能出文本。
- 截图:GPU/版本信息 + base 加载成功 + 1 条生成结果。
- 写入
docs/aipa/day104-dpo-vs-grpo.md,附 DPO vs GRPO 权衡表 + 环境 smoke-test 截图 + 那 1 条生成文本。
DPO vs GRPO 选型 checklist(落进笔记,AISA build-vs-buy 口径):
- 有现成高质量成对偏好数据吗?有 → DPO 起步更省。
- 任务有确定性 grader(唯一答案/可规则判)吗?有 → GRPO+RLVR 更对路。
- 需要模型「超过示范」吗?需要 → 必须有探索 → GRPO。
- 预算/显存极紧、只能单卡吗?→ Unsloth 4-bit+LoRA,GRPO 的 G 取小(如 8)控成本。
- 既要可验证又要主观质量(如 SAR)?→ 混合 reward(grader + rubric/judge,Day 105)。
4. 今日实测 / 产出
docs/aipa/day104-dpo-vs-grpo.md+ 环境 smoke-test 截图 + 1 条生成。- 待 GPU:实际 Unsloth 加载 + 生成需 GPU 环境,本仓未含训练运行时;将产出环境通过截图与首条生成文本。
- 状态如实:DPO vs GRPO 权衡表 + 选型 checklist 是确定性纸面产出可立即完成;环境冒烟 + 生成样例待 GPU,不预填任何生成内容。
- 本仓
src/agent/train/grpo.ts提供的是 GRPO 数学内核(advantage/reward),不含 Unsloth/采样/训练循环——训练运行时确属 GPU 侧,标注诚实。
5. 常见误区 / 陷阱
- 以为 DPO 是 GRPO 的「升级版」:DPO 无在线探索,二者解决不同问题;用「先进/落后」框架会选错工具。
- 不量化就上 GRPO:GRPO 单步算力随 G 线性增长,没估算 G × 生成长度 × 步数的总 token 量就开跑,容易超预算/超显存。
- 用已弃用的 trl 旧 GRPOTrainer 早期签名:API 变过,照搬老教程会报参数错(SOTA 检查明确禁用)。
- 冒烟阶段就接 reward/训练:今天只验「环境 + 生成」,把 reward 函数、采样循环、KL 一股脑塞进来,出错难定位——分层冒烟。
- G 设太大爆显存:单步生成量 = G × 生成长度 × prompt 数,G 从 8 跳到 32 直接 4× 生成量,单卡 OOM;先用小 G 跑通再加。
- 以为 4-bit 量化无损:量化会轻微掉精度,base 生成质量可能比 fp16 略差;冒烟看「能不能生成」,不要拿量化 base 的生成质量当模型上限。
- 拿 DPO 数据喂 GRPO:DPO 要「优答/劣答」成对数据,GRPO 要「prompt + verifier」(Day 106);格式不通用,搞混会让训练集白做。
- 冒烟通过就以为能训练:能加载+生成 ≠ 能跑 GRPO;采样循环、reward 挂载、KL 调度都还没接,OOM/不收敛常发生在那一步(Day 107-108)。
6. 学习资源(每条带 YYYY-MM)
- Unsloth GRPO guide / 文档(2026-01)——LoRA+GRPO 单卡流水线,Qwen3-4B 兼容矩阵。
- 《Direct Preference Optimization》DPO(arXiv:2305.18290,2023-05)——隐式 RM 闭式损失的权威源。
- DeepSeekMath《GRPO》(arXiv:2402.03300,2024-02)——在线采样 + 组相对 advantage。
- 《LoRA: Low-Rank Adaptation of Large Language Models》(arXiv:2106.09685,2021-06)——只训低秩 adapter 的显存节省原理(历史打底)。
- Qwen3 技术报告(2025,再验当周版本)——base 模型与 chat template。
- DeepSeek-R1(arXiv:2501.12948,2025-01)——GRPO+RLVR 的探索能力为何超过 DPO 的实证背景。
- QLoRA《Efficient Finetuning of Quantized LLMs》(arXiv:2305.14314,2023-05)——4-bit 量化 + LoRA 联合微调的可行性打底(Unsloth 流水线的基础)。
一句话总结今天:DPO 用数据换算力、无在线探索;GRPO 用算力换探索、能超过示范。任务可验证且想涨推理 → GRPO+RLVR;有偏好对且预算紧 → DPO。本仓只持有 GRPO 数学内核,真正的 Unsloth 训练运行时待 GPU——诚实分层。
SOTA检查 (2026-06 更新)
- 当前主流:Unsloth 仍活跃维护 GRPO/LoRA 流水线,是 2026 单卡 RL 后训练的主流入口之一;DPO 仍是偏好对齐主流、GRPO 仍是可验证任务主流,二者并存。
- 过时黑名单:使用已弃用的 trl 旧 GRPOTrainer 早期签名;把 DPO 当 GRPO 的替代升级叙事。
- 下次复查点:再验时确认 Qwen3-4B 与 Unsloth 版本兼容矩阵(版本漂移会导致加载/训练失败);Unsloth 是否引入 Dr.GRPO std 归一化开关(Day 107/108 一并复查)。
衔接
- 昨天:Day 103 — R1 训练范式(arXiv:2501.12948):RLVR 确定性 grader 对 10 算术样本打分
- 今天:DPO(数据换算力、无探索)vs GRPO(算力换探索)权衡讲透 + Unsloth LoRA+GRPO 单卡环境冒烟(待 GPU)
- 明天:Day 105 — reward 函数设计:多目标 reward 组合 + reward hacking,给 AML 任务写可验证 reward 替换循环自评