互联网上有大量重复内容。同一篇新闻可能被几十个网站转载,同一段话可能在不同的页面出现上百次。
如果不去重,模型会在这些重复内容上反复训练——浪费计算资源,还可能导致模型对这些内容过度拟合(死记硬背这些重复的段落,而不是学到通用的语言规律)。
精确去重
最直接的方法:比较每两个文档是否完全相同。如果相同,只保留一份。
但「完全相同」太严格了。两篇转载的文章可能只有标题或作者署名不同,内容完全一样——按「完全相同」的标准它们是不同的文档,但实际上是重复的。
更实用的精确去重是在段落或句子级别进行——把每个段落或句子计算一个哈希值(一串固定长度的数字指纹),哈希值相同的就是重复的。
为什么精确去重不够
精确去重只能发现完全一样的重复。但很多重复不是完全一样的——两篇文章可能有 90% 的内容相同,只是开头和结尾不同,或者其中一篇被轻微修改过(同义词替换、句子重排)。
要找到这种「近似重复」,需要更聪明的方法。
MinHash:近似去重
MinHash 是一种估计两个文档相似度的高效算法。它的思路是:
- 把每个文档拆成 n-gram(连续的 n 个字组成的片段)。比如「机器学习很有趣」的 3-gram 是:「机器学」「器学习」「学习很」「习很有」「很有趣」。
- 对每个文档的所有 n-gram 计算若干个哈希函数,每个哈希函数只保留最小值(min hash)。
- 两个文档的 min hash 签名越相似,它们的 n-gram 集合重叠越大,文档内容越接近。
MinHash 的巧妙之处在于:不需要逐对比较所有文档(那会是 n² 的计算量),而是通过 LSH(局部敏感哈希)技术快速找到相似的文档候选对,然后只对候选对做精细比较。
这让去重可以在几十亿文档的规模上可行地执行。
去重的影响
研究表明,去重后的数据训练出的模型质量显著优于未去重的数据。原因有两个:
- 模型的训练 token 预算是有限的(Sophia 是 200 亿)。去掉重复内容后,每个 token 都提供了新的信息——学习效率更高。
- 减少过度拟合——模型不会对重复出现的段落产生不当的偏好。
下一章节来看另一种数据过滤:怎么区分高质量文本和低质量文本。