预训练语料库的来源包括通用文本数据,如:网页、书籍和对话文本等,它们规模大、多样性强并且易于获取,可以用来提升LLM的语言建模和泛化能力。也有研究将预训练语料库扩展到更专用的数据集,如多语言数据、科学数据和代码等,赋予LLM解决专用任务的能力。收集大量文本数据后,对数据进行清洗,特别是消除噪声、冗余、无关和潜在有害数据,对于构建预训练语料库是必不可少的,因为这些数据可能会极大影响LLM的能力和性能。
本文讲述利用data-juicer对中英文大语言模型预训练数据进行清洗的流程。预训练数据来源多样,在正式处理前需要对其进行预处理。首先是将数据格式统一,例如原始数据可能包含txt文档、excel表格、json文件、pdf、tex等,需要将其中主体内容提取出来,保存为统一格式的文件,如jsonl文件,同时保留数据来源信息。统一格式后,为了方便查看和处理,需要对文件尺寸过大的数据进行分块,比如将30GB的大文件分成每个2GB大小的文件。预处理完成后,接下来是正式处理:
第一步,语言分类。在自然语言处理中,中文与英文的一个重要区别是英文单词按空格隔开,而中文词语是连在一起的,因此它们有不同的tokenizer方式,处理也通常是分开的。在多语言情况下,这种语言分类也可以拓展为将语言按语系分类为汉藏语系和印欧语系等。对于单语言语料,根据文件分开即可,但对包含多种语言的语料,需要使用fastText等语言分类器进行分类。代码相关数据有其独特性,尤其是在去重中,如果采用与自然语言相同的去重方式,代码数据会被大量去除,因此也要分开处理。
第二步,修正。在语料整体质量较高,只是存在部分难理解元素情况下,不需要将数据整条删除,只需要对其进行修正即可。例如,中英文都存在特殊符号和emoji表情,需要删除,网址、IP等语言模型无法理解的内容需要替换成标识符,标准化unicode符号和空格。中文的繁体语料转换成简体,代码数据去除版权声明等模板内容。
第三步,过滤。对于整体质量较差的语料,需要整条删除。例如只有不足30字的文档信息量过低、大模型生成的数据可能出现重复某个字词句多次的情况,这些数据都需要删除。基于度量的过滤则是利用高质量语料训练的打分器给语料打分,过滤掉不自然的句子。另外,语料中不可避免存在有毒和冒犯性内容,需要使用关键词和分类器的方式进行安全过滤。
第四步,去重。语料库中重复的数据会降低语言模型的多样性,影响模型性能,因此需要对预训练语料库进行去重。对于自然语言,常用的相似去重方法有Minhash和Simhash,minhash采用滑动窗口扫描整个文档然后计算hash值,而simhash先找到文档中的关键词然后进行hash,因此速度上simhash>minhash,准确性上minhash>simhash。代码数据本身重复程度较高,采用相似去重会删掉大量不同的代码,所以对代码数据采用精确去重的方式。