Scaling Data Difficulty:基于难度感知数据筛选的代码大模型强化学习训练 Scaling Data Difficulty: Improving Coding Models via Reinforcement Learning on Fresh and Challenging Problems
MicroCoder 用难度感知数据筛选,让 4B 代码模型 300 步内获得 3 倍提升
前置知识
GRPO(Group Relative Policy Optimization)
GRPO 是一种用于大语言模型强化学习的策略优化算法,它通过在同一 prompt 下采样多个候选解,将组内奖励做归一化后作为优势估计,从而替代传统的 critic 网络。这种方法显著降低了显存开销,被广泛用于 DeepSeek-R1 等模型的训练。在本文中,GRPO 是两个主要训练算法之一,配合 MicroCoder 数据集用于验证数据集质量对训练动态的影响。
理解 GRPO 是阅读本文实验部分的前提,因为作者对比了 GRPO 与其变体 DAPO 在不同数据集上的训练曲线,并展示 MicroCoder 在两种算法下都优于基线。
DAPO(Decoupled Clip and Dynamic Sampling Policy Optimization)
DAPO 是 GRPO 的一个改进变体,移除了 KL 散度损失项以避免对策略的过度约束,并采用高 clip-higher 机制鼓励模型生成更多样化的解,从而在困难问题上更充分地探索。本文中 DAPO 是关键训练算法,其去 KL 设计让模型可以更激进地偏离参考策略,作者专门用它来验证数据集难度对模型上限的影响。
DAPO 是本文实验重点,因为实验显示在 DAPO 下 MicroCoder 的优势被进一步放大(例如 LeetCode Medium +9.7 点,相对提升 +40.4%),这说明数据集选择与算法选择存在协同效应。
LiveCodeBench v6
LiveCodeBench 是 Jain et al.(2025)提出的严格防污染代码生成评测基准,持续从 LeetCode、AtCoder、Codeforces 等平台抓取发布时间晚于模型训练截止日期的题目,划分为 easy/medium/hard 三个难度等级。v6 版本被本文用作主要评估平台,是衡量模型在「未见过」代码题目上真实泛化能力的金标准。
本文核心结论「3 倍性能增益」就是基于 LiveCodeBench v6 的严格未见题目评估得到,理解这一点才能体会为什么作者特别强调 16-gram 去重和 0.22 阈值的去污染管线。
多维难度度量(Multi-dimensional Difficulty Metrics)
多维难度度量是本文提出的一个核心方法论,它将问题的复杂度分解为五个加权维度:问题理解难度(PCD, 5%)、知识广度(KBR, 5%)、算法思维复杂度(ATC, 45%)、实现难度(ID, 35%)、总体难度(OD, 10%)。每个维度使用 1-5 的整数评分,由 LLM 对每个问题独立评估三次取平均作为最终难度分数。这种设计借鉴了 Bloom 教育目标分类、McCabe 圈复杂度和 Halstead 软件度量。
这是本文最重要的方法创新点,理解这五个维度的具体含义(尤其是 ATC 和 ID 的高权重)才能明白为什么单纯依赖平台标签(如 Codeforces 评分)不够、为什么需要 LLM 做主观难度校准。
Predict-Calibrate-Select 框架
Predict-Calibrate-Select 是本文提出的三阶段难度过滤流程:Predict 阶段用 LLM 对每道题做多维难度预测;Calibrate 阶段用模型实际通过率作为 ground truth,把预测分数映射到 easy/medium/hard 三个难度区间(在 LiveCodeBench v6 上找到的最优边界为 2.5 和 2.75);Select 阶段根据校准后的边界过滤掉过易题目。这种框架解决了「难度标签不一致」的根本问题。
理解这一框架是把握本文方法论的关键,它把 LLM 主观打分与模型实际表现挂钩,比传统「pass@k 即难度」的方式更稳定,也比单纯依赖平台标签更准确。
16-gram 相似度去重
16-gram 相似度去重是数据集去污染常用做法,将训练题与测试题按 16 元字符片段做集合相似度计算,超过阈值即视为重叠。本文中作者使用 0.22 的阈值(经 AtCoder 对 LiveCodeBench v6 验证,3% 训练题超阈但零完全相同),这一管线是确保评测可信度的基础设施。
本文的实验结论依赖于评测的「严格未见」前提,如果训练集与测试集有泄漏,所有性能提升都不可信。理解 16-gram 阈值的设定方法才能评判作者实验设计的严谨性。
研究动机
现有代码生成训练数据集普遍存在三类显著缺陷。第一是难度与时效性失衡:当前主流数据集(如 TACO 26K、APPS 10K、CodeContests 13K)中简单题占主导,真正能驱动模型能力提升的难题稀缺;同时大多数数据集缺乏近期题目,模型在预训练中已经「见过」这些老题,泛化收益被高估。第二是格式不一致:训练语料混合了 LeetCode 风格的函数补全和 OJ 风格的标准输入输出,但许多数据集缺乏统一的格式指令,导致模型即使算法正确也会因为输出格式错误而失败。第三是数据质量噪声:网页抓取的问题常包含残缺的题目描述、缺失或不完整的测试用例、无关的广告与链接,直接用于 RL 训练会引入大量假阳/假阴奖励信号。作者特别指出,KodCode 等合成数据集虽然规模达 447K 三元组,但生成内容在多样性和难度分布上仍不理想,且自验证流水线倾向于删除验证失败的难题,进一步加剧了「难题被过滤掉」的偏差。
本文的目标是本文的核心目标是构建一个以「难度高、时效新、质量严」为核心特征的真实竞赛编程数据集,并配套一套可复用的数据加工与难度过滤流程。具体目标包括三方面:(1)设计一个端到端的四阶段数据处理框架(Collect→Process→Filter→Verify),系统化解决格式不一致、噪声、难题过滤等问题;(2)提出基于 LLM 多维难度评分的自动过滤方法,把主观难度预测与模型实际通过率校准对齐,让「难题」这一概念不再依赖平台标签;(3)发布 MicroCoder 数据集,包含 1.33 万道精选的真实竞赛题,覆盖 AIZU、AtCoder、Codeforces、Kattis、CodeChef 等多个平台,强调近期性(recency)和挑战性,作为强化学习训练的高质量语料。
与已有工作不同的是,本文的独特切入角度是把「数据难度」作为一个独立、可度量的工程变量来系统化处理,而不是把它当作事后评估的附属品。区别于已有工作的三个关键点:(1)此前数据集的难度评估要么完全依赖平台标签(Codeforces 评分、AtCoder 色阶),要么仅用模型的 pass@k 单一指标,本文首次提出 LLM 多维难度矩阵 + 模型校准的方案;(2)此前数据处理流程是分散的,本文的四阶段框架将翻译、去噪、测试用例生成、格式统一、难度过滤整合为一条可解释流水线;(3)此前关于「数据难度 vs 模型能力」的研究多为经验观察,本文在 LiveCodeBench v6 严格未见测试集上用 4B/8B/14B 多个模型规模做了系统消融,并提供量化的难度-性能曲线证据。
核心方法
本文方法的核心直觉是:对于强化学习训练来说,「难」和「新」比「大」更重要。直觉上,模型在已经掌握的简单题上 RL 训练只能产生低梯度信号,无法推动策略更新;而新出现的、模型做不出来的题才能真正激发探索,产生有用的策略改进。基于这一观察,作者设计了两条互补的技术路线:四阶段数据处理流水线保证「质」,Predict-Calibrate-Select 难度过滤保证「难」。两者结合产出了 MicroCoder 1.33 万道精选题。技术路线上,首先从开源数据集(TACO、OlympicCoder、KodCode、DeepCoder)和私有抓取(AIZU、AtCoder、Codeforces、Kattis、CodeChef)收集原始语料;然后通过翻译、噪声去除、测试用例优化、格式统一四个核心步骤做标准化;接着用硬性约束(仅文本、可去重、严格未见)和自适应约束(LLM 多维难度评分 + 模型校准)做两层过滤;最后保留约 1.33 万道高难度近期题用于训练。
本文核心创新是 Predict-Calibrate-Select 自动难度过滤框架,其本质是用 LLM 主观打分替代平台标签作为难度代理,并通过模型实际通过率做后验校准,使难度分数具备可解释性和可调性。与已有方法的本质区别有三:(1)相对 AceCoder 等基于自动测试用例生成的方案,本文用 LLM 评分更便宜、更快,且评估的是问题本身的认知复杂度而非测试充分性;(2)相对 OpenCoder 等用教师模型生成再自验证的方案,本文保留了真实题目而非合成题,更贴近实战分布;(3)相对 KodCode 等「验证失败就丢弃」的方案,本文选择保留并显式建模难题,把难题从「噪声」变为「信号」。另一个关键设计是五维难度矩阵的权重分配——算法思维复杂度(ATC)45% 和实现难度(ID)35% 占据 80% 权重,作者通过认知科学和软件工程理论论证这种分配对代码生成能力培养最有效。
方法步骤详情
四阶段数据处理框架的具体步骤如下。Collect 阶段:从 TACO、KodCode、OlympicCoder、DeepCoder 等开源数据集以及 AIZU、AtCoder、Codeforces、Kattis、CodeChef 等私有抓取池中收集原始题目,最大化来源多样性。Process 阶段:包含五个核心操作——(a) 翻译,把日语等非英语题目翻译为英文以统一接口;(b) 噪声去除,处理图片缺失(影响理解)、数学公式残缺、表格/图形不完整、网页广告/链接、无关内容、题目描述不完整等质量问题,对无法修复的题目直接删除;(c) 测试用例优化,对有参考解但无测试用例的题用 LLM 生成测试用例(无法解题但能造边界用例),对测试用例过多(百级)的题选择最长的 15 个(基于「长度≈难度」假设);(d) 格式统一,除 Codeforces 保留原生格式外,其余统一为 LiveCodeBench 格式以解决函数补全 vs I/O 风格不一致问题;(e) 16-gram 去重,阈值 0.22。Filter 阶段:硬性要求包括「仅文本可解」「去重后唯一」「相对测试集严格未见」;自适应要求则调用 GPT-4O 用多维难度矩阵对每道题独立评分三次取平均。Verify 阶段:人工验证题目可读性、完整性与测试用例准确性,端到端产出 1.33 万道精选题。Predict-Calibrate-Select 流程的输入是待过滤题集,Predict 步骤对每道题用 GPT-4O 评 5 维 × 3 次取均值得到难度分数 $\bar{d}_i \in [1,5]$;Calibrate 步骤在子集上用 Qwen-3-4B-thinking 做 4 次推理,以平均通过率作为 ground truth 难度,画出预测 vs ground truth 散点图找到最优分割阈值(在 LiveCodeBench v6 上确定为 2.5 与 2.75);Select 步骤删除分数 < 2.5 的题目(占总题数 30%,其中超过 65% 是 easy 题),保留中等及以上难度题,使最终数据集 easy 占比从 ~40% 降至 < 20%,hard 占比升至 > 50%。
技术新颖性
本文技术新颖性主要体现在三个层面。方法层面,Predict-Calibrate-Select 是首个把 LLM 主观难度评分与模型实际表现系统耦合的过滤方案,五维难度矩阵的权重设计借鉴 Bloom 教育目标分类(认知层级)、McCabe 圈复杂度(代码结构复杂度)、Halstead 软件科学度量(实现难度),并通过 (ATC 45%, ID 35%, OD 10%, PCD 5%, KBR 5%) 的权重组合聚焦推理与实现能力,这是相对此前工作最有理论支撑的设计。数据层面,MicroCoder 是首个明确以「近期性 + 难度」为筛选标准、且明确报告「简单题比例大幅降低」的竞赛编程数据集;t-SNE 聚类分析显示私有抓取与开源数据集在表示空间中分离良好,提供互补覆盖而非冗余;cosine 相似度分析显示训练集与 AtCoder/LeetCode/LiveCodeBench 三个测试基准的相似度均低于 0.15,验证零泄漏。评测层面,本文在 1.7B/4B/8B/14B 四个模型规模、GRPO/DAPO 两种算法上做了系统消融,并明确报告了「规模越大收益越大」的趋势(4B 模型 +4.4 点 vs 14B 模型绝对收益继续扩大),这种规模敏感性分析在以往数据集论文中并不常见。
实验结果
本文在 LiveCodeBench v6(包含 AtCoder、LeetCode 严格未见题)上做了全面评估,核心发现可归纳为五点。第一,MicroCoder 在相同训练步数下显著优于 DeepCoder 基线:在 Qwen3-4B + DAPO 配置下,MicroCoder 取得 AtCoder 42.2%、LeetCode 38.1%、LiveCodeBench 40.7% 的整体准确率,相比 DeepCoder 分别提升 +2.5、+5.6、+3.6 点,相对提升 6.3%、17.2%、9.9%;在 Qwen3-4B + GRPO 配置下整体提升 +2.0~+2.2 点,相对增益 3-7%。第二,300 训练步内即可观察到 3 倍以上性能增益,说明难题驱动的训练信号更高效。第三,难度分层分析显示收益主要集中在 medium 和 hard 题目上:在 4B+DAPO 下,MicroCoder 相对 DeepCoder 在 LeetCode Medium 上提升 +9.7 点(相对 +40.4%),在 LiveCodeBench Hard 和 AtCoder Hard 上分别提升 +22.0% 和 +20.7%,而 easy 题目上提升有限(接近性能天花板)。第四,规模可扩展性:在 1.7B/4B/8B/14B 四个模型上 MicroCoder 全部优于 DeepCoder,且在 8B 和 14B 上的绝对收益(如 14B 上 AtCoder Hard +4.2、LeetCode Hard +4.8)大于 4B 模型,验证「模型能力越强,难题训练价值越大」的假设。第五,训练动态分析显示 MicroCoder 的训练 reward 反而低于 DeepCoder(因难题更难拿分),但测试准确率持续更高,这直接证明「低训练 reward + 高测试准确率」是难题数据有效的强信号。Component ablation 显示即使在子集规模上(MicroCoder Subset vs OlympicCoder/DeepCoder Subset),1.7B 模型下 MicroCoder 在 AtCoder 和 LiveCodeBench 上仍领先 +0.6~+2.4 点。Filtering Analysis 进一步显示,对 OlympicCoder 应用本文过滤管线可将 AtCoder 从 33.9% 提升到 36.4%(+2.5 点),对 KodCode 可将 LiveCodeBench 从 29.7% 提升到 31.4%(+1.7 点),说明过滤方法本身可推广到其他数据集。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| AtCoder 整体准确率(DAPO, Qwen3 4B, 8K) | accuracy (%) | 42.2 | DeepCoder 38.6 | +3.6 绝对 / +9.3% 相对 |
| LeetCode 整体准确率(DAPO, Qwen3 4B, 8K) | accuracy (%) | 38.1 | DeepCoder 32.1 | +6.0 绝对 / +18.7% 相对 |
| LiveCodeBench 整体准确率(DAPO, Qwen3 4B, 8K) | accuracy (%) | 40.7 | DeepCoder 36.3 | +4.4 绝对 / +12.1% 相对 |
| LeetCode Medium(DAPO, Qwen3 4B, 8K) | accuracy (%) | 33.7 | DeepCoder 24.0 | +9.7 绝对 / +40.4% 相对 |
| LiveCodeBench Hard(DAPO, Qwen3 4B, 8K) | accuracy (%) | 12.2 | DeepCoder 10.0 | +2.2 绝对 / +22.0% 相对 |
| AtCoder Hard(DAPO, Qwen3 14B, 8K) | accuracy (%) | 17.5 | DeepCoder 13.3 | +4.2 绝对 / +31.6% 相对 |
| AtCoder 整体准确率(DAPO, DS 8B, 16K) | accuracy (%) | 35.9 | DeepCoder 34.8 | +1.1 绝对 / +3.2% 相对 |
| LiveCodeBench 整体准确率(DAPO, Qwen3 1.7B, 4K) | accuracy (%) | 22.0 | OlympicCoder 19.6 | +2.4 绝对 / +12.2% 相对 |
| AtCoder 过滤前后(OlympicCoder, 8B, DAPO) | accuracy (%) | OlympicCoder Filtered 36.4 | OlympicCoder 33.9 | +2.5 绝对(验证过滤管线可迁移) |
| LiveCodeBench 过滤前后(KodCode, 8B, DAPO) | accuracy (%) | KodCode Filtered 31.4 | KodCode 29.7 | +1.7 绝对(验证过滤管线可迁移) |
局限与改进
作者明确指出的局限性包括:(1)覆盖范围上目前仅支持英语问题,未来可扩展到多语言;(2)维度设计上五个固定权重可能不适用于所有模型,需要针对不同模型规模做权重调整;(3)应用范围目前聚焦代码生成,未直接验证程序修复、代码翻译等任务。作者虽未明说但从实验数据可观察到的局限:(1)困难度提升主要来自 medium/hard 题,easy 题提升已饱和(4B 下 AtCoder Easy 仅 99.0%,几近天花板),说明 MicroCoder 对不同难度的边际收益不均;(2)在 8B 模型上的绝对收益(+1.1~+2.2 点)小于 4B(+2.5~+6.0 点)和 14B(+1.8~+4.0 点),可能因为 8B 模型与 DAPO 算法的协同性较弱,或受训练随机性影响;(3)依赖 GPT-4O 做难度评分,闭源 API 成本高且不可复现,且评分质量受 LLM 能力上限制约;(4)训练时最大响应长度仅 8K token,对于 AtCoder 难题(很多需要 1k+ 行代码或长链推导)可能成为瓶颈;(5)数据集仅 1.33 万题,相比 KodCode 的 447K 三元组规模小两个数量级,作者未充分讨论小规模数据集在多轮 RL 训练中是否会出现过拟合风险。
独立分析的弱点
从独立视角分析,本文有四个值得注意的弱点。弱点一:评测协议的潜在偏差。训练 reward 与测试准确率出现明显背离(MicroCoder 训练 reward 低于 DeepCoder 但测试准确率更高),这本来是支撑论文核心结论的关键证据,但作者未提供该现象在不同模型/算法上的稳健性测试(如多次随机种子),也未排除「训练 reward 本身定义不佳」这一替代解释。改进方向:报告多次实验的均值与方差,并提供 reward 分布的可视化以排除异常值影响。弱点二:难度评估的循环依赖。Predict-Calibrate-Select 中的 calibrate 步骤使用 Qwen-3-4B-thinking 作为 ground truth 提供者,这意味着「难题」的最终定义与该模型的能力绑定——对 14B 模型可能偏易、对 1.7B 模型可能偏难,导致难度分数在不同规模下不具可比性。改进方向:使用多模型集成作为 ground truth,或训练一个独立的难度预测器。弱点三:可比基线数量有限。主要对比对象是 DeepCoder,仅在 DAPO 配置下补充了 APPS、CodeContests、KodCode RL、KodCode Instruct、OlympicCoder 等,但这些基线本身的训练配置(如超参、训练步数)未严格对齐到 MicroCoder 相同的设置,存在「基线未充分调优」的可能。改进方向:所有基线在完全相同的训练配置下重新训练并报告最优结果。弱点四:数据集规模瓶颈。1.33 万题在 GRPO/DAPO 训练中经过多轮采样后样本多样性可能不足,特别在 14B 大模型上仅观察到 300 训练步的结果,未报告更长训练(如 1000 步)下是否会出现饱和或退化。改进方向:扩展数据集规模至 5 万以上题目,或在长训练下报告性能曲线。
未来方向
作者明确提出的未来方向包括:(1)将框架扩展到多编程语言(Python 之外),覆盖 C++、Java、JavaScript、Go 等竞赛主流语言;(2)针对不同模型规模和能力定制难度维度权重,做模型专属的难度评估;(3)把难度感知过滤推广到代码相关任务,如程序修复(bug fixing)、代码翻译(code translation)、代码解释(code explanation)等;(4)开发动态难度评估机制,让训练过程中的难度边界随模型能力变化自适应调整。基于本文成果,可延伸的方向还有:(1)将 LLM 难度评分与模型自身的不确定性估计(如 token entropy)结合,做无需外部 LLM 的轻量级难度过滤;(2)探索困难度梯度训练(curriculum learning),按难度从易到难或反之做课程式 RL;(3)把 MicroCoder 与 OpenCoder 等开源数据集做联邦去重,产出更大规模的「难度感知」代码训练语料;(4)研究难题训练对模型内部电路(如 attention head 专门化)的影响,从可解释性角度解释为什么难题训练更有效。
复现评估
可复现性方面表现良好但仍存在挑战。优点:(1)作者明确公布了项目页 https://github.com/ZongqianLi/MicroCoder,承诺开源数据集与代码;(2)数据处理流程的每一步(翻译、噪声去除、测试用例生成、格式统一、难度过滤)都有详细参数说明,包括 16-gram 阈值 0.22、难度边界 2.5/2.75、ATC/ID 等权重数值;(3)训练配置完全公开:Qwen3-4B/Instruct-2507 起点、8K 上下文、最大响应长度 8K tokens、temperature 1.2、batch size 64、learning rate 1e-6、每题 8 样本、二元 0/1 准确率奖励;(4)评测使用 LiveCodeBench v6 官方框架和执行基础设施,标准化程度高。不足:(1)依赖闭源 GPT-4O API 做难度评分,复现者需要付费调用且无法保证评分一致性;(2)私有抓取数据(来自 AIZU、AtCoder 等平台的「私人收藏」)可能涉及版权与访问权限问题,部分数据可能无法完全公开;(3)训练算力需求未明确报告,但从 1.7B 到 14B 模型规模、300 步训练来看,至少需要数十到数百块 A100/H100 GPU 小时;(4)未提供预训练 checkpoint,复现者需要从 Qwen3 基础模型重新训练;(5)评估结果缺乏多次随机种子的方差报告,单次实验结果的统计显著性难以评估。整体复现难度为中等偏高,主要门槛在算力和 GPT-4O API 依赖。
论文图表