OpenCodeReasoning:英伟达用 R1 蒸馏的 Python 代码 SFT 数据集

简介

论文地址https://arxiv.org/pdf/2504.01943
这篇论文主要研究如何通过大规模合成数据集来提升大型语言模型(LLMs)在竞赛编程任务中的推理能力。论文的主要目标是构建一个大规模的、高质量的监督微调(SFT)数据集,并通过该数据集显著提升模型在竞赛编程任务中的表现,同时公开数据集和相关细节,推动社区研究。

主要贡献:

  • 提供了一个大规模的、高质量的合成数据集 OpenCodeReasoning,推动了竞赛编程任务的研究。
  • 通过实验验证了大规模数据集在提升模型性能方面的有效性。
  • 通过深入分析,揭示了推理模式与解决方案正确性之间的关系,为未来研究提供了有价值的见解。

数据集简介:

  • 数据集规模:OpenCodeReasoning 是目前最大的基于推理的合成数据集,包含 736,712 个 Python 样本,覆盖 28,904 个独特的竞赛编程问题
  • 数据来源:数据集的问题来源于多个公开竞赛平台,如 CodeForces、LeetCode、AtCoder 等,并通过严格的数据清洗和去重,确保数据的多样性和独特性。
  • 数据生成:使用 DeepSeek-R1 模型生成解决方案,并通过后处理步骤验证推理痕迹和代码块的正确性,最终提取出高质量的代码解决方案。

数据处理

在这篇论文中,数据清洗和去重是构建高质量OpenCodeReasoning数据集的关键步骤。以下是具体的处理方法:

1. 数据收集

  • 数据来源:研究者从多个公开的竞赛编程平台收集问题,包括AIZU、AtCoder、CodeChef、CodeForces、Codewars、GeeksForGeeks、HackerEarth、HackerRank、Kattis和LeetCode等。这些平台涵盖了不同难度级别的编程问题。
  • 问题总数:从这些平台共收集了 28,904 个独特的编程问题
    在这里插入图片描述
    在这里插入图片描述

2. 去重处理

  • 问题去重:由于不同平台之间可能存在重复的问题,研究者使用 精确匹配(Exact Match) 的方法对收集到的问题进行去重。具体步骤如下:
    • 将所有收集到的问题文本进行逐一比较。
    • 如果两个问题的文本完全一致,则认为它们是重复的。
    • 保留一个副本,删除其他重复的问题。
  • 结果:通过去重处理,最终得到了 28,904 个独特的编程问题,确保了数据集的多样性。

3. 基准测试数据的验证

  • 防止数据泄露:为了避免数据集与基准测试数据之间存在重叠(即防止数据泄露),研究者对收集到的问题进行了严格的验证:
    • 使用 余弦相似度(Cosine Similarity) 计算每个问题与基准测试数据集中问题的相似度,设定相似度阈值为 0.7
    • 对于每个独特的问题,找到基准测试数据集中与其最相似的问题。
    • 使用两个大型语言模型(Llama-3.3-70B-Instruct 和 Qwen2.5-32B-Instruct)作为“裁判”,评估这些相似问题对的语义相似性。
    • 通过人工检查确认这些潜在问题样本(约90个,占数据集的 0.3%)是否为同义替换或语义相似。结果表明,这些样本并非语义相似,因此可以安全地用于后续的解决方案生成步骤。

4. 解决方案生成

  • 生成解决方案:使用 DeepSeek-R1 模型为每个独特的问题生成多个解决方案。生成的解决方案主要使用Python语言,部分问题还生成了C++语言的解决方案。
  • 注入推理痕迹:在生成解决方案时,通过注入 <think> 标签,强制模型生成推理过程(reasoning traces),以便更好地理解模型的思考过程。

5. 后处理与数据清洗

  • 验证推理痕迹:检查生成的解决方案是否包含 <think></think> 标签之间的推理痕迹。如果存在,提取这些推理痕迹。
  • 代码块验证:进一步验证解决方案中是否存在代码块(通过检查是否包含 ```python …``` 或 ```cpp …``` 标记)。如果推理过程中包含代码块,则将其移除,以简化基准测试的评估。
  • 语法检查:使用 Tree Sitter 工具对代码块进行语法检查,确保生成的代码在语法上是正确的。
  • 最终数据集:经过上述步骤,最终得到了 736,712 个 Python 样本355,792 个 C++ 样本

6. 数据扩展与分阶段验证

  • 分阶段扩展数据集:为了验证数据规模对模型性能的影响,研究者分阶段扩展数据集,从 25k 样本逐步扩展到 736k 样本
    • 初始阶段:仅使用 CodeContests 中的 13k 问题,生成解决方案。
    • 中间阶段:针对 LiveCodeBench 中的 hard 难度问题,生成更多解决方案。
    • 最终阶段:整合更多问题,生成最终的 28k 独特问题集,并生成解决方案。
  • 结果:通过分阶段扩展数据集,研究者发现模型性能随着数据规模的增加而显著提升,尤其是在处理多样性和难度较高的问题时。

通过上述数据清洗和去重步骤,OpenCodeReasoning 数据集确保了问题的多样性和独特性,同时避免了数据泄露的风险。这些步骤为后续的模型微调和性能验证提供了高质量的数据基础。

实验分析

实验结论

  • 模型微调:研究者使用 Qwen2.5 基础模型(7B、14B 和 32B 参数规模)在 OpenCodeReasoning 数据集上进行微调,并在 LiveCodeBench 和 CodeContests 基准测试中评估性能。
  • 性能提升
    • 7B 模型:OCR-Qwen-7B-Instruct 在 LiveCodeBench 上达到了 51.3% 的通过率,比同规模的 R1-Distill-Qwen 模型高出 13.7%
    • 14B 模型:OCR-Qwen-14B-Instruct 在 LiveCodeBench 上达到了 59.4% 的通过率,超越了其他同规模的 SFT 模型。
    • 32B 模型:OCR-Qwen-32B 在 LiveCodeBench 上达到了 61.8% 的通过率,仅略低于 DeepSeek-R1 的 65.6%,显著缩小了与顶级模型的差距。
  • 数据规模的影响:论文通过逐步扩展数据集规模(从 25k 到 736k 样本),证明了大规模数据对模型性能的显著提升作用。

深入分析

  • 执行过滤的影响:通过对比正确和错误解决方案对微调模型性能的影响,发现错误解决方案在更具挑战性的问题上提供了积极的迁移效果。
  • 多语言解决方案的影响:研究发现,将 C++ 解决方案纳入数据集可以显著提升 C++ 编程任务的性能,但对 Python 任务没有显著影响。
  • 推理长度与模式:分析了模型在不同难度任务上的推理长度和模式,发现:
    • 更困难的问题需要更长的推理过程。
    • 正确解决方案中更频繁地出现 自我评估子目标生成 等模式,而错误解决方案中则更多地出现 回溯探索性模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值