规则都过了、也不重复,没营养的文本怎么筛?
本课一问:规则删掉了乱码和样板,去重删掉了拷贝。剩下的文本全都「合法」、也不重复——但其中大量是没什么内容的:关键词堆砌的推广页、东拼西凑的问答、语句通顺却什么也没说的段落。怎么把它们也筛掉?
这一课先不碰:筛完之后各类数据按什么比例混(第 4 课)、好数据不够时怎么办(第 5 课)。
从已有出发
模型这条流水线上,本章始终停在最左边的「文字」一格;把这一格展开,就是下面这条数据管线:
第 1 课的规则逐条检查文本的长相:长度、句末标点、虚词。第 2 课比较文本之间是否重复——在整本《三國志演義》上一对近重复也没找到。两者都回答不了「这段话有没有营养」。
本课换一部分例子,原因写在这里:一部编校过的名著里找不到真正「没营养」的段落,所以三国演义在本课改当「好文本」的参考语料;要被筛的对象换成我们自己模型写的续写(真实输出)和标明「教学构造」的网页文字。
先自己设计:继续加规则
最自然的想法是规则再细一点。先看两段文本在第 1 课那 4 条中文规则上的实测值:左边是验证集里的真原文(模型训练时没见过),右边是我们项目基线模型(训练 400 步、val loss 4.626)写的一段续写——真实的模型输出,不是编的。
- ① 朴素方案
- ② 它在哪失败
- ③ 改进方案
| 规则 | 验证集原文 | 模型续写 |
|---|---|---|
| 字数 ≥ 50 | 135 字 ✓ | 114 字 ✓ |
| 以中文句末标点结尾 | 「。」✓ | 「。」✓ |
| 文言虚词 ≥ 2 个 | 4 个:之曰於以 ✓ | 3 个:之而於 ✓ |
| 不含 ASCII 字母 | 0 个 ✓ | 0 个 ✓ |
原文:於是姜維領敕辭朝,同夏侯霸逕到漢中,計議起兵。維曰:「可先遣使去羌人處通盟,然後出西平,近雍州。先築二城於麴山之下,令兵守之,以為犄角之勢。我等盡發糧草於川口,依丞相舊制次第進兵。」是年秋八月,先差蜀將句安、李歆同引一萬五千兵,往麴山前連築二城。句安守東城,李歆守西城。
模型续写(提示词「卻說曹操」,温度 0.8、top-k 50):卻說曹操自領大軍來。曹操自引大軍從小百,守巇城。操令軍將馬一千,伏於山坡之邊,望風而去。行不時,操方纔行過門,只聽得一將旗上喊聲大震,徐晃軍大開,各自相離。兩軍相持木,操兵到處,操自引兵追趕。曹操在山上殺將來,見袁軍山坡前塢中。
不再逐条描述长相,而是整体问一句:这段文字像不像我们认为好的那类文本?
最早的做法是在一份「好文本」(比如维基百科)上训一个语言模型,用它的困惑度给其他文本打分:困惑度低 = 读起来像好文本。下面把这个办法做出来,拿三国演义当「好文本」。
改进一:用「好文本」上训的语言模型打分
CCNet(Wenzek 2019)在每种语言的维基百科上训一个 5-gram 语言模型,给 Common Crawl 的每一段算困惑度,再按三分位切成 head / middle / tail 三档 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条CCNet 自己只分档、不删除;后来的数据集(如 CC-100)才只保留困惑度低的部分。 出处CCNet §3.4(需联网) ↗需联网 。我们在三国演义的训练集上做同一件事,只是把 5-gram 换成更小的字级 bigram:
试三件事:① 读排在最上面的是谁:我们模型写的续写,困惑度 93.417,比两段真原文(273.209、322.761)都低;② 看那段现代白话科普(困惑度 3,390):一段讲清了雨怎么形成的好文字,被染成一片红——每个字都在说「我不像三国演义」;③ 往右拖阈值直到科普段落被留下,读下方直方图:同一个阈值要么放进样板文字,要么先删掉验证集里的诗(最高的一首 3629.71)。
它在哪失败?困惑度衡量的是「像不像参考语料」,不是「有没有营养」:
- 我们模型的胡话,是一个专门学着模仿三国演义字与字搭配的模型写出来的,当然最像——困惑度 93.417,低于真原文;
- 真原文里困惑度最低的是章末套话「未知勝負如何,且看下文分解。」(28.13),最高的是诗(用字生僻、搭配少见);
- 换成现代白话,再好的内容也被判成「不像」。
参考语料选什么,过滤器就偏向什么。拿维基百科当参考,就偏向「像维基的网页」,其余一概打低分。
改进二:先把「好」写成细则,再让模型学会打分
现代做法把判据说清楚。FineWeb-Edu 的流程分三步:
- 写打分细则、让强模型标一小批。用 Llama-3-70B-Instruct 给 46 万个网页打 0–5 分。细则是累加式的:有一些和教育相关的基本信息,加 1 分;涉及教育要素但没对准,再加 1 分;适合教学、覆盖课程里的关键概念,再加 1 分;对小学到初中阶段高度有用、写得连贯,再加 1 分;堪称范文,再加 1 分。提示词特意要求关注中小学层次的知识,避免模型偏爱 arXiv 摘要这类高度技术化的页面 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条论文比较了几种提示格式,发现累加式(来自 Yuan et al.)效果最好;细则本身是人写的偏好。 出处FineWeb §4、附录 F.1 ↗ 。
- 蒸馏成便宜的分类器。在 Snowflake-arctic-embed-m 的句向量上训一个线性回归(41 万条训练、5 万条验证,冻结编码器),输出四舍五入成 0–5 的整数;阈值取 3 时,相对 Llama 3 的标注 F1 = 82%。
- 筛全量。给 FineWeb 的 15T token 打分用了 6,000 个 H100 小时,留下 ≥ 3 分的 1.3T token。
| 阈值 | 留下的 token | 占 FineWeb 15T |
|---|---|---|
| 不筛 | 15T | 100% |
| ≥ 2 | 5.4T | 36.0% |
| ≥ 3(FineWeb-Edu) | 1.3T | 8.7%(数据卡:删掉 92%) |
效果:在 350B token 上训同样的 1.71B 模型,MMLU 从 33% 到 37%、ARC 从 46% 到 57%;在 MMLU 上,FineWeb-Edu 训到 38B token 就达到 33.6%,另一个数据集 Matrix 要 300B token 才到同样水平 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条阈值 3 是在知识、推理类基准与 HellaSwag 之间折中选出的;只在英文网页、1.71B 模型上验证。 出处FineWeb §4、图 10–11 ↗ 。
同一个思路的其他版本:
- GPT-3:拿 WebText、维基和书当正例训分类器,去 Common Crawl 里捞长得像的网页(GPT-3 论文附录 A)。
- DCLM:fastText 分类器,正例是 OpenHermes 2.5 的指令数据加 Reddit ELI5 的问答,负例是他们复现的 RefinedWeb;只留分数前 10%(比 15%、20% 都好)。7B 模型训 2.6T token,5-shot MMLU 64%,算力只有 Llama 3 8B 的 1/6.6 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条10% 是在已做启发式过滤与去重之后的池子里取的百分位;论文把「基于模型的过滤」列为提升最大的单一因素。 出处DCLM 摘要、§4.4、表 5(需联网) ↗需联网 。
- Llama 3:两类分类器——fastText 判断「会不会被维基百科引用」,另有 RoBERTa 系分类器用 Llama 2 的判断当标签。
- Qwen3:给 30T 以上 token 做多维度标注,在单个样本的粒度上优化配比(第 4 课)。
- GLM-5:在上一代流水线上加了基于句向量的 DCLM 式分类器,另加一个「世界知识」分类器,专门从中低质量的数据里捞回长尾知识(R2 §2.5.1)。
新的失败:筛得越狠,剩得越少
阈值 3 删掉了 92% 的数据,DCLM 只留前 10%。对一次几百 B token 的消融这没问题;可 C6 讲过,生产模型要训十几甚至几十 T token——筛完只剩 1.3T,就只能重复很多遍(第 5 课讲重复的代价)。
Nemotron-CC 把问题摆到了台面上:它用多个分类器的集成代替单一分类器、少用启发式规则,再用模型改写(第 5 课)扩充数据,得到 6.3T token(4.4T 真实 + 1.9T 合成)。用其中 1.1T 的高质量子集训 8B 模型 1T token,MMLU 比 DCLM 高 5.6;全量与 DCLM 持平,但真实的唯一 token 是 DCLM 的 4 倍 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条8B 模型;另一组 15T token 的长程训练(其中 7.2T 来自 Nemotron-CC)比 Llama 3.1 8B 的 MMLU 高 5 个点。 出处Nemotron-CC 摘要(需联网) ↗需联网 。质量和数量要一起算,不能只看质量。
常见误解一:「困惑度低 = 质量高。」困惑度低只说明「像参考语料」。我们模型的胡话困惑度 93.417,低于真原文;章末套话是全书困惑度最低的段落之一。
常见误解二:「分类器阈值越高越好。」FineWeb-Edu 选 3 而不是 4、5,是在知识类基准和常识类基准(HellaSwag)之间折中;阈值越高,剩下的 token 越少,长程训练就得重复越多遍。
常见误解三:「LLM 标注就是真值。」82% 的 F1 是分类器相对 Llama 3 标注的一致程度,不是相对人。细则是人写的偏好(「中小学层次的教育价值」),标注模型也有自己的偏好,两者都会原样传给分类器。
放回演进图里
从这一课开始,判断数据好坏的不再是人写的规则,而是模型。
- 解决了量几乎无限:Common Crawl 定期抓取全网,FineWeb 用了 96 个快照。卡在WET 纯文本里样板和菜单太多(FineWeb §3.2);我们的原始文件不还原硬换行就跑 C4 句末规则,整本书只剩 17.02% 的字。
- 解决了Reddit 上至少 3 karma 的外链,4,500 万个链接,清洗后约 800 万文档、40 GB。卡在量太小:C6 算出的需求是十几 T token;而且只覆盖被分享过的那一小部分网页。
- 解决了句末标点、词数、平均词长、停用词、重复行……便宜,能在全网快照上跑。卡在绑语言、绑求值单位:英文原版在整本《三國志演義》3,697 段上通过 0 段;C4 句末标点规则删掉约 30% 的 token,FineWeb 最后没用它。
- 解决了C4 里一句话重复 61,036 次;去重后模型复述训练文本的频率降到 1/10。MinHash 把两两比较变成查桶。卡在去得越狠未必越好:跨 96 个快照全局去重只剩 4T,训不出更好的模型;每快照独立去重留 20T,才追平 RefinedWeb。
- 解决了判断「有没有营养」:FineWeb-Edu 让 Llama-3-70B 标 46 万页、蒸馏成分类器,MMLU 33% → 37%。卡在参考语料的困惑度偏向「像参考」:我们模型写的胡话困惑度 93.417,低于真原文 273.209;阈值 3 删掉 92%,长程训练不够用。
- 解决了DoReMi 用 280M 代理模型搜域权重,8B 模型下游平均 +6.5 个点,达到基线快 2.6 倍。卡在权重一变就要重复:按 DoReMi 的权重花完 The Pile 的有效体量,YouTube 字幕要走约 16.9 遍(按字节近似 token,只看量级)。
- 解决了重复 4 遍以内几乎等于新数据;改写真实网页(WRAP)预训练约快 3 倍;Phi-4 约 10T token 里合成占 40%。卡在让模型只吃自己生成的数据,分布的尾巴一代代消失:在三国演义真实字频上重采样,只出现 1 次的字每一代有约 36.8% 的概率丢掉,丢了就回不来。
- 解决了最好的数据放到学习率衰减段(C5 的 WSD)加量;再发展成独立阶段,顺便拉长上下文。卡在同名不同方:Qwen3 的高质量阶段占 13.9%,Llama 3 的退火只占 2.6e-6;收益与学习率调度缠在一起,很难单独归因。
同一原则在后训练:LIMA
「质量比数量重要」不只出现在预训练。LIMA(Zhou 2023)只用 1,000 条精心挑选的问答示范对 LLaMA 65B 做 SFT,不做任何强化学习;人类评估里,它的回答与 GPT-4 相比「一样好或更好」的比例是 43%,对 Bard 是 58%,对用人类反馈训练过的 DaVinci003 是 65%。而用了 52 倍数据(52,000 条)训练的 Alpaca 65B,反而不如 LIMA 受欢迎 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条人类偏好评估;正文把人类评估误标成「图 2」,实际是图 1(图 2 是 GPT-4 当评委)。 出处LIMA 摘要、§1、图 1(需联网) ↗需联网 。
论文由此提出「表层对齐假设」:模型的知识和能力几乎全部在预训练里学到,SFT 教的只是表层行为——用什么格式、以什么角色、回答还是续写。这一条同时解释了三件事:
- 为什么预训练模型只会续写(它只学过续写,没学过「回答」这个格式);
- 为什么 1,000 条就够(知识早就有了,重塑行为不需要很多数据);
- 为什么 SFT 有天花板(它改不了预训练里没有的知识和推理能力——所以还需要强化学习,C12 讲)。
和预训练的区别要分清:预训练里「质量 > 数量」是因为好数据每个 token 教给模型更多东西;SFT 里是因为要教的东西本来就少。两者都不是「数据越少越好」——FineWeb-Edu 也要 1.3T token。
证据三问
| 问 | 本课的回答 |
|---|---|
| ① 它解决什么问题? | 在「合法、不重复」的文本里,再筛出信息密度高、对训练有用的部分 |
| ② 数学上为什么可能有效? | 没有证明。有一个理论动机:好数据的每个 token 带来更多可学的规律;分类器是把人写的偏好压缩成一个便宜的打分函数 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条「教育价值高的文本对下游基准更有用」是动机,不是定理;分类器同时会把细则与标注模型的偏见一起继承下来。 出处待补 |
| ③ 实验上为什么选了它? | FineWeb-Edu、DCLM 的消融都显示基于模型的过滤是提升最大的一步;Nemotron-CC 又显示筛得太狠会在长程训练里吃亏 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条全部是英文网页上的结论,且依赖所选基准;换基准、换语言,最优阈值会变。 出处DCLM(需联网) ↗需联网 |
一句话
规则管长相,分类器管营养:先把「好」写成打分细则,让强模型标一小批,再蒸馏成便宜的分类器去筛全网——但筛得越狠,剩下的 token 越少。
先停在这里:记住「困惑度 ≠ 质量」「阈值是质量与数量的折中」。
再深一层:在过滤器里输入你自己写的一段文言、一段白话,看同一个模型给它们的困惑度差多少;再想想如果把参考语料换成维基百科,哪些好文本会被误删。
下一个缺口
筛完剩下网页、代码、数学、书,各按多少比例混? → 第 4 课:网页、代码、数学、书,按什么比例混?
你可能会问
- 「为什么不直接让 Llama-3-70B 给全部 15T 打分?」 太贵。小分类器打完 15T 用了 6,000 个 H100 小时;70B 模型逐页生成评语与分数要贵几个数量级。强模型只标 46 万页当「老师」,便宜的分类器当「学生」去干活——这是第 12 章「蒸馏」的同一个思路。
- 「中文数据也这样筛吗?」 思路一样,但细则、标注模型、分类器都要按语言重做;本课的困惑度实验已经说明,拿一种文体当参考,会把另一种文体整批判成低质量。
- 「分类器会不会让数据越来越单一?」 会有这个风险:FineWeb 把两个数据集的样本聚成主题簇来比,教育分类器明显偏向「教育、学习」「历史、文化、政治」类,压低了「商业、金融、法律」「娱乐、影视」「地点、旅游、房地产」等类(FineWeb §4.1)。GLM-5 专门加「世界知识」分类器从低分数据里捞长尾知识,就是在补这一点。