大厂推荐算法面经 10 问:后训练 RL 的算法对比与工程细节
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 你知道 DPO 的损失函数公式吗?
- GRPO、PPO 与 DPO 的区别是什么?
- GRPO / PPO 是 on-policy 还是 off-policy 的?DPO 呢?
- DAPO 对 GRPO 的改进有哪些?
- GSPO 对 GRPO 的改进有哪些?
- 比较一下 process reward 和 outcome reward。
- 强化学习训练时遇到 reward 上升、但 validation 时效果下降,有哪些解决思路?
- VeRL 框架是同步的还是异步的?具体的训练流程是什么?
- 了解 RL 的训推不一致问题吗?训推不一致的产生原因是什么?
- 你认为未来 SFT 阶段和 RL 阶段,哪个更重要?
《参考解析》
三族算法的定位差别,先一句话说清各自的「拿什么换什么」。 PPO 是标准的 on-policy actor-critic:需要额外的奖励模型和一个与策略同规模的价值模型(critic),用 GAE 估优势、用裁剪的代理目标做更新,并加 KL 约束不要离参考模型太远,工程最重、显存最贵。GRPO 去掉了价值模型:对同一个 prompt 采样一组(group)G 条回答,用组内奖励的均值与标准差归一化出优势,相当于用「同题多答的相对好坏」替代 critic 的基线估计,再套 PPO 式的裁剪更新加 KL,显存与调参成本明显下降,是当前推理类 RL 的主流。DPO 则是离线方法:它把「带 KL 约束的 RLHF 目标」解析求解,把奖励重参数化成策略与参考模型的对数比 β·log(π_θ/π_ref),于是目标函数退化成对偏好对 (y_w, y_l) 的二元分类损失 —— 训练时既不需要奖励模型也不需要在线采样,只需要一份固定偏好数据集。
DPO 的损失函数要能写出来,并说清它为什么成立。 形式上 L = −E[ log σ( β·log(π_θ(y_w|x)/π_ref(y_w|x)) − β·log(π_θ(y_l|x)/π_ref(y_l|x)) ) ],其中 σ 是 sigmoid,y_w / y_l 是偏好对里的胜出与落败回答。它的推导前提是 RLHF 目标 max E[r] − β·KL(π_θ‖π_ref) 有闭式最优解 π*(y|x) ∝ π_ref(y|x)·exp(r/β),反解出 r = β·log(π_θ/π_ref) + β·log Z(x),把它代回 Bradley-Terry 偏好模型后配分项相消,只剩两个对数比的差。三个必须知道的推论:一是 β 控制偏离参考模型的力度,太小会过拟合偏好数据、太大会学不动;二是它能工作依赖「偏好数据由参考策略附近的策略产生」这个假设,所以数据是用 SFT 模型采的、还是用别的强模型采的,效果差别很大;三是不带负对数似然项(RPO / DPO+NLL 的改进点)时,DPO 会在「压低落败回答概率」上过度用力,导致生成多样性下降。
on-policy 的归属:PPO 与 GRPO 是 on-policy,DPO 是 off-policy。 PPO 虽然实现上会用一批数据做多个 epoch 的更新、带重要性采样,但它的理论要求数据来自当前策略附近,因此算 on-policy(实践中叫 near on-policy,靠裁剪和 KL 控制偏离)。GRPO 的组内采样必须由当前策略现场生成,奖励归一化也依赖同一策略下的分布,同样 on-policy。DPO 训练全程不采样、在一份固定的偏好数据上做监督式优化,属于 off-policy / offline —— 它优化的是「这批数据隐含的偏好」,与当前策略无关,这也是它便宜但提升有上限的原因。答题时把「是否需要在训练过程中用当前策略生成数据」当作判据,比背标签更稳妥。
DAPO 对 GRPO 的四点改进,分别是熵坍缩、无效样本、长度偏置和超长惩罚。 ① Clip-Higher:把裁剪区间的下界 ε_low 与上界 ε_high 解耦、抬高上界,让低概率 token 也能被拉起来,缓解 GRPO 训练中熵快速下降、探索枯竭的问题。② Dynamic Sampling:过滤掉组内奖励全对或全错的样本(这类样本归一化后优势恒为 0、贡献不了梯度),动态补采直到凑满有效 batch,训练效率与稳定性都提升。③ Token-level policy gradient loss:GRPO 默认按序列(样本)归一化损失,导致长序列被过度加权、长短样本梯度失衡,改成按 token 归一化后长度偏置消失。④ Overlong reward shaping:对超过长度上限被截断的回答给一个软性惩罚,而不是简单地按错误处理,避免把「截断」误当成「答错」污染信号。共同指向一个目标:把有限的计算用在有梯度、有区分度的样本上。
GSPO 改的是「重要性比值的粒度」:从 token 级换成序列级。 GRPO 里每个 token 的重要性权重是 π_θ(o_t)/π_old(o_t),逐 token 裁剪;GSPO 把它换成序列级似然比 s(θ) = (π_θ(o|x) / π_old(o|x))^{1/|o|}(长度归一化后),再对整个序列做一次裁剪。这样做的理由是:奖励是给整条回答的,优化的单位就应该和奖励的单位对齐;token 级权重在高方差场景(长序列、MoE 模型里专家路由变化导致单 token 比值剧烈漂移)会让训练发散,序列级比值稳定得多。副作用是它要求同一序列内所有 token 共享一个权重,梯度信号更粗但更稳。这条改进是 Qwen 系列在 2025 年提出的,回答时把「粒度对齐」这个动机讲出来就够了。
process reward 与 outcome reward 是信号密度与标注成本的取舍。 Outcome reward(ORM)只看最终答案对不对,好处是可以用规则或验证器自动判分、几乎零标注成本、不容易引入主观噪声;坏处是信号稀疏,一条 20 步的推理链只给一个 0/1,信用分配粗,而且模型很容易学到「凑格式、碰答案」这类捷径。Process reward(PRM)对每一步给分,信号稠密、信用分配清楚、样本效率高,常被用在搜索或重排(best-of-N、束搜索配步级验证器);代价是标注昂贵(人工逐步标注或用一个更强的模型打分),步级标签之间可能互相矛盾,而且它同样会被 hack —— 模型学到「写看起来严谨的步骤」而不是「把题做对」。工程上的常见组合是:用 ORM 做在线 RL 的主奖励,用 PRM 做推理时的过程筛选,或者在 ORM 之外加少量步级约束;如果只有 ORM,就靠难例筛选和格式约束来缓解稀疏。
「reward 上升但 validation 变差」按四类归因,逐条排查。 ①奖励被利用(reward hacking):策略找到奖励模型或验证器的漏洞,训练奖励虚高、真实能力下降 —— 对策是留出与训练分布不同的评测集、给奖励模型做集成、加 KL 与熵正则、按验证集早停。②过拟合训练题集:同一批 prompt 反复采样,模型记住了这些题而不是学会了推理 —— 对策是持续刷新 prompt 池、保证训练与验证的题目分布不重叠。③长度与截断漂移:RL 训练常让回答变长,训练侧按完整回答给奖励,验证侧却因为 max_tokens 截断拿到半截答案,于是出现「reward 涨、pass@1 跌」的假象 —— 先看截断率和平均长度曲线。④工程不一致:rollout 引擎与训练引擎算出的 logprob 不一致(见下一问)、评测协议变了(temperature、采样数、pass@1 还是 pass@k)。排查顺序建议是「先看指标的测量口径有没有变,再看长度与截断,再看奖励与真实能力的相关性,最后才怀疑超参」。监控曲线上必须同时画 KL、熵、长度、裁剪比例、验证集分数,只看 reward 一定会被骗。
VeRL 默认是同步的,异步是为了掩盖 rollout 的延迟。 同步流程可以拆成五步:driver 把一批 prompt 分给 rollout worker(vLLM 或 SGLang)→ rollout 用当前权重生成回答 → 计算奖励、参考模型的 logprob、优势(PPO 还要 critic 估价值)→ actor 用 FSDP 或 Megatron 后端做参数更新 → 把新权重同步回 rollout 引擎,进入下一轮。同步的好处是数据严格 on-policy、没有陈旧度;代价是生成与训练串行,GPU 在生成阶段大量空转。于是有了异步(async / partial rollout)模式:生成与训练重叠、用一批稍旧的数据做更新,靠重要性采样或截断重要性来纠正陈旧度,吞吐上去了但要付出稳定性代价。回答时把它支持 FSDP/Megatron 训练后端、vLLM/SGLang 推理后端与「同步为主、异步可选」这几点说清即可,别把某个版本的默认行为说成绝对。
训推不一致的本质是「同一份权重,两个引擎算出的概率不一样」。 具体来源有五类:数值精度与累加顺序(推理引擎常用 FP8/INT8 或不同 bf16 归约顺序,训练侧按 bf16/fp32 累加);算子实现不同(FlashAttention 的多个版本、融合 kernel、CUDA Graph 会改变 softmax 与注意力的计算路径);并行切分不同(张量并行的 all-reduce 顺序、序列并行)导致浮点结果有微小差异;MoE 路由在训练与推理框架里的判定细节不同,专家选择一旦分叉就是大偏差;以及权重同步滞后(rollout 还在用上一轮权重)。后果是 PPO 的重要性比值在更新开始时就偏离 1,梯度有偏、熵快速坍缩、训练不稳。缓解手段:old_logprob 一律用训练引擎重算而不是直接取推理引擎的返回值;两端对齐精度与算子;权重同步及时且校验;比值上做截断(TIS)或改用对单 token 比值不敏感的算法(GSPO 这类序列级比值);条件允许时用训练推理统一引擎。
SFT 与 RL 的分工是「SFT 定形式、RL 提能力」,中期看 RL 更关键。 SFT 的不可替代之处是冷启动与对齐:给模型定下输出格式、工具调用协议、安全边界,并在没有可验证奖励的领域(写作、对话风格、业务知识问答)直接注入行为;它的瓶颈是只能模仿、无法超越数据里出现过的解法,而且对数据质量与规模高度敏感,容易在长链推理上「会格式不会推理」。RL 的价值在于用可验证奖励去优化那些「说不清但能判对错」的目标,典型的 RLVR(数学、代码、可执行任务)能带来 SFT 给不了的能力跃升,并且随着验证器覆盖的任务变多而持续扩展。所以趋势判断是:SFT 退化成廉价的冷启动与对齐步骤(数据从海量变成精选),能力增长的主力转向 RL,同时中间还夹着拒绝采样微调(RFT)这类折中做法。回答时把「有可验证奖励的领域 RL 主导、无验证器的领域 SFT 仍是主力」这条边界说出来,比押一个胜负更专业。