文章目录
- 质量过滤
- 敏感内容过滤
- 数据去重
当收集了丰富的文本数据之后,为了确保数据的质量和效用,还需要对数据进行预处理,从而消除低质量、冗余、无关甚可能有害的数据。一般来说,需要构建并使用系统化的数据处理框架(如开源库 Data-Juicer),从而保证预训练数据的质量。
质量过滤
直接收集到的文本数据往往掺杂了很多低质量的数据。例如,从网页抓取的数据中可能包含由机器自动生成的广告网页。为了优化模型学习的性能,需要去除语料库中的低质量数据。目前,研究人员主要使用以下两种数据清洗方法:(1)基于启发式规则的方法,和(2)基于分类器的方法。
基于启发式规则的方法,我们可以通过精心设计的规则来针对地识别和剔除低质量的文本数据。然而,不同类型的文本数据往往需要设计不同的清洗规则。例如,在处理Reddit 数据时,可以通过过滤点赞数过少的帖子来剔除低质量内容;而在处理代码语料时,可以过滤掉非代码相关格式的数据。
基于语种的过滤,为了训练特定目标语言为主导的大语言模型,通常要过滤掉其他语言的文本数据。需要注意的是,目前英文的高质量开放数据数量最多,已经成为了开源大语言模型的主要数据来源。例如,LLaMA-2 模型主要以英文数据为主,占比为 89.70%。因此,即使是训练非英文主导的大语言模型时(如中英双语大模型),不仅要保留特定目标语言数据,还需要同时保留英文高质量数据。在训练中英文为主要语言的 YuLan 模型时,针对网页数据使用了语言识别器过滤非中英文数据。但是对于多语的维基百科数据,由于其含有丰富的多语资源,并且数量规模相对较小,可以直接将这些数据添加至模型的训练数据中。
基于简单统计指标的过滤,为了识别高质量的文本数据,可以使用语料中标点符号分布、符号与单词比率、句子长度等特征来衡量文本质量,并过滤低质量数据。除了这些统计特征以外,也可以利用困惑度(Perplexity)等文本生成的评估指标来检测和删除表达不自然的句子。
- 针对网页数据,过滤任何具有超过 100 个重复单词或句子的文档
- 针对网页数据,过滤符号和词元比大于 0.1 的文档
- 针对论坛数据,过滤掉任何点赞数少于 3 的用户评论
- 利用已有的语言模型计算文档困惑度,并以此作为文档过滤的依据
- 训练 FastText 分类器来检测和删除有毒或仇恨言论的内容
基于关键词的过滤,在收集到的预训练语料中,可能会存在着大量的重复文本模式,诸如常见的 HTML 标签、超链接以及各种模板等。进一步,这些语料中还可能包含了一些具有攻击性、冒犯性的不良信息。为了应对这些问题,针对不同的语料来源以及应用场景,我们可以制定精准的清洗规则,结合相应的关键词集合,对文本进行扫描过滤,从而有效地识别和删除其中的噪声或无用元素。
- 针对维基百科数据,过滤掉任何拥有少于 25 个 UTF-8 单词的页面。
- 针对网页数据,过滤掉 HTML 标签
- 针对网页数据,过滤掉任何不含有 the, be, to, of, and, that, have, with 词汇的文档
- 针对所有数据,过滤掉如电话号码,邮箱地址,以及 IP 地址等隐私信息
基于分类器的方法,除了利用上述启发式的规则,我们也可以训练用于判别数据质量的文本分类器,进行预训练语料的清洗。具体来说,可以选取部分代表性的数据进行质量标注,以此训练出一个精准的文本质量分类器。在选取样本时,可以将维基百科等高质量数据作为正样本,同时从网页中筛选出含有不良内容或低质量数据的样本作为负样本。利用这个训练好的文本分类器,我们能够精准地识别和过滤低质量数据,从而显著提升整个语料库的质量。文本过滤的粒度可以是文档级别也可以是句子级别。需要注意的是,基于分类器的方法也可能无意中删除一些低资源但高质量的文本,如文言文数据等,数据清洗人员需要意识到这种情况,并且建立合理的数据召回与保留机制。为了减少数据的误筛,可以使用多个分类器进行联合过滤或召回,从而来实现对低质量文本的高可信过滤。此外,也可以针对不同的评估维度训练不同的分类器,并采用类似集成的方式对于语料进行全面的过滤。
目前常用来实现分类器的方法包括轻量级模型(如 FastText 等)、可微调的预训练语言模型(如 BERT、BART 或者 LLaMA 等)以及闭源大语言模型 API(如GPT-4、Claude 3)。这三个方法各自具有不同的优缺点:轻量级模型效率较高,但是分类的准确率和精度可能受限于模型能力;预训练语言模型可以针对性微调,但是分类性能的通用性和泛化性仍然有一定的限制;闭源大语言模型的能力较强,但是无法灵活针对任务进行适配,而且用于预训练数据清洗需要花费较高的成本。对于后两种方法来说,除了简单地进行数据过滤,还可以针对性进行数据的改写,从而使得一些整体质量还不错、但存在局部数据问题的文本仍然可以被保留下来使用。
值得一提的,在进行数据清洗时,过滤效率也是我们需要考虑的因素之一。例如,基于启发式的方法,其规则设计得相对简洁,因此能够迅速过滤 10M 乃至100M 级别的庞大文档集。然而,对于基于分类器的方法而言,虽然它们在评估文本质量方面能够展现出更高的精确度,但是这些方法也需要消耗更多的计算资源。为了平衡效率与准确性,可以针对具体数据集合进行清洗策略的灵活组合。例如,可以首先利用启发式规则进行初步筛选,以快速排除不符合要求的文档,随后再采用分类器方法进一步精细过滤,确保最终筛选出的语料具有较好的文本质量。在这一过程中,还可以同时应用多种分类器,可以先使用轻量级分类器进行数据过滤,进而使用更为有效但是资源消耗更高的分类器在粗滤后的数据上再次进行选择。
敏感内容过滤
除了去除低质量内容,收集到的数据还可能包括有毒内容或隐私信息,需要进一步进行更为细致的过滤和处理。与质量过滤类似,不同类型的数据内容往往需要采用特定的过滤规则。
过滤有毒内容. 为了精确过滤含有有毒内容的文本,可以采用基于分类器的过滤方法。Jigsaw 评论数据集提供了用于训练毒性分类器的数据。该数据集收集了近 160K 条论坛评论数据,每条评论都经过细致的标注,包括“有毒”、“严重有毒”、“有威胁”、“侮辱性”、“暴力”以及“身份仇恨”等六个类别。利用这一数据集进行训练,可以构建出高效的毒性文本分类器。通过设置合理的阈值,训练完成的分类器将能够有效识别并过滤掉含有有毒内容的信息。在进行分类阈值设置时,需要在精确度和召回率之间寻求平衡,避免过多或者过少去除候选数据。Dolma 的技术报告指出,使用高阈值时去除的数据会过少,语料中未过滤掉的有毒内容会导致模型在下游任务上的性能下降;而低阈值则会过滤更多的有毒内容,但同时也会造成大量数据的浪费。考虑到后续的预处理操作(如质量筛选、去重等)同样能够有效剔除有害内容,Dolma 选择为分类器设定了一个相对较高的阈值(0.4),从而保留更多的候选数据。最终,Dolma 在这一阶段仅过滤了 Common Crawl 中 30% 左右的数据。
过滤隐私内容. 预训练文本数据大多来自互联网,其中可能包括用户生成 的敏感信息或可识别的个人信息(Personally Identifiable Information, PII),如姓名、地址和电话号码等。这些信息如果不加处理,将增加隐私泄露的潜在风险。例如,在 2023 年 11 月有用户发现,反复要求 ChatGPT 重复某个单词可能会使其无意间泄露训练数据中的个人隐私信息,这个漏洞现在已经修复。因此,在预处理阶段,需要去除这些可识别的个人信息。一种直接且有效的方法是使用启发式方法,如关键字识别,来检测和删除这些私人信息 [99]。Dolma 采用了基于规则的方法来过滤数据集中的隐私内容,主要标注了三类敏感信息:邮箱地址、IP 地址以及电话号码。在文本收集过程中,一旦检测到这些隐私信息,Dolma 会根据其出现的频率采取不同的处理策略。具体来说,如果某个文档中的隐私信息少于五条,Dolma 会使用特定的词元(如“|||EMAIL_ADDRESS|||”、“|||PHONE_NUMBER|||”和“|||IP_ADDRESS|||”)来替换这些信息,以保护用户的隐私。然而,如果文档中的隐私信息达到六条或更多,Dolma 会选择直接删除整个文档。这是因为当文档中频繁出现隐私信息时,很可能还隐藏着其他未标注的敏感内容。
数据去重
对预训练数据进行去重处理是一个重要步骤。由于大语言模型具有较强的数据拟合与记忆能力,很容易习得训练数据中的重复模式,可能导致对于这些模式的过度学习。研究工作发现,预训练语料中出现的重复低质量数据可能诱导模型在生成时频繁输出类似数据,进而影响模型的性能。此外,这些数据也可能导致训练过程的不稳定(训练损失震荡),可能导致训练过程崩溃。此外,为了避免数据集污染问题,还需要从预训练数据集中删除在测试集中可能出现的重复或者相关文本,从而防止训练集和测试集之间的重叠。总体来说,去重算法的设计可以基于不同的计算粒度以及匹配方法。
计算粒度,去重可以在句子级别、文档级别和数据集级别等多种粒度上进行。在句子级别上,可以删除包含重复单词和短语的低质量句子,因为它们可能会在语言建模中引入重复的表达模式。在文档级别上,现有方法主要依靠单词或𝑛 元词组的重叠这类表层特征,来衡量文档的重叠比率,进而检测和删除包含相似内容的重复文档。现有的数据集往往采用多阶段、多粒度的方式来实现高效的去重。首先针对数据集和文档级别进行去重,旨在去除那些具有高度相似甚至完全一致内容的文档,例如多个 URL 可能具有相同的网页内容,或者网页数据集和新闻数据集中包含相同的新闻文档。随后,可以进一步在句子级别实现更为精细的去重。例如,可以计算两个句子之间公共子串的长度,当其长度过长时直接删除某一个句子。
用于去重的匹配方法,在去重过程中,可以使用精确匹配算法(即每个字符完全相同)或近似匹配算法(基于某种相似性度量)。对于精确匹配来说,通常使用后缀数组来匹配最小长度的完全相同子串。对于近似匹配来说,可以采用局部敏感哈希(Locality-Sensitive Hashing, LSH)算法,如最小哈希(MinHash)来实现。考虑到预训练数据集合的规模非常大,实现中可以综合考虑去重效率和去重效果之间的权衡。例如,RefinedWeb 在文档层面采用了开销较小的近似匹配技术来实现去重,而在句子层面则采用了精确匹配算法来确保去重的准确性。
MinHash 是一种估计两个集合之间相似度的技术,最初被引入到信息检索领域,旨在迅速判断文档间的相似性。其核心思想在于,通过哈希处理集合元素,并选择最小的哈希值作为集合的表示。随后,通过比较两个集合的最小哈希值,便能大致估算出它们的相似度。为进一步提升相似度估计的精确度,可以采用不同的哈希函数为每个集合生成多个 MinHash 值。之后,通过计算两个集合间共有 MinHash 值的比例,便能得到它们相似度的估算值。MinHash 技术之所以在估算集合相似性方面表现卓越,是因为它能够避免对集合中所有元素进行繁琐的逐一比较,相反,只需比较那些更为简洁、易于对比的哈希值。这一特性使得 MinHash 在处理那些难以直接全面比较的超大型集合时,具有较好的计算效率。