返回博客

/ CS336

[CS336-14] 数据过滤与去重

整理 CS336 第十四讲:KenLM、fastText、DSIR、语言过滤、毒性过滤、Bloom filter、MinHash 和近重复去重。

3 minCS336 · Data Filtering · Dedup

这篇是 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 价值的核心系统。

参考#