数据不是原料,是训练的控制面
质量、去重、污染与 mixture 的可观测工程
把数据流水线、采样概率和模型能力联系起来,实际观察数据重平衡如何改变能力与遗忘。
读完这一章,你应该能够
- 建立可恢复的数据血缘
- 区分质量筛选与分布控制
- 用 token 预算设计 mixture 消融
本章目录 · 0 个小节
从一个反常现象开始
训练 loss 下降,而代码、数学或少数语言的评测变差,未必是优化器坏了。loss 衡量的是当前采样分布上的预测难度:如果新 mixture 增加了重复、模板化或容易的文本,平均 loss 可以下降,同时目标能力退步。课程分析:数据既定义学习对象,也定义训练日志的统计口径。 首先问“模型最近看到什么”,再问“学习率是否合适”。
FineWeb 的公开消融说明,网页提取、过滤和去重方式能够改变最终训练效果;不能把“下载的原始字节数”直接当作有效训练数据量。论文实验:FineWeb 本章使用 Dolma 解释可定位的处理机制,使用 OLMo-core 解释采样配置,不把两者当作所有团队的完整生产配方。
现代代表性变化:质量标签进入实例级配比
Qwen3 报告描述多维数据标签与小代理模型消融,以及 PDF 提取和领域模型生成合成文本的流程。官方报告 课程分析:这意味着 mixture 可以细化到同一来源里的不同质量与主题,而不是只能在“网页/书/代码”几个桶之间调百分比。具体标签器、阈值和最终实例采样不能在公开资料不足时补写成官方配方。
一条可审计的数据流水线
原始文件:来源、时间、授权、内容哈希
提取与规范化:保留 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:优化的是一组能力,不是一个排行榜数字
设领域池为 ,每个训练阶段的采样权重为 : 这里 应按 token 或另一明确的单位定义。按“文档数 20% 代码”采样,遇到长代码仓库后,实际代码 token 比例可能远大于 20%。同时,采样概率不等于唯一内容占比:一个小池重复十轮可以占很多训练 token,却没有增加多少独有信息。
定义第 个池的独有 token 为 ,预算为 ,其平均暴露次数近似 。先看这个比值,再讨论质量分数。高质量池反复采样可能带来收益,也可能变成记忆模板、丧失覆盖和校准偏差。分数模型的排序目标若偏爱“像教科书”,也可能误删论坛式推理、低资源语言和优秀代码。
OLMo-core 的 SourceMixtureConfig 分别暴露 target_ratio、max_repetition_ratio 与 max_source_fraction。这是一个很好的源码锚点:占比、重复上限和源内覆盖率是三个不同控制量。源码:mixture 配置 比例求和正确只是一项语法检查,仍要验证实际读出的 token 直方图。
代码、数学、科学与多语言怎样进入同一预算
课程分析:每一类能力数据都有不同的“质量单位”。代码应记录仓库、语言、可编译性与依赖;数学要区分问题、推导与答案,公式抽取损坏会直接改变语义;科学 PDF 要检查阅读顺序与图表上下文;多语言要关注 tokenization 膨胀和各语言在相同 token 预算下的实际语义覆盖。
合成数据至少记录教师、prompt、采样设置、验证规则和生成版本。通过相同答案验证的十条推理链不一定提供十份独立信息。若教师重复一种错误证明,增大合成池会提高错误的权重。应把“生成通过率”“人工抽查错误率”“与训练集相似度”和“训练后未见任务增益”分别统计。
可运行实验:观察能力交换而非背比例
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% 不确定性区间、实际重复次数和数据生成成本。解释你的最佳方案究竟来自质量、覆盖还是重复,并在 中训练 中决定何时应用它。
把这一章放进实验里
调整变量,观察机制,再运行本地 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留下你的工程判断
记录一个还没有解释清楚的现象,或下一次实验要控制的变量。笔记仅保存在当前浏览器。
自动保存在本机 · 可在“我的学习笔记”导出