03. 预训练数据的配比策略怎么设计?域、语言、任务类型如何权衡?
整理预训练数据配比策略、域/语言/任务权衡与动态调度。
简单回答
预训练数据配比指的是不同来源、不同域、不同语言的数据在总训练数据中所占的比例。配比对模型能力分布有直接影响——代码数据多了逻辑和代码能力强,数学数据多了数学推理强。配比策略通常先靠直觉和经验设定初始比例,再通过小规模消融实验验证,最终在大规模训练中按动态调度执行。没有通用最优配比,要根据目标任务和用户群体来定。
详细解答
配比为什么重要
预训练数据的配比直接决定了模型在不同能力维度上的"天花板"。一个很直观的例子:如果训练数据里只有 0.1% 是数学相关的内容,那不管模型有多大、训练多久,它在数学推理上都很难有突破性表现。反过来,如果代码比例太高,模型在自然语言对话上可能会显得生硬。
LLaMA 系列、Mistral、Qwen 等主流模型的技术报告里都有对数据配比的描述,虽然不会把配比精确到小数点,但基本思路是公开的。比如 LLaMA 2 在训练数据里代码数据占了较大比例,这被认为是它数学推理能力比第一代有明显提升的原因之一。
域配比:不同数据源的权重
常见的数据域包括网页(网页爬取)、书籍、代码、学术论文、百科、新闻、社交媒体等。网页数据体量最大,通常占总训练数据的 50%~70%,但质量最参差不齐,需要最多的过滤处理。书籍和百科质量高、信息密度大,虽然体量相对小,但通常会做上采样(在训练中多次重复使用),让模型多见这类高质量内容。代码数据对逻辑推理和代码能力贡献显著,近年来在主流模型中比例都有上升趋势,部分模型里代码数据占到 10%~20%。
"域"的边界其实很模糊。一篇技术博客算网页还是算代码?一个 Jupyter Notebook 算代码还是算教程?实际中需要根据文件后缀、内容特征、来源平台等综合判断。
语言配比:多语言的权衡
对于多语言模型来说,语言配比的影响非常显著。英文数据在互联网上占主导,如果按自然分布来,英文可能占 60%~80%,中文可能只有 5%~10%。如果某个语言的代表性太低,模型在这个语言上的能力就会弱很多。
常见的解决方式是做语言上采样——对低资源语言数据做更多重复,让模型见到这些语言的比例高于其在互联网上的自然比例。但上采样也不是越多越好,重复太多会导致模型对这批数据过拟合,反而影响泛化能力。经验上,一份数据重复 3~5 次通常没问题,超过 10 次就需要谨慎。
对于专注某个语言(比如中文)的模型,通常的做法是在继续预训练(Continue Pretraining)阶段,用大量目标语言数据在通用基座模型上做继续训练,同时混入少量英文数据防止跨语言能力退化。
动态配比与 Data Scheduler
在训练过程中,数据配比不一定要固定不变。一个越来越常见的做法是在训练的不同阶段使用不同的数据配比。比如训练前期主要喂高多样性的通用数据打好基础,训练后期("cooldown 阶段")集中喂高质量数据做质量提升。LLaMA 3 的技术报告就明确提到了这种分阶段的数据调度策略,最后几千亿 token 的训练主要用高质量精选数据,对最终的模型能力提升很显著。
动态配比还可以基于训练信号来调整。如果某个域的损失下降已经饱和(模型学的差不多了),可以减少这个域的比例;如果某个域的损失还在快速下降,可以适当增加。这是一种更精细的在线调度策略,实现复杂度更高,但理论上能提升数据利用效率。
配比确定的实践流程
确定配比很难有"最优解",通常的做法是:先根据目标定性判断(希望模型在代码/数学/对话上各有多强),设定一个合理的初始配比;然后跑一批小规模消融实验(比如 1B 参数的模型,几十亿 token)对比不同配比下各能力的表现;用消融结论修正配比,进行大规模训练。代表性的研究(如 DoReMi、RegMix)也在探索用优化算法自动搜索最优配比,但目前大多数工业实践还是依赖人工经验加小规模实验。
面试时可以这样答
数据配比就是不同来源、不同语言、不同域的数据在训练集里各占多少比例。它对模型能力分布影响很直接——代码多,代码和逻辑推理能力就强;数学数据多,数学推理就好。
实际做配比的思路是:先根据目标定性判断,比如要做一个中文强、代码一般的模型,那中文数据要做上采样,代码比例可以低一点;然后通过小规模消融实验验证——用 1B 参数的小模型跑不同配比,看各个能力维度的变化;最后才放到大规模训练里。
有一个实践上很重要的点:配比在训练不同阶段可以变。LLaMA 3 的经验是训练后期专门跑一个 cooldown 阶段,主要喂高质量精选数据,对最终能力提升很显著。另外对于多语言模型,低资源语言通常要做上采样,但重复次数超过 10 次就要小心过拟合。
常见追问
- 如果发现模型在某个能力上特别弱,怎么通过数据配比来修复?
- DoReMi 这类自动化配比搜索方法的核心思路是什么?
- 上采样次数过多对模型有什么具体影响?怎么判断是否过采样了?