01 / Data进阶

数据不是原料,是训练的控制面

质量、去重、污染与 mixture 的可观测工程

把数据流水线、采样概率和模型能力联系起来,实际观察数据重平衡如何改变能力与遗忘。

READ WITH A QUESTION

读完这一章,你应该能够

  • 建立可恢复的数据血缘
  • 区分质量筛选与分布控制
  • 用 token 预算设计 mixture 消融
前置理解 能阅读 Python/PyTorch · 理解交叉熵;梯度直觉可先补充
本章目录 · 0 个小节

从一个反常现象开始

训练 loss 下降,而代码、数学或少数语言的评测变差,未必是优化器坏了。loss 衡量的是当前采样分布上的预测难度:如果新 mixture 增加了重复、模板化或容易的文本,平均 loss 可以下降,同时目标能力退步。课程分析:数据既定义学习对象,也定义训练日志的统计口径。 首先问“模型最近看到什么”,再问“学习率是否合适”。

FineWeb 的公开消融说明,网页提取、过滤和去重方式能够改变最终训练效果;不能把“下载的原始字节数”直接当作有效训练数据量。论文实验:FineWeb 本章使用 Dolma 解释可定位的处理机制,使用 OLMo-core 解释采样配置,不把两者当作所有团队的完整生产配方。

现代代表性变化:质量标签进入实例级配比

Qwen3 报告描述多维数据标签与小代理模型消融,以及 PDF 提取和领域模型生成合成文本的流程。官方报告 课程分析:这意味着 mixture 可以细化到同一来源里的不同质量与主题,而不是只能在“网页/书/代码”几个桶之间调百分比。具体标签器、阈值和最终实例采样不能在公开资料不足时补写成官方配方。

一条可审计的数据流水线

CODE / 可复制
原始文件:来源、时间、授权、内容哈希
提取与规范化:保留 raw → clean 映射
语言/质量/敏感内容标签
精确去重 → 近重复聚类 → 基准污染检查
按来源与难度建池,冻结 manifest
按 token 预算采样与打包
tokenizer 版本、shard、offset、随机状态
训练与域级评测 → 下一轮 mixture 决策

这张图中最有价值的产物不是一个巨大的 JSONL,而是可追溯的 manifest。至少保存 document_id, source_id, raw_hash, processing_version, quality_score, dedup_cluster, split, token_count。过滤后还要保留删除原因计数,否则一次正则更新可能悄悄删掉所有含公式的文档。

课程建议:把 train/eval 的划分落实到去重簇或源仓库,而不只是行号随机划分。来自同一本书、同一个代码仓库的变体分到两侧,会让评测变得过于乐观。污染检测可从规范化 n-gram overlap 开始,再人工检查高风险命中;阈值筛选会误伤共同术语,因此“有相同短句”并不等于泄漏答案。

去重并非一个布尔开关

方法解决的问题主要代价与盲点
文档精确哈希完全重复页面、重复抓取规范化不同会改变判重;小改动可逃逸
段落哈希/Bloom filter重复页脚、模板、跨文档段落Bloom 假阳性可能删除独有内容;要记录误差预算
MinHash / LSH高相似文本簇阈值、shingle 长度与聚类传递影响去除率
长子串检测大段复制与嵌入的重复内容索引成本、切片边界与保留策略复杂

这些是机制比较,并不表示同一个仓库同时实现全部路线。固定版本的 Dolma DeduperCli.run 接受 DeduperConfig,校验文档/段落配置,把配置交给 Rust 执行;其去重属性供后续混合与过滤使用。源码观察:这里明确是基于 Bloom filter 的入口,不能把它写成一个 MinHash 实现。源码:Dolma

源码阅读任务:沿 python/dolma/cli/deduper.py 找到 document 与 paragraph 分支,再到 src/deduper.rs 的 run 看如何消耗配置。输入是文档路径与策略;输出的判重属性和最终训练文本不是同一种产物。检查任意一步失败后能否重跑,是否会复用旧的 filter 状态,是否改变“保留哪个副本”。

Mixture:优化的是一组能力,不是一个排行榜数字

设领域池为 DkD_k,每个训练阶段的采样权重为 wk(t)w_k(t): Lt(θ)=∑kwk(t) Ex∼Dk[−log⁡pθ(x)],∑kwk(t)=1.\mathcal{L}_t(\theta)=\sum_k w_k(t)\,\mathbb{E}_{x\sim D_k}[-\log p_\theta(x)],\qquad \sum_k w_k(t)=1. 这里 ww 应按 token 或另一明确的单位定义。按“文档数 20% 代码”采样,遇到长代码仓库后,实际代码 token 比例可能远大于 20%。同时,采样概率不等于唯一内容占比:一个小池重复十轮可以占很多训练 token,却没有增加多少独有信息。

定义第 kk 个池的独有 token 为 UkU_k,预算为 TT,其平均暴露次数近似 ek=wkT/Uke_k=w_kT/U_k。先看这个比值,再讨论质量分数。高质量池反复采样可能带来收益,也可能变成记忆模板、丧失覆盖和校准偏差。分数模型的排序目标若偏爱“像教科书”,也可能误删论坛式推理、低资源语言和优秀代码。

OLMo-core 的 SourceMixtureConfig 分别暴露 target_ratio、max_repetition_ratio 与 max_source_fraction。这是一个很好的源码锚点:占比、重复上限和源内覆盖率是三个不同控制量。源码:mixture 配置 比例求和正确只是一项语法检查,仍要验证实际读出的 token 直方图。

代码、数学、科学与多语言怎样进入同一预算

课程分析:每一类能力数据都有不同的“质量单位”。代码应记录仓库、语言、可编译性与依赖;数学要区分问题、推导与答案,公式抽取损坏会直接改变语义;科学 PDF 要检查阅读顺序与图表上下文;多语言要关注 tokenization 膨胀和各语言在相同 token 预算下的实际语义覆盖。

合成数据至少记录教师、prompt、采样设置、验证规则和生成版本。通过相同答案验证的十条推理链不一定提供十份独立信息。若教师重复一种错误证明,增大合成池会提高错误的权重。应把“生成通过率”“人工抽查错误率”“与训练集相似度”和“训练后未见任务增益”分别统计。

可运行实验:观察能力交换而非背比例

CODE / 可复制
python3 -m labs.run --experiment mixture --seed 7

这是课程编写的 CPU 双领域共享参数实验,不是真实语言模型训练。把共享参数理解为有限模型容量,两个领域对它有不同的最优需求。比较初始 mixture、领域切换和加入 replay 的结果;关注两个领域各自 loss 与最终参数,不要只报加权平均 loss。网站实验室提供同一机制的交互控制。

实验映射:标量更新对应共享表示被不同数据梯度拉动;replay 比例对应保留分布的预算;生产中高维模型可能同时容纳多项能力,因此这个实验只能揭示竞争机制,不能预测某个真实模型最优比例。

如何观测和排查

异常先看什么最小可证伪实验
全局 loss 下降,目标能力下降每域 loss、实际 token 占比、重复率固定 checkpoint/LR/token,单独改 mixture
某语言大幅退步tokenizer 变更、语言筛选保留率从 raw 到 shard 抽样追溯 100 条
吞吐突然下降shard 大小、读取延迟、解压与 tokenization CPU相同模型读本地预缓存 shard
评测飞升但用户任务无改善去重簇跨 split、合成 prompt 泄漏时间/来源隔离评测、移除可疑簇
恢复后能力变化异常dataloader offset、随机种子、manifest比较恢复前后实际 document_id 序列

工程练习:做一次总 token 相同的三路实验,固定初始 checkpoint、优化器状态和评测设置,分别改变高质量池占比与重复上限。交付每域性能、95% 不确定性区间、实际重复次数和数据生成成本。解释你的最佳方案究竟来自质量、覆盖还是重复,并在 中训练 中决定何时应用它。

MAKE IT RUN

把这一章放进实验里

调整变量,观察机制,再运行本地 Python 实验验证。

进入实验

本章证据与源码

引用代表相应来源支持的结论,不意味着公开了完整训练配方。

源码观察Dolma:从 Python 配置到 Rust 去重执行allenai · 669f534823b0论文实验The FineWeb DatasetsPenedo et al. / Hugging Face · arXiv:2406.1源码观察OLMo-core:数据源比例与重复上限allenai · 0589a034f721论文实验Olmo 3Team Olmo / Ai2 · arXiv:2512.1论文实验Qwen3 Technical ReportQwen Team · arXiv:2505.0

留下你的工程判断

记录一个还没有解释清楚的现象,或下一次实验要控制的变量。笔记仅保存在当前浏览器。

自动保存在本机 · 可在“我的学习笔记”导出
理解机制,比记住结论更重要。