准备预训练大模型
在正式开始预训练之前,还需要完成两项基础工作:准备文本数据、以及把文本数据转换成向量格式。
一、准备文本数据
大语言模型最终能学到什么,很大程度上取决于它“读过什么样的内容”。
收集高质量、多领域、多源化的训练数据可以帮助大语言模型更加全面地学习现实世界的语言规律与知识,从而提高其通用性和准确性。
数据来源
常见的数据来源包括网页、书籍、代码、新闻、论文、多语言文本及其他公开资料。
不同来源的数据,会提升模型不同方面的能力。
- 网页:网页中包含了丰富多样的文本内容,能够为模型提供大量的世界知识。
- 书籍:书籍中的内容更完整、结构更清晰,能够帮助模型理解语言的内在逻辑与表达习惯,提高模型捕捉长文本依赖关系的能力。
- 代码:代码数据能够增强模型结构化语义理解与逻辑推理能力,还有助于增强模型的工具使用与学习能力。
- 多语文本:多语言文本数据可以增强模型的多语理解与生成能力,支持跨语言理解与对话任务。多语言数据还能有效增加数据的多样性,有助于提升模型的综合性能。
可以说,数据来源越丰富,模型学到的能力通常也越全面。
然而,收集到大量的文本数据并不能直接拿来训练,因为原始数据中往往混杂着低质量、重复、无关甚至有害的内容。如果不先处理干净,这些问题就会直接影响模型训练效果。
因此,在预训练之前,我们还还需要对数据进行质量过滤、内容过滤、数据去重等数据处理工作。
数据处理
- 质量过滤和内容过滤
质量过滤的目的是为了去除原始数据集中的错误、不完整或无关的信息,提高数据的整体质量。
内容过滤的目的是为了去除数据集中包含的非法、有毒或隐私内容的信息,降低训练风险。
目前主要有两种数据清洗方法:基于启发式规则的方法和基于分类器的方法。
基于启发式规则的方法:通过精心设计的规则来针对地识别和剔除低质量或敏感内容。
这种方法的优点是:
- 处理速度快。
- 计算成本低。
- 适合大规模初步筛选。
缺点是规则通常比较死,不同类型的文本数据需要设计不同的清洗规则,面对复杂情况时不够精细。
基于分类器的方法:先训练一个用于识别低质量或敏感内容的文本分类器,然后再使用这个文本分类器,进行数据的清洗。
这种方法的优点是:
- 识别更精细。
- 准确度通常更高。
- 对复杂文本更有效。
缺点是需要额外训练模型,也会消耗更多计算资源。
总的来说,两种方法各有优劣,在实际使用中,为了平衡过滤的效率与准确性,可以针对具体的数据集合灵活组合过滤策略。例如,可以先使用启发式规则对数据集进行初步筛选,排除不符合要求的数据,然后再采用分类器方法进一步精细过滤,确保最终筛选出的语料具有较好的文本质量。
- 数据去重
数据去重的目的是避免模型反复学习大量重复内容。否则,模型在生成结果时可能频繁输出重复数据,影响整体性能,甚至引发模型训练过程不稳定甚至崩溃等问题。
通常可以在句子级别、文档级别和数据集级别等多种粒度上对数据集进行去重。
- 句子级别去重:可以删除那些明显包含重复单词、重复短语或内容高度相似的低质量句子。
- 文档级别去重:可以通过相关算法计算出文档之间的相似度或重叠比率,从而识别和删除包含相似内容的重复文档。
- 数据集级别去重:先在文档级别进行大范围去重,再进一步在句子级别进行更细致的清理。
经过上面的数据处理后,我们拥有了高质量的文本数据集。
但是大语言模型本质上是深度神经网络模型,它无法直接处理原始文本数据。
因此,我们需要将文本数据转换为大模型能够理解和处理的格式。
二、嵌入向量
将数据转换为向量格式的过程通常称为嵌入(embedding)。
嵌入向量的过程,包括将文本分割为词元,将词元转化为词元 ID,以及词元 ID 转换为向量。
文本分词
文本分词的目的是将文本数据切分成小的、有意义的、模型可识别的单元(词元),词元既可以是单个单词,也可以是包括标点符号在内的特殊字符。
例如:
- 单词:love、cat、programing 等。
- 特殊符号:
<|unk|>用于表示未知词,<|endoftext|>用于表示文本的结束。
常见的分词方法包括基于词典、规则、子词、字符等多种分词方法,选择合适的分词方法能够显著影响模型的训练效率和最终性能。也可以针对大语言模型的某些特定能力,专门设计和训练定制化的分词器。
在文本被切分成词元之后,下一步是将这些词元转换成词元 ID(token ID)。
词元转化为词元 ID
词元 ID 是每个词元对应的唯一整数表示。要完成这一步,需要借助一个词汇表。
词汇表中记录了每个词元及特殊符号所对应的唯一整数 ID。它通常基于整个训练集构建而成,不仅可以用于训练数据本身,也可以用于处理新的文本样本。
词汇表的构建过程一般包括以下几个步骤:
- 将训练数据中的文本分割成词元。
- 按字母顺序排列并去除重复的词元。
- 将每个唯一词元映射到唯一的整数 ID。
当词汇表构建完成后,就可以对新的文本样本进行分词,并根据词汇表将其中的词元转换为对应的词元 ID。
不过,仅有词元 ID 还不够,因为模型真正处理的是向量,而不是简单的数字标签。
因此,接下来还需要把词元 ID 映射到高维向量空间中,得到对应的嵌入向量。
词元 ID 转换为向量
嵌入向量能够捕捉到词元之间的语义关系,使得模型能够理解不同词语之间的联系。
嵌入向量通常具有较高维度,例如 256、512、768 等。每个词元 ID 都会对应一个固定维度的向量,用来表示该词元在向量空间中的位置和特征。
除了词嵌入向量外,还会向这些嵌入向量中添加 位置嵌入(Position Embedding),这是为了提供文本中各个词元的位置信息,帮助模型理解词元在句子中的顺序。
总结
以句子 I love cats. 为例,它从原始文本到嵌入向量的数据格式变化如下:
第一步,文本分词
结果:["I", "love", "cats", "."]
第二步,词元转换为词元 ID
"I" -> 101
"love" -> 102
"cats" -> 103
"." -> 104
结果:[101, 102, 103, 104]
第三步:词元 ID 转换为嵌入向量
101 -> [0.12, -0.45, 0.88]
102 -> [0.31, 0.07, -0.22]
103 -> [-0.14, 0.56, 0.19]
104 -> [0.03, -0.09, 0.41]
结果:
[
[0.12, -0.45, 0.88],
[0.31, 0.07, -0.22],
[-0.14, 0.56, 0.19],
[0.03, -0.09, 0.41]
]之后,这些嵌入向量会被组织成张量(Tensor),作为模型的输入。张量是深度学习中处理数据的标准格式,能够支持批量处理和高效计算。
