SmolLM2:小模型,大能量——多阶段训练与高质量数据助力1.7B模型超越同级

SmolLM2以17亿参数的小模型,通过多阶段训练和高质量数据,在多项测试中超越同等规模甚至更大规模的模型,证明小模型也能有大能量。

原文标题:SmolLM2:多阶段训练策略优化和高质量数据集,小型语言模型同样可以实现卓越的性能表现

原文作者:数据派THU

冷月清谈:

SmolLM2 通过创新的四阶段训练策略,结合高质量数据集,在 1.7B 参数规模下实现了卓越的性能表现。该模型在 MMLU-Pro 等测试中超越 Qwen2.5-1.5B,数学推理能力优于 Llama3.2-1B,并在代码生成和文本重写任务中展现出色表现,同时支持 8K tokens 的长文本处理能力。其成功关键在于:

1. **优化的预训练数据集构建与分析**:采用 FineWeb-Edu 和 DCLM 数据集,分别侧重教育价值和对话内容,并通过混合比例优化,形成高质量英语文本语料库。
2. **数学和代码专业数据集的构建**:针对现有数据集的不足,开发了 FineMath 和 Stack-Edu 数据集,提升了模型在数学推理和代码生成方面的能力。
3. **多阶段训练策略**:通过监控关键基准指标,动态调整数据集混合,在后期阶段对高质量数学和代码数据进行上采样,并控制数据重复,从而优化模型的通用认知、专业能力和指令遵循表现。
4. **上下文长度扩展优化**:在训练后期,将上下文长度扩展至 8k tokens,提升了模型处理长文本的能力。
5. **模型后训练优化**:使用 SmolTalk 数据集进行监督微调,并采用直接偏好优化(DPO)方法进行模型对齐,进一步提升了模型的指令遵循能力和专业任务处理能力。

此外,研究团队还开发了 SmolLM2 的小规模变体模型,为资源受限场景下的模型部署提供了可能,进一步拓展了其应用前景。

怜星夜思:

1、SmolLM2 的多阶段训练策略非常有趣,但实际应用中,如何根据不同的任务和数据集,动态调整各个阶段的数据混合比例呢?有没有一些通用的原则或者启发式方法?
2、文章中提到 SmolLM2 通过高质量数据集提升了性能,那么如何量化数据集的质量?除了文章中提到的方法,还有哪些其他的评估指标和技术?
3、SmolLM2 在小规模变体研究中采用了单阶段训练方法,这与 1.7B 版本的多阶段策略不同。那么,对于不同规模的模型,选择单阶段还是多阶段训练策略,有哪些考量因素?

原文内容

本文约2200字,建议阅读5分钟
本文介绍了多阶段训练策略优化和高质量数据集。


SmolLM2 采用创新的四阶段训练策略,在仅使用 1.7B 参数的情况下,成功挑战了大型语言模型的性能边界:

  • 在 MMLU-Pro 等测试中超越 Qwen2.5-1.5B 近 6 个百分点
  • 数学推理能力(GSM8K、MATH)优于 Llama3.2-1B 
  • 在代码生成和文本重写任务中展现出色表现
  • 支持 8K tokens 的长文本处理能力

这些成果得益于其精心设计的多阶段训练方法:通过在约 11 万亿 tokens 的优质数据上,逐步优化模型的通用认知、专业能力和指令遵循表现。研究团队还特别构建了 Fine-Math、Stack-Edu 和 SmolTalk 等专业数据集,进一步提升了模型在数学推理、代码生成等关键领域的性能。


这一研究证明,通过优化的训练策略和高质量数据集,小型语言模型同样可以实现卓越的性能表现


预训练数据集构建与分析


基础训练数据评估方法


为了评估不同英语网络数据集的效果,并确定最优的训练数据组合,研究团队采用了统一的实验条件:使用 2048 的序列长度,在每个数据集上训练 1.7B 参数规模的模型。每个数据集的消融实验均在随机采样的 350B tokens 上进行。

考虑到数学和编程能力通常需要经过大量训练才能体现,在评估这两类专业数据集时,研究团队采取了以下策略:基于 SmolLM2 在 3T tokens 训练后的中期检查点进行评估,主要使用网络数据进行预训练,并采用退火训练策略。

具体而言,在数学领域,研究团队在 60B tokens 的评估数据集和 40B tokens 的预检查点混合数据上进行退火训练;在代码领域,他们在 200B tokens 上进行退火训练,数据均匀分布于 15 种主流编程语言(每种语言约 14B tokens)。

英语网络语料库优化



研究团队重点优化了两个核心数据集:FineWeb-Edu 和 DCLM。

FineWeb-Edu 数据集包含 1.3T tokens,它使用了 Llama3-70B-Instruct 训练的分类器进行筛选,重点保留具有教育价值的内容。DCLM 数据集包含 3.8T tokens,它采用了基于 OpenHermes 2.5 指令数据和 r/ExplainLikeImFive subreddit 高质量帖子训练的 fastText 分类器进行筛选,保留了多样化的对话式内容。

评估结果表明,FineWeb-Edu 在教育类基准测试(MMLU、ARC、OpenBookQA)上表现优异,而 DCLM 在 HellaSwag 和 CommonsenseQA 等场景理解任务上具有优势。基于互补性分析,研究团队最终确定了 60% FineWeb-Edu 和 40% DCLM 的最优混合比例,总计形成了 5.1T tokens 的高质量英语文本语料库。

数学专业数据集优化



现有数据集分析


OpenWebMath (OWM) 和 InfiMM-WebMath 是两个重要的基础数学数据集。OWM 包含 12B tokens,通过从 Common Crawl 中提取特定数学内容构建,采用专门的文本提取管道保留数学公式和格式。InfiMM-WebMath 包含 40B 文本 tokens,在 GSM8K 测试中达到 14% 的准确率,相比 OWM 的 10% 有所提升,但在 MATH 测试中略逊于 OWM。

FineMath 数据集构建


针对现有数据集在规模和质量上的不足,研究团队开发了 FineMath 数据集,总计包含 54B tokens。其构建过程如下:首先,从 Common Crawl WARC 文件中提取文本,重点关注 FineWeb 数据集中的 5.8B 个唯一 URL,并使用 Llama-3.1-70B-Instruct 进行三级评分(1-3分)。

在质量控制流程中,研究团队采用分类器识别高质量数学内容,使用 5 分制评分系统,重点关注推理过程和适龄内容,应用 MinHash LSH 进行去重,并使用 fastText 进行语言筛选,仅保留英语内容。

最终,研究团队构建了多个数据集变体,包括 FineMath4+(10B tokens,6.7M 文档,仅包含 4-5 分样本)、FineMath3+(34B tokens,21.4M 文档,包含 3-5 分样本)、InfiWebMath4+(8.5B tokens,6.3M 文档)和 InfiWebMath3+(20.5B tokens,13.9M 文档)。

编程代码数据集优化



Stack 数据集系列分析


现有的主要代码数据集包括 Stack v1(约 3TB 公共 GitHub 仓库代码)、StarCoderData(经过筛选的 80 种编程语言子集,250B tokens)、Stack v2(来自 Software Heritage 的 32TB 代码存档)和 StarCoder2Data(包含 600+ 种编程语言,900B tokens)。

Stack-Edu 数据集构建


为了提升代码质量和教育价值,研究团队开发了 Stack-Edu 数据集。在基础构建阶段,他们从 StarCoder2Data 中选择了 15 种主要编程语言,初始数据规模约为 450B tokens。

在质量筛选流程中,研究团队使用 StarEncoder 模型训练了 15 个语言特定分类器,基于 Llama3-70B-Instruct 生成的合成注释进行 0-5 分评分,并采用阈值 3 进行筛选。最终,精选后的 Stack-Edu 数据集包含约 125B tokens,均衡覆盖 15 种目标编程语言。

预训练策略与实现



SmolLM2 的训练过程采用了总计 11T tokens 的多阶段训练方法,而不是使用固定的数据混合比例。这种设计基于以下四个核心原则:性能驱动干预、高质量数据退火、战略性数据引入和控制数据重复。具体来说,研究团队持续监控关键基准指标,动态调整数据集混合以解决特定能力瓶颈;在后期阶段对高质量数学和代码数据进行上采样,以最大化其影响力;在训练中期引入中等规模数据集(如 OWM、InfiMM-WebMath 和 Stack-Edu),避免被大型数据集稀释;并将大多数数据集保持在推荐的 4-5 个 epoch 阈值内。


第一稳定阶段(0-6T tokens)


在第一稳定阶段(0-6T tokens),研究团队使用的数据混合配置为 60% FineWeb-Edu(教育类网络数据)、40% DCLM(多样化问答式网络数据)和 10% StarCoder-Data(限制在约 4 个 epoch)。由于数据规模限制,该阶段暂不包含数学数据。观察结果表明,知识和推理能力符合预期,但数学和编程能力较弱。

第二稳定阶段(6T-8T tokens)


在第二稳定阶段(6T-8T tokens),研究团队对数据混合进行了调整,将英语网络数据比例提升至 75%(保持前期 FineWeb-Edu/DCLM 比例),StarCoder-Data 比例提升至 20%,并首次引入了 5% 的 OWM 数学数据。结果表明,编程能力普遍提升,MMLU 准确率超过随机水平(>25%),展现出通常需要更大模型才具备的能力。进一步分析表明,适度增加 DCLM 比例可改善 MMLU MCF 性能。

第三稳定阶段(8T-10T tokens)


在第三稳定阶段(8T-10T tokens),研究团队对数据混合进行了优化,将英语网络数据 FineWeb-Edu/DCLM 比例调整为 40/60,数学数据比例提升至约 10%(OWM 和 InfiMM-WebMath 英语部分),从 StarCoderData 切换到 Stack-Edu,并对小语种补充 StarCoder2Data,同时引入 Jupyter Notebooks 增强上下文示例。结果表明,多项基准测试均有改善,出现了暂时的损失峰值但随后恢复。

第四衰减阶段(10T-11T tokens)


在第四衰减阶段(10T-11T tokens),研究团队使用的最终数据混合为 58% 英语网络数据(维持较高 DCLM 比例)、24% Stack-Edu(扩展语言覆盖)、14% 数学数据(InfiWebMath-3+、FineMath 4+等)和 4% Cosmopedia v2(高质量合成文本)。结果表明,模型实现了全面性能提升,特别是数学和编程能力显著进步。

上下文长度扩展优化


在第四阶段末期(最后 75B tokens前),研究团队基于中间检查点将上下文长度扩展至 8k tokens,采用 130k RoPE 基数,并使用 40% 长文档(8k+ tokens)和 60% 保持原混合比例的数据进行训练。此阶段产出了最终的 SmolLM2 基础模型。

模型后训练优化


SmolTalk 是一个综合性指令调优数据集,包含会话数据和专项任务数据两部分。

在会话数据优化方面,研究团队使用 Llama-3.1-405B-Instruct-FP8 生成了 1M 个三轮会话,并进行了多层级质量控制,包括 Llama-Guard-3-8B 安全过滤、ArmoRM 质量评分和 gte-large-en-v1.5 去重。

在专项任务数据方面,SmolTalk 整合了 Smol-Constraint(36k 约束指令集)、Smol-Summarization/Rewrite(基于 PersonaHub 的高质量文本生成)、数学指令(整合 NuminaMath-CoT 和 Meta-MathQA),以及专业领域补充数据,如代码生成(Self-OSS-Starcoder2-Instruct)、系统提示(SystemChats2.0)、API调用(APIGen-Function-Calling)和长文本处理(LongAlign英语子集)。

监督微调与对齐优化



监督微调实现


研究团队在 SmolTalk 数据集上对基础 SmolLM2 进行了 2 个 epoch 的监督微调,采用 8192 的序列长度进行训练。

对齐优化过程


研究团队采用直接偏好优化(DPO)方法进行模型对齐,并评估了多个公共合成反馈数据集,包括 UltraFeedback、UltraInteract、Capybara 和 ORCA。结果表明,UltraFeedback 在各项基准测试中表现最优,显著提升了 MT-Bench 性能、MMLU-Pro 得分和 MATH 测试结果。完成 2 个 epoch 的 DPO 训练后,研究团队得到了最终的 SmolLM2-instruct 模型。

全面性能评估


基础模型评估结果



在通用能力方面,SmolLM2 在 HellaSwag 和 ARC 测试中超越了 Qwen2.5 基础模型,在 GSM8K、MATH 和 HumanEval 等测试中优于 Llama3.2-1B,在 MMLU-Pro 上比 Qwen2.5-1.5B 高出近 6 个百分点。在专业领域表现方面,SmolLM2 在数学和编程基准测试中展现出极具竞争力的性能,虽在个别领域略逊于 Qwen2.5-1.5B,但整体表现均衡。在扩展能力验证方面,上下文长度扩展未对模型性能造成明显影响,SmolLM2 在 HELMET 和 NIAH(大海捞针)基准测试中表现优异。

指令调优模型评估



SmolLM2 的核心优势在于指令遵循能力和专业任务处理能力。在指令遵循能力方面,SmolLM2 在 IFEval 测试中显著优于 Qwen2.5-1.5B-Instruct。在专业任务处理方面,SmolLM2 在 MT-Bench 和 OpenRewrite-Eval 等文本重写任务中表现出色,并通过 GSM8K 和 MATH 分数验证了强大的数学推理能力。

SmolLM2 小规模变体研究


模型规格与训练策略


研究团队还开发了两个小规模变体模型:SmolLM2-360M 和 SmolLM2-135M。SmolLM2-360M 的参数规模为 360M,训练规模为 4T tokens;SmolLM2-135M 的参数规模为 135M,训练规模为 2T tokens。

优化方法创新


在数据混合策略优化方面,研究团队基于目标训练长度重新进行了数据消融实验,并对 DCLM 数据集进行了精细筛选,删除评分为 0 的样本,并对评分为 1 和 2 的样本进行下采样。

在训练方法调整方面,研究团队采用了单阶段训练方法,区别于 1.7B 版本的多阶段策略,并从训练初期即引入高质量数据,包括 Stack-Edu、InfiMM-WebMath、FineMath 和 Cosmopedia。

在架构特征方面,这两个小规模变体模型继承了 SmolLM2-1.7B 的基础架构,并引入了分组查询注意力(GQA)机制。

在后训练优化方面,研究团队使用经过筛选的 SmolTalk3 版本进行 SFT,移除复杂指令任务(如函数调用),筛除 MagPie-Ultra 中的高难度样本,并采用 UltraFeedback 进行 DPO 训练,平衡指令遵循能力与模型连贯性。

总结


综上所述,SmolLM2 通过创新的多阶段训练策略、高质量数据集的构建与优化,以及精细的模型后训练调优,在 1.7B 参数规模下实现了卓越的性能表现,并在多个基准测试中超越了同等规模甚至更大规模的语言模型。这一研究为小型语言模型的发展提供了新的思路和方法,证明了通过技术创新,小模型同样可以拥有强大的能力。同时,SmolLM2 的小规模变体研究也为资源受限场景下的模型部署提供了可能,进一步拓展了其应用前景。

论文链接:

https://arxiv.org/abs/2502.02737


编辑:王菁




关于我们

数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。




新浪微博:@数据派THU

微信视频号:数据派THU

今日头条:数据派THU

除了文章里提到的方法,我觉得还可以借鉴软件测试里的思路。

可以把数据集看作是模型的“测试用例”,然后用不同的模型在数据集上跑,观察模型的表现。如果模型在某些“测试用例”上表现很差,那就说明这些“测试用例”有问题,需要人工review。

另外,还可以考虑使用 adversarial examples 来评估数据集的鲁棒性。如果模型很容易被 adversarial examples 欺骗,那就说明数据集里可能存在一些漏洞。

这个问题问到了点子上!动态调整数据混合比例确实是门艺术。我的理解是,这有点像厨师调味,需要根据菜的口味不断尝试。

从工程角度,可以考虑建立一个监控仪表盘,实时追踪模型在各个 benchmark 上的表现。然后,设定一些阈值,一旦模型的表现超过或低于阈值,就自动调整数据混合比例。当然,这种自动化调整需要谨慎,最好有人工review。

从玄学的角度,可以多和模型“对话”,观察它在不同任务上的反应。有时候,模型会给你一些意想不到的hint,告诉你它更喜欢哪种数据。

从梯度优化的角度来看,单阶段训练相当于一蹴而就,希望一步到位;而多阶段训练则相当于小步快跑,每次只优化一个方向。对于小模型来说,本身参数量就少,梯度更新的方向也比较集中,可能单阶段训练就足够了。但对于大模型来说,参数量巨大,梯度更新的方向也更加复杂,需要多阶段训练来引导模型找到最优解。

另外,多阶段训练也更方便进行模型诊断。如果在某个阶段模型表现不佳,可以及时调整训练策略,避免整个训练过程跑偏。

这是一个很好的问题!动态调整数据混合比例确实需要经验和实验。

一些通用的原则可以参考:

* 早期关注通用能力:优先使用高质量的通用语料(如 FineWeb-Edu、DCLM)打好基础。
* 中期引入专业数据:在通用能力达到一定水平后,逐步增加数学、代码等专业数据的比例,避免被稀释。
* 后期精细调整:根据模型在特定基准上的表现,针对性地调整数据比例。例如,如果数学能力不足,可以增加 FineMath 等数据集的比例。
* 持续监控:训练过程中,需要持续监控模型的性能,一旦发现下降或停滞,及时调整数据混合。

启发式方法:

* 消融实验:可以针对不同的数据集组合进行消融实验,评估其对模型性能的影响。
* 贝叶斯优化:使用贝叶斯优化等自动化方法,搜索最优的数据混合比例。

另外,可以考虑使用 curriculum learning 的思想,先易后难,逐步增加数据的难度。

单阶段和多阶段训练策略的选择,确实需要根据模型规模和计算资源进行权衡。

* 模型规模:对于小规模模型,单阶段训练可能更简单有效,因为模型容量有限,多阶段训练带来的收益可能不明显。而对于大规模模型,多阶段训练可以更好地控制训练过程,逐步提升模型的各项能力。
* 计算资源:多阶段训练需要更多的计算资源,因为需要在不同的阶段训练不同的模型。如果计算资源有限,单阶段训练可能更经济。
* 数据质量:如果数据集质量很高,单阶段训练可能就足够了。但如果数据集质量参差不齐,多阶段训练可以更好地筛选和利用高质量数据。

一般来说,可以先尝试单阶段训练,如果效果不理想,再考虑多阶段训练。

我的理解是,多阶段训练更像是一种“精细化运营”,目的是为了让模型在各个阶段都达到最优状态。但这种“精细化运营”需要耗费更多的资源,包括时间和计算力。

对于小规模模型,可能没有足够的“增长空间”来支撑多阶段训练的成本。就好比小餐馆,与其花心思搞各种营销活动,不如把菜做好更实在。

当然,这也不是绝对的。如果小规模模型的目标非常明确,比如只专注于某个特定任务,那么多阶段训练也可能带来意想不到的效果。

可以从信息论的角度考虑,好的数据集应该包含尽可能多的信息,并且信息分布要均匀。比如,可以计算数据集中token的频率分布,如果某些token出现的频率过高或过低,就可能说明数据集存在问题
也可以用一些无监督学习的方法,比如聚类,把数据集中的样本分成不同的簇。如果某些簇中的样本质量明显低于其他簇,那就说明这些簇需要进一步清洗。

量化数据集质量确实是个难题,文章中提到的方法(如使用 Llama-3.1-70B-Instruct 进行评分、分类器识别高质量内容等)是常用的手段,但还可以从以下几个方面入手:

* 覆盖度:数据集是否覆盖了各种类型的知识和任务?可以使用信息熵等指标来衡量。
* 噪声:数据集中是否存在错误、重复或不一致的信息?可以使用数据清洗工具和人工抽查来评估。
* 偏见:数据集是否存在对某些群体或观点的偏见?可以使用 Fairlearn 等工具来检测。
* 难度:数据集中的样本难度是否适中?可以使用模型在数据集上的表现来衡量。

其他评估技术:

* 专家评估:邀请领域专家对数据集进行评估,提供专业的意见。
* 众包:通过众包平台,让更多的人参与到数据集的评估中。
* 主动学习:使用主动学习算法,选择对模型最有价值的样本进行标注和评估。

与其说是炼丹,不如说是更科学地炼丹,这个问题的本质其实是超参数优化。传统机器学习那一套网格搜索、随机搜索、贝叶斯优化都能用上。主要还是根据实际情况来吧,我觉得与其一开始就all in 自动超参数优化,不如人工先探索一波,根据结果确定搜索空间,然后再交给机器去搞。