跳转至

Focused-DPO: Enhancing Code Generation Through Focused Preference Optimization on Error-Prone Points

会议: ACL 2025
arXiv: 2502.11475
代码: 无
领域: LLM对齐 / 代码生成
关键词: DPO, 代码生成, 错误集中点, PageRank, 偏好优化加权

一句话总结

发现代码生成错误集中在特定"错误易发点"(error-prone points)——前缀/后缀通常正确,错误集中在中间代码段,提出 Focused-DPO 通过 PageRank 排序定位关键代码段并在 DPO 损失中加权放大,HumanEval+ 提升 4.41%、MBPP+ 提升 6.71%。

研究背景与动机

  1. 领域现状:DPO 等偏好优化方法已成功用于代码生成的对齐,但将所有 token 等权对待。
  2. 现有痛点:代码中不同部分对正确性的贡献极不均匀——函数签名、import 语句几乎总是正确的,真正的错误集中在算法逻辑的核心区域。标准 DPO 将大量梯度信号浪费在已经正确的 token 上。
  3. 核心矛盾:错误易发点的正确性与整体正确性高度相关(Phi 系数 0.57-0.61),但标准 DPO 无法区分不同位置的重要性。
  4. 本文要解决什么:如何自动定位代码中的错误易发点,并在偏好优化中聚焦于此?
  5. 切入角度:用公共前缀/后缀去掉代码两端不变部分→用 PageRank 在代码-测试二部图上排序定位关键段→加权 DPO。
  6. 核心 idea:错误集中在中间段→定位→加权放大 DPO 损失。

方法详解

整体框架

三阶段:(1) 从真实代码仓库合成偏好数据;(2) PageRank + 公共前缀/后缀匹配定位错误易发点;(3) 加权 DPO 训练。

关键设计

  1. 错误集中现象的发现与量化:
  2. 公共前缀/后缀与正确性的 Phi 系数仅 0.07-0.08(几乎不相关)
  3. 错误易发中间段与正确性的 Phi 系数 0.57-0.61(强相关)
  4. 中间段正确时整体正确率 90.02%,中间段错误时仅 3.17%

  5. PageRank 定位错误易发点:

  6. 构建代码-测试二部图(代码候选↔测试用例,通过/失败作为边权重)
  7. 用 PageRank 排序代码候选的"鉴别力"——被高鉴别力测试用例区分的代码段更关键
  8. 比简单的通过率排序更有效

  9. Focused-DPO 加权损失:

  10. 将代码分为 prefix/focus/suffix 三段
  11. Focus 段权重 \(w_{focused} = 2.0\),其余 \(w = 1.0\)
  12. 在 DPO 对数概率计算中按位置加权

实验关键数据

主实验

Benchmark Qwen2.5-7B Baseline +Focused-DPO 提升
HumanEval 91.5% 92.7% +1.29%
HumanEval+ 84.1% 87.8% +4.41%
MBPP 82.8% 84.7% +2.24%
MBPP+ 71.4% 76.2% +6.71%

关键发现

  • 更严格的 benchmark 提升更大:HumanEval+ (+4.41%) > HumanEval (+1.29%);MBPP+ (+6.71%) > MBPP (+2.24%)——说明方法真正改善了代码正确性而非表面匹配
  • 5000 训练样本即可有效:数据效率很高
  • 对已经过 SFT/DPO 的强模型仍有效:能在 Qwen2.5-Coder 上进一步提升

亮点与洞察

  • "错误集中在中间"的实证发现:简单但有力的观察,给代码对齐研究提供了新视角
  • PageRank 在代码-测试二部图上的应用:巧妙地将 web 排序算法迁移到代码质量评估

局限性 / 可改进方向

  • 仅验证 Python 代码生成,其他语言未测试
  • \(w_{focused} = 2.0\) 是手动设定的,可以学习自适应权重
  • PageRank 需要多个候选和测试用例,对少样本场景不友好

评分

  • 新颖性: ⭐⭐⭐⭐ 错误集中现象 + PageRank 定位 + 加权 DPO 的组合很巧妙
  • 实验充分度: ⭐⭐⭐⭐ 多 benchmark + 消融 + LiveCodeBench
  • 写作质量: ⭐⭐⭐⭐ 分析透彻
  • 价值: ⭐⭐⭐⭐ 对代码对齐有直接实用价值