27届大模型面试准备(七十三):大模型强化学习对齐工程实战------RLHF、PPO 与 GRPO 的训练流水线
引言
前面把后训练(A16)、对齐税(A48)、多模态训练(A40)、工具调用训练(A42)都铺开了。本篇把"对齐"里最硬核、也是面试官最爱追问的一段单独拎出来讲透:基于强化学习的对齐训练。它和上一篇高频八股(A52)、指令遵循(A48)是一条线,但更偏工程实现------奖励模型怎么训、PPO 为什么要有 critic、GRPO 怎么把 critic 省掉、DPO 又怎么绕过奖励模型直接做偏好。
这部分对准备华为多模态 LLM 岗尤其关键:你的 4MRAG 完全可以接一层 RL 来联合优化"检索决策 + 生成质量",而 GRPO 正是你简历里已经写过、面试必被深挖的能力点。本篇给可落地的训练流水线与代码骨架。
前文链接:A52 高频八股秒答、A48 指令遵循与对齐税、A16 后训练、A42 工具调用训练。
对齐训练三段式(以 RLHF 为例)
┌────────────┐ ┌────────────┐ ┌──────────────────────┐
│ SFT 模型 │──▶│ 奖励模型 RM │──▶│ 强化学习策略优化 │
│ (policy π0) │ │ (打分器) │ │ PPO / GRPO / DPO │
└────────────┘ └────────────┘ └──────────────────────┘
│ │
│ 偏好数据 ▼
└────(prompt, chosen, rejected)──▶ 更新 π → π*
(pairwise 标注)
DPO 短路版:跳过 RM,直接用偏好对优化策略
SFT → DPO(preference pairs) → π* (无显式 reward model)
表:三种主流对齐算法对比
| 方法 | 是否需要 RM | 是否需要 critic | 采样开销 | 稳定性 | 适用场景 |
|---|---|---|---|---|---|
| RLHF-PPO | 是 | 是(value net) | 高(在线采样) | 中(易崩) | 强对齐、复杂奖励 |
| GRPO | 是 | 否(group 基线) | 中(组内采样) | 高 | 推理/数学/工具调用 |
| DPO | 否(隐式) | 否 | 低(离线) | 高 | 快速对齐、数据充足 |
一、为什么 SFT 不够,必须上 RL
SFT 只在"示范分布"上做最大似然,模型学到的是"像答案",不一定学到"人类真正偏好"。同一 prompt 可能有多个合理回答,有的更简洁、更安全、更会推理。RL 的作用是把"好回答"的相对优势通过奖励信号放大。
核心矛盾:奖励从哪来?一条路是训一个奖励模型 RM 去拟合人类偏好(RLHF),另一条路是直接用偏好对构造一个"隐式奖励"做分类式优化(DPO)。
二、奖励模型(RM)训练
RM 本质是一个回归头:输入 (prompt, response),输出标量分数。训练用 Bradley-Terry 成对偏好模型:
P(chosen > rejected | x) = σ(r_θ(x, y_c) − r_θ(x, y_r))
对应损失是 pairwise ranking loss:
import torch, torch.nn as nn
def rm_pairwise_loss(rm, x, y_c, y_r):
# rm: 输入拼接序列输出最后一帧标量分;y_c=被选, y_r=被拒
s_c = rm(x, y_c) # [B]
s_r = rm(x, y_r) # [B]
# 越大越好 => 希望 s_c - s_r 尽可能大
loss = -torch.nn.functional.logsigmoid(s_c - s_r).mean()
return loss
# 工程要点:
# 1) RM 与 policy 同源初始化(同底座),只换 head;
# 2) 偏好标注要做去重与质量过滤,避免标注噪声主导梯度;
# 3) 训练目标含长度正则:r_θ 对超长回答天然偏高,需减 λ·|y| 或做长度归一。
RM 训好后,它就是 RL 阶段的"环境奖励函数"。常见坑:RM 过拟合标注者偏好、被 reward hacking(模型生成 RM 高分的套路文本而非真优质回答)。
三、PPO 实战
PPO 是 actor-critic 结构:actor=策略 π,critic=价值网络 V 估计期望回报,ref=冻结的 SFT 参考策略用于 KL 约束(防止策略跑太偏)。单步损失:
def ppo_loss(logp_new, logp_old, adv, value, returns, clip=0.2, c1=0.5, c2=0.01):
ratio = (logp_new - logp_old).exp()
surr1 = ratio * adv
surr2 = torch.clamp(ratio, 1-clip, 1+clip) * adv
policy_loss = -torch.min(surr1, surr2).mean() # clip 防更新过猛
value_loss = c1 * (value - returns).pow(2).mean()
ent = -logp_new.exp().mul(logp_new).sum(-1).mean() # 鼓励探索
return policy_loss + value_loss - c2 * ent
# 流程(每个 rollout):
# 1) 用 π 对 prompt 采样 response;
# 2) RM 给 response 打分 r;KL = log π - log ref,reward = r - β·KL;
# 3) GAE 算 advantage A,V 学 returns;
# 4) 多轮小批量更新 actor+critic。
PPO 的痛点:要同时加载 actor、ref、critic、RM 四份权重,显存与采样开销都大,训练易不稳定(reward 漂移、KL 爆炸)。
四、GRPO:把 critic 省掉
GRPO(Group Relative Policy Optimization)对同一个 prompt 采样一组 G 个回答,用组内奖励的均值做基线,advantage = (r_i − mean(r)) / std(r),无需独立 value 网络。这正是你做 4MRAG/推理对齐时最划算的方案。
def grpo_advantage(rewards): # rewards: [G] 组内 G 个采样
mean = rewards.mean(); std = rewards.std() + 1e-6
return (rewards - mean) / std # 组内相对优势
def grpo_loss(logp_new, logp_ref, adv, clip=0.2, beta=0.04):
ratio = (logp_new - logp_ref).exp()
surr = torch.min(ratio * adv, torch.clamp(ratio, 1-clip, 1+clip) * adv)
kl = (logp_ref - logp_new).mean() # 相对参考策略的 KL
return -surr.mean() + beta * kl # 组内基线替代 critic
# 与 4MRAG 结合示例:
# prompt = 多模态问题;组内采样 G 条"检索子图集合 + 生成"轨迹;
# reward = 答案正确性(LLM-judge) + 检索效率惩罚 - 幻觉惩罚;
# GRPO 直接优化"何时检索、检索哪几个模态、如何融合",无需训 critic。
GRPO 显存省一半(无 critic),训练更稳,特别适合可验证奖励(数学、代码、检索准确率)场景。DeepSeek-R1 系列即采用 GRPO 类方法做推理对齐。
五、DPO:绕过奖励模型的离线优化
DPO 证明:在最优奖励假设下,偏好数据可以直接推出策略更新,无需显式 RM 与在线采样。
def dpo_loss(pi_logp_yc, pi_logp_yr, ref_logp_yc, ref_logp_yr, beta=0.1):
# yc=chosen, yr=rejected;对比策略与参考策略的对数概率差
pi_diff = pi_logp_yc - pi_logp_yr
ref_diff = ref_logp_yc - ref_logp_yr
logits = beta * (pi_diff - ref_diff)
return -torch.nn.functional.logsigmoid(logits).mean()
# 训练只用 (prompt, chosen, rejected) 三元组,离线、稳、省显存。
# 代价:分布外泛化弱于在线 RL,复杂奖励难表达(奖励被隐式锁死在偏好对里)。
六、工程坑与对策
- reward hacking:模型钻 RM 空子生成高分套路。对策:KL 约束 + 奖励裁剪 + 在线正则 + 周期性 RM 重训。
- 长度偏置:RM 偏好长回答。对策:长度归一、长度惩罚项、长度解耦奖励。
- 训练崩塌:PPO 易因大 batch/高 LR 崩。对策:小 LR、clip、早停、回滚到最近稳定 ckpt。
- 偏好数据质量:标注噪声直接污染 RM。对策:多标注者一致率过滤、难例挖掘。
- 多模态对齐:视觉偏好更难标注。对策:用可验证信号(答案匹配、检测框 IoU)做辅助奖励,减少纯主观 RM。
面试速答
- RLHF 三段式是什么?SFT 得到初始策略 → 训奖励模型拟合人类偏好 → 用 PPO 在 RM 奖励下优化策略,并以 KL 约束参考策略防跑偏。
- 为什么 GRPO 比 PPO 省显存?GRPO 用同一 prompt 的组内采样均值做基线,去掉了独立 critic(value) 网络,少一份权重与一份前向。
- DPO 为什么稳?它把对齐转成离线分类损失,不需要在线采样、不需要 RM 推理、不需要 critic,分布偏移更小。
- reward hacking 怎么防?KL 惩罚约束策略偏离、奖励裁剪、周期性重训 RM、引入可验证奖励。
高频追问清单
- PPO 的 GAE λ 怎么调,对 advantage 估计偏差与方差的权衡?
- GRPO 组大小 G 取多少合适,太小/太大分别有什么问题?
- 4MRAG 接 RL 时,奖励函数怎么设计才能同时鼓励"检索准"和"生成对"?
- 多模态偏好数据怎么构造,纯文本 RM 能给图像回答打分吗?
- 在线 RL 和 DPO 在分布外泛化上为什么有差距,什么时候必须上在线?
- KL 系数 β 过大过小分别会怎样,怎么自适应?