快手 多模态大模型算法 一面:DPO 与 GRPO 的区别与零梯度陷阱
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
简历与偏好对齐原理
- 简历深挖(未记录具体题面)。
- 说一下 DPO、SFT、GRPO 的区别,DPO 更像 SFT 一点还是更像 GRPO 一点?
- DPO 在筛选数据时需要注意什么?
- DPO 的优化目标是什么?
- 如果 GRPO 训练中样本全对全错会导致什么,为什么梯度会为 0?
- 有没有听说过 PanoVision model,你觉得这种模型和 VL 模型相比怎么样?
项目与训练细节
- 项目中的奖励函数具体是怎么设计的?这样设计会有什么问题吗?
- 训练时有没有关注奖励的方差?有没有听说过 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 数字。