/ CS336
[CS336-14] 数据过滤与去重
整理 CS336 第十四讲:KenLM、fastText、DSIR、语言过滤、毒性过滤、Bloom filter、MinHash 和近重复去重。
这篇是 Stanford CS336 Spring 2025 第 14 讲 Course Materials 的学习笔记。它深入数据处理算法:过滤、重采样和去重。
1. 数据处理的目标#
原始语料很大,但不是每个 token 都同样有价值。数据过滤的目标是在 raw corpus 中找到更接近目标分布、更高质量、更安全、更不重复的样本。
一般框架是:
raw corpus R + target signal T -> scoring function -> keep/resample subset不同方法的差别在于如何建模 target,以及如何把 score 变成筛选动作。
2. KenLM:用生成式 n-gram 模型过滤#
一种做法是训练 target corpus 的 n-gram language model,然后用文档在该模型下的 perplexity 或 likelihood 做质量分数。
KenLM 这样的实现很快,适合大规模文本处理。为了处理未见 n-gram,需要 Kneser-Ney 等 smoothing 方法。
优点是简单、快、可解释。缺点是模型能力有限,主要捕捉局部统计,不理解复杂语义。
3. fastText:用判别式分类器过滤#
另一种做法是训练分类器判断文档是否像目标数据。fastText 用 bag of word embeddings 和 n-gram 特征,可以非常快地训练文本分类器。
例如把 Wikipedia、Books、WebText 作为 positive,把 Common Crawl 作为 negative,训练模型输出 p(target | x),再按阈值保留文档。
判别式方法通常效果强于纯 n-gram,但也依赖正负样本定义。如果 positive 选择有偏,过滤器会放大这种偏差。
4. DSIR:重要性重采样#
DSIR 的思想是估计 target distribution p 和 raw distribution q,然后按 p(x) / q(x) 对 raw samples 做 importance resampling。
它比单纯分类更强调分布匹配和多样性:不是只保留最像 target 的文档,而是让最终子集整体更接近 target。
这类方法体现了数据选择的统计视角:过滤不只是打分排序,也是目标分布构造。
5. 语言、主题和安全过滤#
同一套过滤框架可以用于语言识别、数学数据筛选、代码数据筛选、毒性过滤等任务。
例如语言识别模型可以过滤英文或多语言数据;数学语料可以用规则、KenLM、fastText 组合筛选;毒性过滤可以基于标注数据训练分类器。
关键是要认识到过滤器本身也会犯错:短文本、方言、code-switching、低资源语言都可能被误伤。
6. 去重:Exact、Bloom Filter、MinHash#
重复数据会浪费训练 compute,也会增加 memorization 风险。
Exact dedup 可以用 hash 去掉完全重复文档或段落。Bloom filter 是内存高效的 approximate set membership 结构:返回 no 一定不在集合中,返回 yes 可能是假阳性。
Near dedup 更难,因为文档可能只差一点格式。常用 Jaccard similarity 衡量 n-gram set 相似度,再用 MinHash 和 LSH 在近似线性时间里找到高相似文档。
MinHash 的关键性质是:两个集合 MinHash 相等的概率等于它们的 Jaccard similarity。通过 banding,可以把碰撞概率调成阈值形状。
7. takeaway#
第 14 讲展示了数据 pipeline 的算法层:
- n-gram LM 快但粗;
- fastText 分类器简单高效;
- DSIR 更关注分布重采样;
- filtering 可以服务语言、质量、主题和安全;
- dedup 需要 hash、Bloom filter、MinHash 等近似算法才能扩展。
在大模型训练里,数据处理不是预处理脚本,而是决定 token 价值的核心系统。
参考#
- Stanford CS336 Spring 2025 Course Materials: lecture_14.py