面灵AI→

快手 多模态大模型算法 一面:DPO 与 GRPO 的区别与零梯度陷阱

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

简历与偏好对齐原理

  1. 简历深挖(未记录具体题面)。
  2. 说一下 DPO、SFT、GRPO 的区别,DPO 更像 SFT 一点还是更像 GRPO 一点?
  3. DPO 在筛选数据时需要注意什么?
  4. DPO 的优化目标是什么?
  5. 如果 GRPO 训练中样本全对全错会导致什么,为什么梯度会为 0?
  6. 有没有听说过 PanoVision model,你觉得这种模型和 VL 模型相比怎么样?

项目与训练细节

  1. 项目中的奖励函数具体是怎么设计的?这样设计会有什么问题吗?
  2. 训练时有没有关注奖励的方差?有没有听说过 DVPO?

《参考解析》

SFT、DPO、GRPO 是同一条流水线上的三个不同机制,别当成三个并列选项。 SFT 是在示范数据上做最大似然,优化的是「像人写的」;DPO 是在偏好对上做分类式优化,优化的是「chosen 比 rejected 更可能」,它用闭式推导把 RLHF 里的奖励模型加 PPO 两步消掉,直接在策略上算梯度;GRPO 是真正的在线强化学习,对同一个 prompt 采样一组回答、用奖励打分、组内归一化出优势再更新策略。DPO 更像 SFT:两者都是离线、固定数据集、单轮前向算 loss,没有「采样—打分—再采样」的循环,也不需要 critic;差别只在 DPO 多了一个参考模型和 β,训练信号来自成对比较而不是单一目标。它不像 GRPO 的地方恰恰是 GRPO 的本质——GRPO 的样本是自己当前策略生成的(on-policy),奖励可以任意、可以稀疏、可以是规则校验,而 DPO 只能学数据集里已经标好的偏好,数据分布和当前策略一旦偏离就会退化。一句话版本:DPO 是把偏好学习写成了一个监督损失,GRPO 是把偏好学习还原成了策略搜索。

DPO 的优化目标要能写出式子并解释每一项。 记策略 π、参考策略 π_ref、偏好对 (y_w, y_l),目标是最大化 log σ(β·[log π(y_w|x)/π_ref(y_w|x) − log π(y_l|x)/π_ref(y_l|x)]),等价于最小化它的负对数。括号里那一项就是「隐式奖励差」:它把策略相对参考模型的概率提升比当成奖励,β 控制对参考模型的约束强度——β 大则更保守、更贴近 SFT 模型,β 小则允许更大偏移但容易崩。梯度里有一个很重要的系数:σ(−βΔ) 或者说「当前模型把 chosen 排得比 rejected 低多少」,当模型已经把 chosen 排得远高于 rejected 时 Δ 很大、这项趋近 0,样本自动失去权重。这解释了 DPO 的两个工程特性:一是难样本(模型还分不清的)梯度大,二是太简单的样本白跑。实践里的 β 常用 0.1 量级,配合 β 调度或长度归一化;另一个常见坑是 chosen/rejected 长度差异大时,DPO 会学到「长即好」,需要做长度惩罚或配对时控制长度差。

DPO 数据筛选的判据是「可判别 + 有信息 + 不泄漏」。 第一条,chosen 必须真的比 rejected 好,而且要能说出好的理由(事实正确、指令遵循、格式合规),标注噪声在 DPO 里的破坏性比 SFT 大,因为噪声直接变成反向梯度。第二条,难度要落在模型的能力边界附近:两者差距过大(模型本来就 99% 判对)几乎没有梯度,差距过小(人类标注都犹豫)则是噪声;实操上先用当前模型算一遍隐式奖励差,把差值分布的两端截掉,留中间段。第三条,chosen 的质量上限就是模型的上限——用差模型产出的 chosen 去训,等于把差的分布固化下来,所以 chosen 要来自更强的模型或人工精修,rejected 反而可以来自当前策略采样(on-policy 的偏好对效果更好)。第四条工程细节:去重(同一 prompt 多对会造成过采样)、去污染(和评测集重叠会虚高)、按场景配比(多模态里还要按图像类型、任务类型分层)、以及控制长度分布避免长度偏置。

GRPO 全对全错梯度为 0,根因是「组内归一化把绝对分数变成了相对优势」。 GRPO 对每个 prompt 采样 G 个回答,用同一组奖励算优势 Â_i = (r_i − mean(r)) / std(r),然后拿 Â_i 当权重乘上 ∇log π(y_i)。如果这一组全对,所有 r_i 相同,r_i − mean = 0,分子为 0,Â_i 全 0,梯度精确为 0;全错同理。即使分母不用 std、只减均值(drGRPO 的做法),全对全错时优势依然是 0——所以这不是数值稳定性问题,是「没有相对差异就没有学习信号」的本质。分母用 std 还会多一个坑:组内只有极少数样本不同时 std 很小,归一化会把少数样本的优势放大成很大的梯度,训练容易抖;这也是后续工作改成「只减均值不除 std」或加 clip 的原因。后果分两层:单个 prompt 层面,这一组 rollout 全白费(还照样烧了采样算力);batch 层面,如果任务太简单或太难,大量组都是全对或全错,有效样本骤减,表现为奖励均值很高但策略不再变化、entropy 缓慢下降。工程解法是难度管理而不是改 loss:按 pass rate 分层采样、过滤全对全错的组并补采(DAPO 的 dynamic sampling)、课程式地从易到难、给稀疏任务加可验证的稠密奖励(格式、步骤)、以及保留一定温度让组内有差异。

奖励方差是训练健康度的第一指标,DVPO 这类工作就是在处理它。 要盯的不只是全局 reward 均值,而是三个量:组内方差(同一 prompt 的 G 个回答之间的方差,为 0 就是没信号)、组间方差(不同 prompt 的难度分布,太集中说明数据太单一)、以及方差随步数的趋势(持续下降通常意味着熵塌缩)。可操作的口径:把 batch 按组内方差排序,方差低于阈值的组直接丢;监控 有效组占比(组内不是全对全错的组数 / 总组数),低于某个水平就该调数据配比而不是调超参。DVPO 我的理解是「方差感知的偏好优化」这一类思路:不再对所有样本一视同仁,而是按样本的奖励方差或难度动态加权/筛选,把梯度预算集中到有区分度的样本上;这个名字在文献里有不止一种实现,回答时最好先复述自己的理解再和面试官对齐口径,比硬背一个定义安全。与它同源的做法还有按优势绝对值做重要性裁剪、按组内方差自适应调节 KL 系数。

奖励函数设计的常见缺陷,答的时候要能自己指出问题。 多目标加权最容易犯的错是量纲不统一:格式奖励给 0.1、正确性给 1.0,模型会先学格式;应该先把每项归一到 0~1 再按业务重要性配权重,并明确「正确性是门控项」——不正确直接 0 分,其他项只在正确时生效。第二个是 reward hacking:用 LLM judge 打分会学到 judge 的偏好(长度、套话、罗列),用规则校验会被模型找到绕过路径(比如把答案塞进思考过程),所以奖励要尽量可验证(单测、精确匹配、schema 校验),judge 只做辅助并定期人工抽检对齐。第三个是稀疏与延迟:只在最终答案给分,中间步骤没有信号,长链推理很难学,可以加过程奖励但要防「过程好看结果错」。第四个是离线在线不一致:训练用的奖励和线上评测口径不同,指标涨了体感没变——所以奖励函数从第一天就该和 eval 集绑在一起,任何改动都跑一遍回归。

PanoVision 与 VL 模型对比,回答框架比结论重要。 如果指的是全景/多视角视觉理解这一类模型,差异主要在四处:输入表示上,普通 VL 处理的是单张透视图像,全景输入是等距柱状投影或多相机环视拼接,极点区域有严重拉伸、需要专门的位置编码和采样策略;空间理解上,全景/环视要做的是 360° 的相对方位与距离,而不是图像平面上的框;数据与评测上,全景数据规模远小于常规图文对,标注成本高,评测指标也不同(方位误差、环视一致性);下游任务上,它更多服务于室内导航、机器人、自动驾驶环视这类需要「周围一圈」的场景,而不是单图问答。对比 VL 时要落到「同一个能力它更贵在哪」:分辨率分配(同样像素要覆盖 360°,单位视角的有效像素更少)、跨视角一致性(拼接缝、曝光差)、以及算力(多图输入让视觉 token 数翻几倍)。如果对具体模型不确定,就先复述自己理解的设定再对比,别硬编 benchmark 数字。