DoReMi 论文笔记:Optimizing Data Mixtures Speeds Up Language Model Pretraining

4928 字
25 分钟
DoReMi 论文笔记:Optimizing Data Mixtures Speeds Up Language Model Pretraining
摘要

这篇笔记梳理 DoReMi 如何把预训练数据配比从经验调参变成一个可优化的问题。文章从 The Pile 等多领域语料的混合权重讲起,解释为什么依赖人工经验或下游任务反复试训成本很高,然后重点展开 DoReMi 的做法:先用启发式权重训练一个 280M 参考模型,再用 Group DRO 和 excess loss 找到哪些数据域仍有学习价值,最后把得到的 domain weight 直接迁移到 8B 模型训练中。正文也拆解了 minimax 目标、单纯形约束、指数梯度更新和平滑项的作用,并整理了论文中的主要实验:DoReMi 能以较低代理成本带来训练加速,在 The Pile 和 GLaM 上都有稳定收益,但也依赖参考模型质量、领域划分颗粒度和 Group DRO 在代理模型规模上的稳定性。

1. 背景和动机#

用来训练 LLM 的数据集通常是从许多领域混合采样的,比如 The Pile 数据集(由 24%的网络数据、9%的维基百科数据集、4%的Github数据等成分混合而成)。

但这个混合的权重比例通常基于以下2类方法确定的:

  1. 基于人工经验和启发式规则确定,很容易得到次优结果。

  2. 基于一组下游任务(如 PaLM、GLaM等模型采用的方法),但该方法需要训练数千个不同权重的LLM,计算成本极高,泛化性差且过拟合风险高。

基于以上背景,DoReMi 被提出,核心目标是找到一组最佳的数据配比权重,让训练出的模型在所有预训练数据上都有优秀的能力,核心的优化目标是:最小化所有域上的语言建模损失,而非特定下游任务的效果。

2. 核心贡献#

  1. 提出了 DoReMi 算法框架,是首个实现 「小模型优化 domain 权重 → 大模型直接复用」的端到端方案,仅使用 280M 的代理小模型,就能为 30 倍的 8B 参数模型优化出最优的 domain weight,全程也无需任何下游任务数据。

  2. Group DRO 框架 进行了改进,将 DRO 优化目标转化成了 domain weight 的优化,提出基于「excess loss」的优化目标,解决了预训练中 domain weight 的低成本优化问题。

3. 方法论#

3.1 整体概览#

DoReMi 方法整体流程
DoReMi 方法整体流程

如 图 1 所示,这个是整个优化方法的概览图。DoReMi 方法在优化的过程中全程都是用小型模型(280M)进行,这样大幅度节省了算力资源。

首先,使用一些初始的参考权重来训练一个小型的 reference model,作为 Group DRO 优化算法的代理模型。

其次,基于最小化最坏情况的 excess loss 训练一个小型的 distributionally robust language model(DRO-LM)。

这里,本文不再使用 DRO 算法来优化模型参数得到一个 robust LM,而是优化相关的 domain weight,这里非常巧妙的从模型权重的视角切换到了数据域权重的视角,大幅度减少了算力。

DoReMi 代理模型优化与大模型训练结果概览
DoReMi 代理模型优化与大模型训练结果概览

最后,将获取到的数据域的权重,对 The Pile 数据集进行配比得到的数据集来训练一个 8B(30倍代理模型大小)的大语言模型,提升的效果也非常显著。

图 2 所示,这里优化 domain weight(2次训练小型代理模型,第一次是使用启发式权重训练一个基准参考小模型,第二次是训练 DRO 代理模型)的计算量仅为训练大模型的 8%,但在 The Pile 数据集上进行预训练时,平均 one-shot 下游准确率提高了 6.5% 个点,并且达到基准准确率的速度快了 2.6 倍。

3.2 DoReMi(Domain Reweighting with Minimax Optimization)#

这里我们简述一下 DoReMi 整个方法,其核心思想是利用一个小型代理模型来优化语言建模数据集的 domain weight。

假设我们有 kk 个 domain(例如维基百科、Github),其中每个编号为 ii,每一个domain 都有一组样本 DiD_i

Domain Weight αΔk\alpha \in \Delta^k 用来表示这 kk 个 domain 上的概率分布,因此,整个训练集数据分布可以表示为:

Pα=Σi=1kαiunif(Di)P_\alpha = \Sigma_{i=1}^k \alpha_i \cdot \mathrm{unif}(D_i)

其中:

unif(D)=1DΣxD δx\mathrm{unif(D)} = \frac{1}{|D|}\Sigma_{x\in D}\ \delta_x

unif(D)\mathrm{unif(D)} 是在 D 中样本上的均匀分布,δx(x)=1\delta_x(x') = 1 当且仅当 x=xx' = x,否则为 0,这个是一个狄拉克分布。这样的表示也可以正确计算 D 中重复样本的概率。

3.2.1 Step 1 训练一个参考模型#

首先,本文在基于经验的情况下得到了一组 domain weight来采样数据,训练 T 步,批大小为 b,得到参考模型 prefp_{ref},这个模型仅为 280M。

3.2.2 Step 2 优化 domain weight#

为了优化并获取最优的 domain weight,本文基于 DRO-LM 框架,并使用 Group DRO 优化器来训练一个小的代理模型 PθP_{\theta} ,其中 θ\theta 为代理模型的权重。 这个框架通过优化最坏情况下的损失来训练一个 robust 模型,这个训练目标等价于以下 minimax 目标:

minθmaxαΔkL(θ,α):=i=1kαi[1xDixxDi(θ(x)ref(x))]\min_{\theta} \max_{\alpha \in \Delta^k} L(\theta, \alpha) := \sum_{i=1}^{k} \alpha_i \cdot \left[ \frac{1}{\sum_{x \in D_i} |x|} \sum_{x \in D_i} \left( \ell_{\theta}(x) - \ell_{\text{ref}}(x) \right) \right]

这个公式看着很会唬人,实际上阅读起来非常简单,我们来拆解一下:

  1. θ(x)=logpθ(x)\ell_{\theta}(x) = -log p_\theta(x)ref(x)=logpref(x)\ell_{\text{ref}}(x) = - log p_{ref}(x) 这俩分别是代理模型和参考模型的负对数似然,这俩做减法得到的差值是用来衡量代理模型相对于参考模型,在当前样本上还有多大的提升空间。

  2. x|x| xx 中的 tokens 数量,这里内部的求和是为了求第 ii 个域上的所有 token 的总数然后做公平的 token 级归一化,防止长样本总损失高的问题。

  3. 最外层的求和相当于是总的加权域损失,把所有域的平均超额损失,按域权重进行加权,得到总损失 L(θ,α)L(\theta,\alpha)

  4. 最外层的 minθmaxαΔk\min_{\theta} \max_{\alpha \in \Delta^k}

    • 内层的 maxmax 为的是给域权重 α\alpha 做优化,放大短板域的影响,核心的是,哪个域的平均超额损失越高,就把这个域的权重调的越高,让其在总损失上的占比更大。

    • 外层的 minmin 为的是给代理模型权重 θ\theta 做优化,把放大后的短板损失给压下去。

此外,这里的 Δk\Delta^k 代表了 kk 维标准单纯形,它代表了一个概率分布的集合,如果一个向量 α\alpha 属于 Δk\Delta^k,那么它必须满足:

  1. 非负性:向量里每一个元素都大于等于 0(αi0\alpha_i \geq 0);

  2. 归一性:所有元素的加和必须等于 1,即(Σi=1kαi=1\Sigma_{i=1}^k \alpha_i = 1)。

直观理解它就是一个权重分配,比如我们有 3 个不同的数据领域(维基百科、代码、书籍),α\alpha 就代表了这三个领域分配的权重系数:

  1. α=[0.3,0.5,0.2]\alpha = [0.3, 0.5, 0.2],这是一个合法的 Δk\Delta^k,因为其非负,且和为 1 。

  2. α=[0.8,0.4,0.2]\alpha = [0.8, 0.4, -0.2],这是一个非法的 Δk\Delta^k,因为其虽然和为 1 ,但存在负数权重。

实际上,这个 3 维的单纯形约束为:α1+α2+α3=1\alpha_1 + \alpha_2 + \alpha_3 = 1αi0\alpha_i \geq 0),也就是一个等边三角形平面区域:

  • 如果在三个顶点位置,说明权重分配的极其不公平比如:α=[1,0,0]\alpha = [1, 0, 0]

  • 如果在三条边上,代表其中一个权重为0,只在另外两个域上分配

  • 如果在中心点 (13,13,13)(\frac{1}{3}, \frac{1}{3},\frac{1}{3}),则代表权重分配完全公平,三个领域完全一样。

3.2.3 Step 2 中的一些细节#

DoReMi 算法伪代码
DoReMi 算法伪代码

我们来看一下这个伪代码,初始化的 domain weight 我们全部均匀初始化,11 为一个全 1 的 kk 维向量,α0\alpha_0 就是一个 kk 维的单纯形。

每一轮迭代都会完成:「采样 → 计算 excess loss → 更新 domain weight → 更新模型」,其中:

  1. 采样训练的批次:

    • 我们可以看到,在优化的过程中,采样的分布 PuP_u 是一个均匀分布,所有域的权重都是均等的,这也是 Group DRO 算法的标准要求,其内部的经验风险评估必须在均匀的先验分布上进行,然后通过权重去放大那些表现差的样本对梯度的贡献,目的是公平的计算每个 domain 的超额损失。

    • 如果用之前的 weight 进行采样,很可能超额损失高但 weight 较小的 domain 根本抽不到样本。

    • DoReMi 的本质就是解一个 Minimax 问题,在这个零和博弈中,maxmax 的任务是寻找超额损失最高的 domain,要做到这一点,其必须持续拥有对所有领域 Loss 的全局视野,不然其无法收敛。

  2. 计算样本的 token 长度 x|x|,为了防止不同样本和不同域的文本长度差异问题,只有按 token 归一化后才能公平对比 excess loss 。

  3. 计算超额损失λt[i]1xBDixxBDij=1xmax{θt1,j(x)ref,j(x),0}\lambda_t[i] \leftarrow \frac{1}{\sum_{x \in B \cap D_i} |x|} \sum_{x \in B \cap D_i} \sum_{j=1}^{|x|} \max\left\{ \ell_{\theta_{t-1},j}(x) - \ell_{\text{ref},j}(x), 0 \right\}

    • max{θt1,j(x)ref,j(x),0} \max\left\{ \ell_{\theta_{t-1},j}(x) - \ell_{\text{ref},j}(x), 0 \right\}:

      • 这里是针对一句话 xx 里面的第 jj 个词(Token)进行计算。

      • 前者是代理模型预测这个词的 Loss(负对数似然),Loss越大说明模型越不会预测这个词。

      • 后者是参考模型预测同一个词的 Loss 。

      • 相减是衡量代理模型比参考模型落后了多少,以及过滤一些困难样本或毫无规律的乱码样本,因为这种样本在两个模型上的 Loss应该都会很大。

      • 这里,也不用担心一旦代理模型超过参考模型之后会无法增加权重的情况,因为此时重心会放到那些依然落后 baseline 的 domain 上,这是一种动态的负载均衡。并且,我们也不关心代理模型到底有多强,它的唯一作用就是用来找到哪些 domain 上的数据最值得学习。

      • 此外,作者也考虑到了如果一开始参考模型太弱或者初始权重太差,会把优化方向带偏,作者提出了 Iterated DoReMi 进行补充,相当于优化一次得到权重后,再基于这些权重训练参考模型,再进行优化得到权重,反复左脚踩右脚的操作。

      • 外侧使用了 ReLUReLU 截断 max{,0}max \{ \cdots , 0\},因为 Group DRO 算法要求损失必须是非负的,从直观上理解,如果代理模型在某个词上已经做的比参考模型好了,那么我们不应该给它奖励,我们目的是找最薄弱的环节。

    • j=1x\sum_{j=1}^{|x|} 这个是句子级别的求和, x|x| 是这句话的总 Token 数量,把这句话里面的每一个词被截断后的超额损失都加起来,就得到了这句话的总超额损失。

    • xBDi\sum_{x \in B \cap D_i} 其中,B 代表当前均匀采样出的这批数据,DiD_i 代表是第 ii 个领域,BDiB \cap D_i 代表把当前 Batch 中,属于 DiD_i 域的所有句子都挑出来。

    • 1xBDix \frac{1}{\sum_{x \in B \cap D_i} |x|} 这里是最终的归一化操作,分母表示,在这个 Batch 中,属于 DiD_i 域的总 Token 数有多少,最终完成 Token 级别的归一化。

    • 整个式子计算出了 DiD_i 域在当前 Batch 下的平均每个 Token 的超额损失。

  4. 更新 domain weightαt=αt1exp(ηλt)\alpha_t' = \alpha_{t-1} \cdot exp(\eta\lambda_t),这一步是指数梯度上升的更新操作,η\eta 是步长,如果 λt[i]\lambda_t[i] 大,则 exp(ηλt[i])exp(\eta\lambda_t[i]) 就会是一个大于 1 的数,乘以上一步的权重 αt1[i]\alpha_{t-1}[i] 后,领域 ii 的权重就被放大了,反之,如果超额损失为 0,则其相对比重就会在后续的归一化操作中缩小。

  5. 归一化与平滑操作αt=(1c)αtΣαt+cu\alpha_t = (1-c)\frac{\alpha_t'}{\Sigma\alpha'_t} + c \cdot u

    • 这里,将所有的权重等比例缩小,使其总和为 1(满足单纯形要求)

    • 引入 cuc \cdot u 是一种平滑策略(探索机制),强制给每个领域保留一个极小的基础概率,这样防止某个领域的权重归零后永远无法被更新到,相当于一种正则化技巧。

    • 实际上这个就是一个插值操作,点 A 纯粹由数据驱动算出来的最新概率分布,位于单纯形的某处(可能非常靠近边缘),点 B (u) 是均匀分布,位于单纯形的绝对几何中心,插值参数 c,决定了在 A 和 B 之间连一条线段,最终的点 αt\alpha_t 取在这条线段上的什么位置。

    • 这样保证了指数梯度上升算法在理论上能以更优的速率收敛(不会在边界附近疯狂震荡)

    • 提供了一个下界保障,保证每个领域在优化的过程中不会饿死

    • 将整个搜索空间从整个单纯形,稍微往里收缩了小一点,防止了出现绝对0的情况,避免了过拟合到单一领域,也改善了优化地形(指数梯度上升算法如果太靠近边缘,容易步子迈得太大,导致不同域上反复横跳)

  6. 更新代理模型,使用最新计算出来的 αt\alpha_t 作为加权系数,对代理模型的 Loss 求加权和:L(θt1,αt)=Σi=1kαt[i]LossiL(\theta_{t-1}, \alpha_t) = \Sigma_{i=1}^k\alpha_t[i] \cdot \mathrm{Loss}_i,使用常规的优化器(Adam/Adafactor)进行反向传播,更新代理模型参数 θt\theta_t,因为刚才我们调高了薄弱领域的权重,优化器在更新参数时,就会更加侧重于优化这些 domain 。

3.2.4 Step 3 使用新的 domain weight 训练大模型#

在第二步得到的一组 domain weight α\overline{\alpha},其定义了一个新的数据分布 Pα{P_{\overline{\alpha}}},我们从这个新的分布中重新采样数据,以标准的训练过程来训练一个主模型。

4. 结论#

  • 图 2 所示,使用一个 280M 的代理模型跑 DoReMi 寻找最优权重,然后用这组权重训练一个 8B(30倍参考模型)的大模型,数据集为 The Pile(包含22个领域)。8B 模型仅需 7.5 万步就能达到 baseline模型(使用默认权重)训练 20 万步的效果,相当于 2.6 倍的训练加速,且成本极低,训练 2 个 280M模型所消耗的算力仅为 8B 模型算力的 8% ,在生成式 Few-shot 任务上,平均准确率比 baseline 模型高出 6.5个点。

DoReMi 在 The Pile 上的训练加速效果
DoReMi 在 The Pile 上的训练加速效果

DoReMi 权重下 The Pile 各领域困惑度对比
DoReMi 权重下 The Pile 各领域困惑度对比

  • 通常认为,如果在配比中降低了某个 domain 的采样比例,模型在这个 domain 上的 PPL 一定会变差。但如 图 4Table 4 所示,在使用 DoReMi 权重训练的 8B 模型上, The Pile 中全部的 22 个 domain 的 PPL 都比 baseline 模型更低,没有任何一个 domain 被放弃,作者认为 DoReMi 倾向于降低两种数据的权重:

    • 极高熵(极难/纯噪声)数据:模型根本学不会,不如不学。

    • 极低熵(极简单)数据:模型学几下就会了,再学属于浪费算力了。

这样,把节省下来的算力投入到 中等难度、且有巨大进步空间的 domain 上,会产生强的 Positive Transfer(模型在学习任务 A(或领域 A)时获得的知识、规律或能力,不仅帮它做好了 A,还顺便帮它把任务 B(或领域 B)也做得更好了),导致即使那些被降低了权重的 domain,性能反而不降反升。

DoReMi 对高熵与低熵数据权重的调整
DoReMi 对高熵与低熵数据权重的调整

DoReMi 数据权重与迁移效果分析
DoReMi 数据权重与迁移效果分析

  • 图 3表 2 所示,谷歌的 GLaM 数据集(包含8个领域),原本有一组非常强的官方权重,这些权重是在海量下游任务上反复试错、人工微调出来的,论文使用了 Iterated DoReMi 后,在下游任务上的表现完全追平甚至略微超越了官方重金砸出来的权重,这也说明了 DoReMi 是一种无监督、数据驱动的配比方法,无需提前准备下游任务。

Iterated DoReMi 在 GLaM 数据上的表现
Iterated DoReMi 在 GLaM 数据上的表现

GLaM 数据配比实验结果
GLaM 数据配比实验结果

DoReMi 与 GLaM 官方权重对比
DoReMi 与 GLaM 官方权重对比

  • 图 5图 7表 6 所示,作者做了一组实验,让代理模型和最终的主模型大小保持一致(280M、510M、760M、1B),结论是无论是哪个量级的模型, DoReMi 都能稳定的带来 4 倍的加速,并且在 200k 步时稳定保持约 3% 的准确率优势。

不同模型规模下 DoReMi 的加速效果
不同模型规模下 DoReMi 的加速效果

DoReMi 在多种代理模型规模上的表现
DoReMi 在多种代理模型规模上的表现

代理模型规模消融结果
代理模型规模消融结果

  • 根据 图 6(左图)表 3(a)表 8,作者尝试,使用更大的代理模型去指导 8B 模型是否效果会更好,但发现,最终性能反而下降了,原因是发现,在 1B 规模下,使用 Group DRO 算法训练的代理模型,其本身 PPL 甚至不如标准的 1B baseline模型(DRO 优化器在大规模模型上优化困难),所以这里作者认为代理模型维持在 280M 上是一个性价比甜点位置。

更大代理模型指导 8B 训练的消融结果
更大代理模型指导 8B 训练的消融结果

  • 根据 图 6(右图)表 7,作者做了一个消融实验,如果超额损失不做减法,而是只使用 lθl_\theta (只给最难的数据分配高权重)或只用 lref-l_{ref}(只给最简单的数据分配高权重 ,相当于无条件把算力分配给参考模型认为最容易预测、Loss最低的 domain),发现效果都不行。这也印证了,如果不减去 baseline 模型,算法根本无法区分「真正高价值数据」与「无意义的纯噪声数据」。

DoReMi 训练过程中各领域权重变化
DoReMi 训练过程中各领域权重变化

  • 图 8 所示,其追踪了 DoReMi 在前 200k 步运行期间,各个 domain 权重的变化情况,可以清晰看到,在前 50k 步上,权重发生了剧烈的翻转交叉,但是在 50k 步之后,所有领域的权重线条就趋于平稳了。这也说明,我们在优化的时候,不需要跑满全程,可能只需要前几万步就可以推断出来,进一步节约算力了。

5. 不足之处#

  1. 为什么 280M 模型优化出来的能直接给 8B 模型使用,这里也是经验主义,没有理论分析。

  2. Group DRO 算法在大代理模型上会崩溃,这也意味着 DoReMi 只能为一定规模的大语言模型做优化,更大规模的模型配比还是一个问题。

  3. 目前 domain 定义的颗粒度太粗,比如 Github 这个 domain,可能有高质量代码、低质量代码等等,如果 DoReMi 发现这个domain 的平均质量不高,也不能一刀切的降低整个权重。

  4. 对初始参考模型有一定依赖,如果参考模型本身学的不好,那么超额损失这个计算的基准就可能失效,让代理模型掉沟里,虽然 Iterated DoReMi 能缓解,但是也增加了算力成本。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

DoReMi 论文笔记:Optimizing Data Mixtures Speeds Up Language Model Pretraining
https://blog.llm101.moe/posts/20250912/
作者
千早爱音
发布于
2025-09-12
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
千早爱音
记录技术、阅读与日常的个人站点。
分类
标签
站点统计
文章
6
分类
2
标签
16
总字数
27,544
运行时长
0
最后活动
0 天前

文章目录