大语言模型的训练需要大量数据,可能达到GB级甚至TB级,人工检查这种量级的数据成本过高,因此需要自动化的方法对数据进行质量检测和处理。在数据质量问题中,一类重要问题是数据重复问题。这是因为,一方面,重复数据会增加诸多无意义的传输和训练成本;另一方面,如果重复数据过多,会使模型“记住”这些训练数据,并在推理过程中对这些数据进行复述,影响模型的泛化能力,更严重的,如果重复数据中包含隐私或冒犯性内容,将对模型安全性带来极大的负面影响。因此,对数据进行去重是数据处理过程中的一个重要环节。
针对预训练数据的去重方法,现在使用比较多的是Minhash+LSH方法。两个集合A和B的Jaccard相似度为其交并比。
在数据量比较大的情况下,这种相似度判断方法非常耗时,而Minhash的目标便是在不需要精确计算两个集合交集和并集的前提下快速估计Jaccard相似度。在文档去重的应用场景下,可以将每个文档看作一个前面提到的集合,然后使用Minhash计算文档两两之间的相似度。但当文档数量非常多时,这种方式的比较次数会非常大,因此会用到一种分桶策略,即LSH,只比较相似度可能会很高的文档,从而加快计算速度。利用Minhash+LSH对文档进行去重主要包含四个步骤:
1. 把文本表示成n-元组词袋,即每n个连续的单词或汉字组成一个元组
2. 指纹计算,每个n-元组生成多个哈希值,这样每个文档便生成一个哈希矩阵,对哈希矩阵的每列取最小值,可以将每个文档映射成一组哈希值
3. 局部敏感哈希(LSH),将指纹数组分成若干条带,评估它们的相似性,然后,将这些相似度高的文档聚类在一起,从而减少后续比较的次数
4. 去重,确定哪些重复的文档需要保留,哪些需要删除
不过,Minhash+LSH方法也存在一些不足,例如:由于可能存在具有相同哈希值的不同数据,不能保证完全去除所有重复数据;对数据质量和分布有一定限制,如果数据分布不均匀或存在大量噪声,可能会出现不准确的结果或异常情况。