目录

读 OPUS:数据选择为什么必须看优化器真正走的方向

从静态质量过滤,到按每一步真实参数更新动态选数据

训练大模型时,我们通常先把数据清洗好,再随机采样训练。这个流程隐含了一个假设:

一条数据的价值在训练开始前就能确定,而且训练到哪一步都差不多。

OPUS 质疑的正是这个假设。同一条数据对初始模型可能很有用,对已经学会相关知识的模型却可能只是在重复;更关键的是,样本的原始梯度并不等于参数最后真正走的方向。AdamW 会按坐标缩放梯度,Muon 会对矩阵梯度做更强的几何变换。若数据选择仍按原始梯度打分,评分系统和真实训练过程就没有对齐。

OPUS 的核心判断可以压成一句话:

一条样本是否值得现在训练,要看它经过当前优化器处理后,能否把模型推向目标分布需要的方向,同时又不和已经选中的样本重复。

静态过滤缺了什么

传统数据筛选大致有两类。

第一类是静态过滤。质量分类器、规则系统或困惑度模型先给文档打一次分,再从固定子集里训练。这类方法便于扩展,也能清掉大量明显噪声,但它不知道模型当前已经会什么,更不知道某条数据在第 10 亿个 token 和第 1000 亿个 token 时的边际价值有什么差别。

第二类是动态选择。训练过程中计算候选样本的 loss 或梯度,再选择那些看起来最能改善目标任务的样本。它开始考虑模型状态,却常把原始梯度当成真实更新方向。这在 SGD 下还比较自然,在 AdamW、Muon 等现代优化器下就会出现错位。

设样本 \(z\) 的梯度为:

\[ g_z = \nabla_\theta \mathcal{L}(z; \theta_t) \]

训练真正执行的更新并不是简单的 \(-\eta_t g_z\),而更接近:

\[ \Delta \theta_z = -\eta_t P_t g_z \]

其中 \(P_t\) 表示当前优化器根据历史状态施加的预条件或几何变换。

两个样本的原始梯度可能看起来很相似,经过 \(P_t\) 后却指向不同方向;反过来,原始梯度差异很大的样本,也可能被优化器变换成相近的有效更新。于是,真正应该比较的不是 \(g_z\),而是 \(P_t g_z\)。

这就是 OPUS 名字里 Optimizer-induced 的含义。

OPUS 到底在优化什么

OPUS 先构造一个 proxy,表示模型希望改善的目标方向。然后在每个训练 step,从候选池 \(B_t\) 中挑出一个真正用于更新的 batch \(\hat B_t\)。

它并不是简单地问“哪条数据质量最高”,而是近似估计:

如果现在用这条数据更新一次参数,proxy 上的 loss 会下降多少?

在论文的低维投影表示中,单条候选样本的 utility 可以写成:

\[ U_z^{(t)} = \eta_t \sum_r \left\langle \phi^{(t,r)}(z), \psi_{\text{proxy}}^{(t,r)} \right\rangle - \eta_t^2 \sum_r \left\langle \phi^{(t,r)}(z), \Phi^{(t,r)} \right\rangle \]

这个式子看起来复杂,实际只有两部分。

第一部分是目标对齐奖励:

\[ \eta_t \sum_r \left\langle \phi^{(t,r)}(z), \psi_{\text{proxy}}^{(t,r)} \right\rangle \]

\(\phi^{(t,r)}(z)\) 表示样本 \(z\) 在第 \(r\) 层经过优化器预条件、再投影后的有效更新特征;\(\psi_{\text{proxy}}^{(t,r)}\) 表示 proxy 的目标梯度方向。两者内积越大,说明这条样本越可能把参数推向 proxy 需要的方向。

第二部分是批内冗余惩罚:

\[ \eta_t^2 \sum_r \left\langle \phi^{(t,r)}(z), \Phi^{(t,r)} \right\rangle \]

\(\Phi^{(t,r)}\) 累积了当前 step 已选样本的更新特征。新样本如果和它高度重合,utility 就会被扣掉。这样选出的 batch 不只要“方向正确”,还要尽量覆盖互补的信息。

最短的记法就是:

Utility = 对目标的有效贡献 - 与已选数据的重复。

proxy 为什么不能直接拿 benchmark

如果 proxy 决定了“往哪里走”,它本身的构造就非常关键。

直接拿通用预训练验证集做 proxy,信号稳定,但未必对目标能力敏感;直接拿 benchmark 题目做 proxy,又会遇到分布偏移、梯度噪声和过度贴合评测集的问题。

OPUS 使用了一个折中方案,叫 Bench-Proxy:

  1. 用冻结的文本编码器表示 benchmark 验证集和预训练语料。
  2. 从预训练语料中检索与 benchmark 语义相近的文档。
  3. 把这些仍来自预训练分布的文档组成 proxy pool。
  4. 训练时从 proxy pool 采小批量样本,估计目标梯度方向。

它想同时保留两件事:proxy 对目标任务有指向性,又没有完全离开预训练数据所在的分布。

不过,这也意味着 OPUS 不是一个完全无目标的数据质量定义。你选择什么 benchmark 来构造 proxy,实际上就在声明模型希望优先获得什么能力。

为什么这个方法没有贵到不能训练

按样本计算完整梯度,再让优化器逐条处理,理论上很直接,工程上却很难承受。一个 LLM 的参数空间太大,显式保存每个样本的梯度矩阵会迅速耗尽显存和计算预算。

OPUS 用了两层压缩。

Ghost:不显式保存完整梯度

对线性层 \(W_r\),单个样本的梯度可以写成输入激活和反向误差信号的外积:

\[ \nabla_{W_r}\mathcal{L}(z) = a_r^{(z)} \otimes b_r^{(z)} \]

所以系统不必先构造完整的大矩阵,只需保留产生它的两个因子,并在处理每一层时完成需要的计算。论文把 proxy batch 和 candidate batch 合并进一次前向、反向过程,再逐层收集和释放这些信息。

CountSketch:只保留低维内积结构

utility 最后需要的是不同方向之间的内积,不是高维梯度本身。OPUS 因而用 CountSketch 把有效更新压到低维空间:

\[ \phi^{(t,r)}(z) = \Pi_r\left(P_t\nabla_{W_r}\mathcal{L}(z)\right) \]

\(\Pi_r\) 是第 \(r\) 层的随机投影。只要投影能较好地保持内积关系,后面的目标对齐和冗余计算就可以在小得多的向量空间中完成。

这两层设计共同解决的是同一个问题:保留决策所需的几何信息,丢掉不需要显式存储的高维细节。

论文报告,在其 GPT-2 XL、FineWeb、Muon 设置下,完整 OPUS 相比随机采样增加约 4.7% 的总计算开销。这个数字说明方法在该实验配置中具有可用性,但它不是对任意模型、优化器和分布式训练系统都成立的固定常数。

为什么不直接选分数最高的 top-k

有了 utility,最直接的做法是每次选最高的前 \(k\) 条。但 OPUS 没有这样做,而是使用 Boltzmann sampling:

\[ p_z^{(t)} \propto \exp\left(U_z^{(t)}/\tau\right) \]

高分样本更容易被选中,但其他样本仍有非零概率。温度 \(\tau\) 控制选择有多贪心。

这样做的原因不是单纯增加随机性,而是承认 utility 本身带噪声:proxy 只是一个小批量估计,训练数据流也在变化。如果每一步都绝对相信当前排名,模型可能被某次偶然的 proxy 信号锁进很窄的数据区域。

所以 OPUS 同时用了两种多样性机制:

  • 公式中的冗余惩罚,避免当前 batch 内选出太相似的方向。
  • Boltzmann sampling,避免跨 step 永远只相信当前的硬排名。

实验结果应该怎么读

论文覆盖了从头预训练和领域继续预训练两类实验。

在 FineWeb 与 FineWeb-Edu 上,作者用 GPT-2 Large/XL、AdamW 与 Muon 比较了静态过滤、动态选择和随机采样。计算匹配的主要比较口径是固定 30B 个实际更新 token。论文报告 OPUS 在这些设置中取得了最好的平均表现,并常能达到或超过随机采样训练 60B update tokens 的参考结果。

论文摘要还把 30B-token 的 OPUS 结果与 200B-token 的完整训练作比较,并报告前者表现更好。这个数字很醒目,但阅读时要注意:它说明的是该实验配方中的数据效率,不等于“训练任何大模型都能无条件节省 6 倍以上总成本”。候选数据的读取、打分、proxy 构造和具体系统实现仍然消耗资源。

在 SciencePedia 上继续训练 Qwen3-8B-Base 时,作者报告 OPUS 用 0.5B 个更新 token 就超过了随机继续训练 3B token 的结果,并在论文的汇总口径下优于 full CPT 参考。这个结果更能说明 OPUS 的适用场景:当目标领域已经明确,而训练预算有限时,动态决定“此刻最值得学什么”可能比把领域数据全部均匀扫一遍更有效。

我认为这篇论文最重要的贡献

OPUS 最有价值的地方,不是又发明了一个质量分类器,而是把三个经常分开的对象接了起来:

  1. 目标能力:proxy 决定模型希望往哪里走。
  2. 优化器几何:AdamW 或 Muon 决定梯度实际怎样变成参数更新。
  3. 数据选择:候选样本按真实有效更新对目标的贡献被动态选择。

这三者连起来以后,数据就不再有一个脱离训练过程的固定“质量分”。它的价值变成了一个条件量:

\[ \text{value}(z) = f(z,\theta_t,\text{optimizer state},\text{proxy},\hat B_t) \]

同一条样本会因为模型状态、优化器状态、目标方向和当前 batch 已选内容不同,而具有不同价值。

这比“高质量数据永远高质量”的静态叙事更接近训练的真实过程。

仍然没有被证明的部分

这篇论文的结果很强,但有几条边界不能省略。

第一,proxy 不是中立的。benchmark-aligned proxy 会把选择过程朝指定评测能力倾斜。论文做了 proxy 外评测来检查泛化,并报告仍有提升,但这不能保证换一组目标、语言或任务后仍保持同样收益。

第二,方法降低的是达到某些结果所需的 update tokens,不必然按相同比例降低端到端成本。候选池需要前向、反向和投影评分,数据基础设施也要支持训练中动态筛选。

第三,CountSketch 和 Ghost 保留的是 utility 估计需要的近似几何。投影维度、候选 buffer 大小、温度和 proxy 质量都会影响排名稳定性;不同规模模型上的最佳配置仍需重新验证。

第四,论文重点验证了 GPT-2 Large/XL 的从头训练和 Qwen3-8B-Base 的科学领域继续训练。它是否能以相同效率扩展到数百亿参数以上的 MoE、多模态预训练或长序列训练,还没有在这篇工作中得到证明。

结语

如果只记住 OPUS 的一个判断,我会选择这句:

数据选择不能只看样本是什么,还要看优化器会把这条样本变成怎样的参数更新。

静态过滤仍然有用,它适合先清理明显低质和有害数据;OPUS 更像是在此基础上继续回答一个细粒度问题:模型训练到当前这一步,下一批 token 到底该学什么。

这也许是“数据墙”之后更重要的研究方向之一。未来训练效率的提升,不只来自更快地吞下更多 token,也来自更准确地判断哪些 token 此刻值得进入梯度。

参考链接