论文:https://arxiv.org/abs/2504.11919
机构:中兴智能系统部
时间线:2025/04/16(submitted)
简介
这篇论文提出了一个高质量思维链数据的构建方法,通过分析基础LLM的能力,来划分问题的难度等级,从而来构造数据,有点像是RL阶段中采样复杂/高难度query的思路,值得一看。(写分享不易,如果觉得可以的话,辛苦点个关注,谢谢啦)
Motivation
DeepSeek R1的部署,对于计算成本有着比较高的要求,尤其是满血版671B的参数量,无法直接应用到边缘设备和实时系统上去。所以,论文想通过蒸馏DeepSeek R1的推理链数据,在相对小参数量(<70B)的模型上通过SFT实现推理能力的提升。
但简单收集Question,去蒸馏R1,效果提升有限。所以论文觉得,在收集Question这方面,理应考虑到目标训练LLM的基础能力,就像是教三年级小孩学知识,总不能直接教他高中甚至大学知识吧,虽然这些知识质量很高,但超过了三年级小孩的接受能力。
所以基于这种思路,论文就提出了自适应构建高质量CoT的方法,经过相应的实验验证(仅做了SFT),效果也是非常不错。
Data Pipeline( LLM-Adaptive )
框架概述
图2展示了完整的CoT数据构建的Pipeline,主要分为三个阶段的构建,接下来简单介绍每个阶段的处理过程。
Stage-1:分布构建
Distribution Construction
为实现模型自适应难度分级的问题高效采样,提出两种构建问题难度分布的方法:
- Option1:利用基础LLM( S L L M S_{LLM} SLLM)对评估数据集( D B e v a l DB_{eval} DBeval)进行操作。先通过结果验证器(Result - Verifier)进行答案验证, S L L M S_{LLM} SLLM能正确回答的问题归为简单级别;对 S L L M S_{LLM} SLLM回答错误的问题,用PRM - Grader(基于策略的奖励模型分级器 )进行难度分级,具体分级公式为:
P e v a l = { E a s y , if answer is True G r a d e r ( Q , R ) , if answer is False P_{eval} = \begin{cases} Easy, & \text{if answer is True} \\ Grader(Q, R), & \text{if answer is False} \end{cases} Peval={Easy,Grader(Q,R),if answer is Trueif answer is False
其中 G r a d e r ( Q , R ) Grader(Q, R) Grader(Q,R)表示基于 S L L M S_{LLM} SLLM回答 R R R的难度分级。
- Option2:受课程学习理念启发,将问题难度分为五个级别。假设在模型微调过程中,模型学习相对较难问题比极难问题更容易。按照难度递增样本数量递减原则,构建基于课程学习的自定义分布,用以下公式定义:
P C = N i N t o t a l = w i ∑ j = 1 5 w j , w i > w i + 1 , i = 1 , 2 , . . . , 4 P_{C} = \frac{N_{i}}{N_{total}} = \frac{w_{i}}{\sum_{j = 1}^{5} w_{j}}, w_{i} > w_{i + 1}, i = 1, 2, ..., 4 PC=NtotalNi=∑j=15wjwi,wi>wi+1,i=1,2,...,4
其中 N i N_{i} Ni是难度级别 i i i的问题数量, N t o t a l N_{total} Ntotal是问题总数, w i w_{i} wi是难度级别 i i i的权重 , w i > w i + 1 w_{i} > w_{i + 1} wi>wi+1体现随着难度增加样本数量减少。
Stage-2:LLM自适应问题难度分级与分布采样
LLM - Adaptive Question Difficulty Grading & Distribution Sample
- LLM - 自适应问题难度分级(LLM-Adaptive Question Difficulty Grading)
① 从大规模开源数据集收集原始问题及标准化答案,构建初始问答数据库( D B r a w DB_{raw} DBraw) 。
② 用基础LLM( S L L M S_{LLM} SLLM)生成问题答案,记录回复轨迹和结果。
③ 针对不同任务,使用定制的结果验证器(Result - Verifier ):比如数学推理任务用Math Verifier,对比模型生成答案和标准答案;代码生成任务通过执行代码并测试来验证正确性。
④ 验证正确的答案标记为简单问题,直接加入候选问题数据库;验证错误的问题标记为难题,用基于策略的奖励模型分级器(PRM - Grader)进一步划分难度等级,将难度分为五类。
⑤ PRM - Grader根据 S L L M S_{LLM} SLLM回复轨迹计算平均得分(0 - 1 ),映射到五个离散难度级别,得分越低难度越高,最终将按难度分类的问题纳入候选问题数据库( D B A d a p t i v e DB_{Adaptive} DBAdaptive)。
- 分布采样(Distribution Sample)
① 构建好候选问题数据库后,使用基于分布的采样器(Distribution Sampler),依据上一阶段建立的问题难度分布( P e v a l P_{eval} Peval 或 P C P_{C} PC ),从数据库中采样高质量、模型自适应的问题,公式为:
D B s a m p l e ∼ S a m p l e r ( D B A d a p t i v e , P e v a l ∨ P C ) DB_{sample} \sim Sampler (DB_{Adaptive}, P_{eval} \lor P_{C}) DBsample∼Sampler(DBAdaptive,Peval∨PC)
其中 D B s a m p l e DB_{sample} DBsample为采样问题, D B A d a p t i v e DB_{Adaptive} DBAdaptive为候选问题数据库, P e v a l P_{eval} Peval 、 P C P_{C} PC 为上一阶段确定的两个难度级别分布。
② 分布偏好: P e v a l P_{eval} Peval 是Option1的结果,默认不太理想(不开心表情),因为单纯只基于基础 LLM 对评估数据的处理 ,而Option2依据课程先验构建难度分布,能选出符合模型由易到难学习节奏的问题(开心表情)。
Stage-3:LLM自适应CoT生成
LLM - Adaptive COT Generation
① 获得采样数据库( D B S a m p l e DB_{Sample} DBSample)后,直接使用目标LLM( T L L M T_{LLM} TLLM ,实验中为DeepSeek - R1(671B) ),针对采样问题生成答案及相关推理过程。
② 运用结果验证器(Result - Verifier ,还是之前用的那个),检查并验证生成答案的正确性。
③ 仅挑选答案和推理过程都被验证为正确的问题,组成高质量的思维链(CoT)数据集( C O T A d a p t i v e COT_{Adaptive} COTAdaptive) 。
④ 将严格构建的 C O T A d a p t i v e COT_{Adaptive} COTAdaptive数据集作为训练数据,对基础LLM( S L L M S_{LLM} SLLM)进行微调,得到最终的推理LLM( R L L M R_{LLM} RLLM) 。
Result-Verifier
论文说了,Result-Verifier 针对于不同任务有不同的做法。
① 数学推理任务:原理是直接对比LLM生成的答案和标准答案。
比如在一个求解一元二次方程的题目中,方程为 x 2 − 5 x + 6 = 0 x^2 - 5x + 6 = 0 x2−5x+6=0 ,标准解答步骤是先因式分解为 ( x − 2 ) ( x − 3 ) = 0 (x - 2)(x - 3) = 0 (x−2)(x−3)=0,得出 x = 2 x = 2 x=2或 x = 3 x = 3 x=3。若 S L L M S_{LLM} SLLM生成的答案也是 x = 2 x = 2 x=2或 x = 3 x = 3 x=3 ,经Result-Verifier对比,判定该回答正确;若答案错误,如得出 x = 1 x = 1 x=1或 x = 4 x = 4 x=4 ,则判定回答错误。
② 代码生成任务:原理是通过执行生成的代码,并依据一套测试用例来验证。
假设要生成一段计算两个整数之和的Python代码,测试用例可能包含输入不同整数组合(如1和2、 - 5和10等),期望输出对应的和(3、5等)。若 S L L M S_{LLM} SLLM生成代码如下:
运行代码,输入测试用例中的整数组合,若每次输出都符合预期,Result-Verifier判定代码正确;若代码存在语法错误,或运行结果不符合预期,如把代码写成`def add_numbers(a, b): return a - b`,导致计算结果错误,Result-Verifier则判定代码错误 。
PRM-Grader
论文中未明确阐述PRM - Grader计算平均得分(0 - 1)的具体方式,个人推测它可能从回答的逻辑连贯性、步骤完整性、关键知识点涉及情况等方面考虑打分。
假设在数学推理题里,问题是求解复杂方程。LLM回答时逻辑混乱,比如随意变换运算规则,步骤缺失关键的移项、化简环节,对核心知识点运用错误。PRM - Grader依据这些表现,可能给较低分数。若回答有一定逻辑,部分步骤正确,但关键步骤出错,会给中等分数。要是回答接近正确,只是小瑕疵,就给较高分数 。
实验结果
训练集
- 数学推理:
NuminaMath、historical AIME 和 OlympicArena。
- 代码生成:
TACO 和 CodeForces。
评测集(Benchmarks)
- 数学推理:
① AIME24 和 AIME25:即美国数学邀请赛(American Invitational Mathematics Examination)不同年份的竞赛题,用于评估模型在数学推理任务中的表现。
② MATH500:是 MATH 数据集中选取的具有代表性的 500 道数学题,可衡量模型在数学问题求解上的能力。
③ GPQA:用于评估高级解题能力的研究生水平物理问题数据集,虽涉及物理问题,但也可从侧面反映模型在复杂科学问题推理上的能力。
- 代码生成:
① LiveCodeBench,该基准测试将竞赛编码问题按简单、中等、困难三个难度级别分类,用于评估模型在代码生成任务中的性能 。
Baselines
① phi-4 :由微软开发,14B 参数。它在复杂推理任务,尤其是数学领域表现突出。
② DeepSeek-Distill-R1 :由 Deepseek 开发,基于 Deepseek - R1蒸馏 Qwen 架构的 7B 和 32B 参数模型。
③ Sky-T1-32B-Preview :由 Sky - T1 团队开发,与 Distill-R1- 2B 类似,采用针对数学和代码能力的 1 万个样本。
关键结论
① 【表1&表2】经论文方法训练的不同参数规模 LLMs(如 Zmath 和 Zcode 系列)在数学推理和代码生成基准测试中,相比基线模型(如 phi-4、DeepSeek-Distill-R1 等)性能提升显著,证明了该数据合成方法在不同模型规模和任务领域的有效性。
② 【表3】在使用2K数据训练DeepSeek-Distill-32B并在LiveCodeBench(easy-medium-hard)上评估时,基于过程奖励模型(PRM)的难度分级方法在提升模型性能方面,比无分级和基于单元测试(UT)的难度分级方法更有效。
③【表4】在数学基准测试中,DeepSeek-Distill-7B模型使用自身基于PRM的难度分布训练,比使用从DeepSeek-Distill-32B模型转移的难度分布训练,性能表现更好。
④ 【表5】在训练DeepSeek-Distill-32B模型时,将基于PRM分级的数学训练数据量从1K增加到2K,能使模型在四个数学基准测试中的表现均得到持续提升。
⑤【表6】在使用2K PRM分级数据训练DS-distill-7B时,相比基于人为定义先验分布的Option 2,基于基础LLM从评估数据集推断真实难度分布的Option 1在大多数基准测试中能取得更好的结果,说明使训练分布与评估难度相匹配可带来更好的模型泛化能力。
总结
这篇文章的思路还是比较合理的,经过实验也验证了有效性,但总体上的目标是:使用超大参数模型去对小参数模型觉得比较难的问题进行解答出标准答案,然后再拿去训小参数模型提升数学和代码推理任务上的能力。
所以,这就面临两个问题:
-
论文的方法是否能套用到另外一个超大or接近超大参数模型(但在代码/数学推理方面还不够强)上面去?
-
非数学和代码推理任务能否也能适配目前的Result-Verifier和 PRM-Grader?
感兴趣的同学可以做做实验,分享下结果。
不过拿过去做落地的时候,还有两个问题需要考虑:
-
Option1 和 Option2的难度策略:前者是很依赖基础LLM的回答结果,如果存在系统性的偏差(比如数学推理中的逻辑漏洞),难度分级可能不准确。后者是基于人为定义的课程学习分布,不太能覆盖真实场景中复杂的问题难度梯度,没什么动态调整的空间。
-
方案的灵活性不够:论文是假设基础 LLM 与目标任务的难度分布可通过静态采样匹配,但面对企业里快速迭代的 LLM,需频繁重新构建 Adaptive Question Database,灵活性有待提升。