- 4 预训练
- 预训练为 LLM 的能力奠定了基础。 通过在大规模语料库上进行预训练, LLM 可以获得基本的语言理解和生成能力 [55, 56]。在这个过程中, 预训练语料库的规模和质量对于 LLM 获得强大的能力至关重要。
- 此外,为了有效地预训练 LLM,也需要设计好模型架构、 加速方法和优化技术。
- 第 4.1节讨论数据收集和处理
- 第 4.2节介绍常用的模型架构
- 第 4.3节介绍用于稳定高效地优化 LLM 的训练技巧。
- 4.1 数据收集
- 相比小规模语言模型, LLM 更需要高质量数据来预训练模型, 并且它们的模型能力很大程度上依赖于预训练语料库及其预处理方式。
- 4.1.1 数据来源
- 要开发出一个有能力的 LLM,其关键在于从各种数据来源中收集大量的自然语言语料库。
- 预训练语料库的来源可以广义地分为两种类型:通用文本数据和专用文本数据。
- 通用文本数据:
- 绝大多数的 LLM 采用了通用的预训练数据, 比如网页、 书籍和对话文本等, 这些数据源提供了丰富的文本资源, 并且涉及了多种主题。
- , 我们简要总结三种重要的通用文本数据。
- 网页:
- 对话文本:
- 书籍:
- 专用文本数据:
- 专用数据集对于提高 LLM 在特定下游任务中的能力非常有用。接下来,我们介绍三种专用数据类型。
- 多语言文本:
- 科学文本:
- 代码:
- 4.1.2 数据预处理
- 在这部分中,我们将细致地回顾提高收集数据质量的数据预处理策略 [59, 69, 109]。预处理 LLM 的预训练数据的典型流程已在图 3中说明。
- 质量过滤:
- (1) 基于分类器的方法
- 基于高质量文本训练选择分类器, 并利用它来识别和过滤低质量数据。
- 使用高质量数据 (例如维基百科页面) 作为正样本, 采样候选数据作为负样本来训练二元分类器,并预测衡量每个数据的质量的分数。
- 基于分类器的方法可能会删除方言、 口语和社会语言的高质量文本, 从而可能导致有偏的预训练语料库,并减少语料库的多样性。
- (2) 基于启发式的方法
- 通过设计一组精心设计的规则来消除低质量文本,这些规则可以总结如下
- 基于语言的过滤:
- 基于度量的过滤:
- 基于统计的过滤:
- 基于关键词的过滤:
- (1) 基于分类器的方法
- 去重:
- 语料库中的重复数据会降低语言模型的多样性,可能导致训练过程不稳定,从而影响模型性能。
- 可以在句子级、文档级和数据集级等不同粒度上去重。
- 在句子级别上, 应删除包含重复单词和短语的低质量句子, 因为它们可能会在语言建模中引入重复模式
- 在文档级别上,现有研究主要依靠文档之间的表层特征(例如单词和 n 元的重叠)的重叠比率来检测和删除包含相似内容的重复文档
- 为了避免数据集污染问题,还必须通过从训练集中删除测试集可能出现的重复文本,来防止训练集和评估集之间的重叠
- 隐私去除:
- 从预训练语料库中删除可识别个人信息(PII)
- 直接有效的方法是采用基于规则的方法
- 例如关键字识别,来检测和删除 PII,例如姓名、地址和电话号码
- 分词:
- 目的是将原始文本分割成词序列,随后用作 LLM 的输入。
- 使用专门为预训练语料库设计的分词器可能会更加有效 [69],特别是对于由多种领域、语言和格式组成的语料库。
- 最近的几个 LLM 使用SentencePiece [164] 为预训练语料库训练定制化的分词器。 同时利用字节级的 Byte Pair Encoding (BPE) 算法 [165] 来确保分词后的信息不会丢失 [56, 59]。然而需要注意的是,BPE 中的归一化技术,例如 NFKC [166],可能会降低分词性能
- 4.1.3 预训练数据对大语言模型的影响
- 由于对计算资源的巨大需求,通常不可能对 LLM 进行多次预训练迭代。因此,在训练 LLM 之前构建一个准备充分的预训练语料库尤为重要。
- 混合来源:
- 预训练数据的数量:
- 预训练数据的质量:
- 4.2架构
- 本节中,我们将回顾 LLM 的架构设计,包括主流架构、预训练目标和详细配置。
- 4.2.1 主流架构
- 现有 LLM 的主流架构可以大致分为三种类型,即编码器-解码器、因果解码器和前缀解码器
- 编码器-解码器架构:
- 因果解码器架构:
- 前缀解码器架构:
- 对于这三种类型的架构,我们也可以考虑通过混合专家(MoE)扩展它们
- 4.2.2 详细配置
- 在这部分中, 我们将讨论Transformer 的四个主要部分的相应配置,包括标准化、位置编码、 激活函数、 注意力和偏置。
- 标准化:
- 激活函数:
- 位置编码:
- 注意力机制和偏置:
- 综合上述讨论,我们总结了现有文献中的详细配置建议。
- 为了有更强的泛化能力和训练稳定性,建议选择前置的 RMS 进行层标准化, 并选择 SwiGLU 或 GeGLU 作为激活函数。 此外, 在位置编码方面, RoPE 或 ALiBi 是更好的选择, 因为它们在长序列上表现更好。
- 4.2.3 预训练任务
- 预训练在将大规模语料库中的通用知识编码到巨大的模型参数中起着关键作用。
- 对于训练 LLM,有两个常用的预训练任务,即语言建模和去噪自编码。
- 语言建模:
- 去噪自编码:
- 4.2.4 总结与讨论
- 选择架构和预训练任务可能会对 LLM 的归纳偏差产生不同影响, 从而导致不同的模型性能。
- 在本部分中, 我们总结了现有文献中关于这个问题的一些重要发现或讨论。
- 通过使用语言模型目标进行预训练,因果解码器架构似乎可以实现更优越的零样本和小样本泛化能力。
- 因果解码器中已经广泛观察到了扩展法则。 通过扩展模型大小、数据集大小和总计算量,可以大幅提高因果解码器的性能
- 4.3 模型训练
- 在这一部分中,我们回顾了训练 LLM 的重要设置、技巧或诀窍。
- 4.3.1 优化设置
- 为了进行 LLM 的参数优化,我们介绍了批量训练、学习率、优化器和训练稳定性的常用设置。
- 批量训练:
- 学习率:
- 优化器:
- 稳定训练:
- 4.3.2 可扩展的训练技术
- 随着模型和数据规模的增加,有限的计算资源下高效地训练LLM 变得具有挑战性。 尤其是两个主要的技术问题需要解决, 即提高训练吞吐量和加载更大模型到显存中。
- 回顾了已有工作中广泛用于解决上述两个挑战的几种方法
- 3D 并行
- ZeRO
- 混合精度训练
- 3D 并行:
- 三种常用并行训练技术的组合
- 数据并行
- 流水线并行
- 张量并行
- ZeRO:
- 混合精度训练:
- 整体训练建议:
- 在实践中,上述训练技术,特别是 3D 并行技术,通常会联合使用以提高训练吞吐量和大模型加载。
- 为了减少内存冗余, 可以使用 ZeRO、 FSDP 和激活 c 重计算 (activation recomputation) 技术 [68, 203] 来训练 LLM
- ,混合精度训练技术,如 BF16,也可以利用来提高训练效率和减少显存使用,但需要硬件的必要支持(如 A100 GPU) 。
- 由于训练大模型是一个耗时的过程,因此在早期阶段预测模型性能并检测异常问题将非常有用。为此,GPT-4 [45] 最近引入了一种基于深度学习堆栈的新机制,称为可预测扩展,可以使用更小的模型对大模型进行性能预测, 这对于开发 LLM 可能非常有用。
- 例如, PyTorch 支持完全分片数据并行训练算法 FSDP [201](即 fully sharded data parallel) ,如果需要,可以将部分训练计算卸载到 CPU 上。
- 除了上述训练策略,提高使用 LLM 的推理速度也很重要。通常,量化技术被广泛用于减少 LLM 推理阶段的时间和空间开销
- 虽然会损失一些模型性能,但量化语言模型具有更小的模型大小和更快的推理速度 [97, 205, 206]。对于模型量化,INT8 量化是一个流行的选择
- 预训练为 LLM 的能力奠定了基础。 通过在大规模语料库上进行预训练, LLM 可以获得基本的语言理解和生成能力 [55, 56]。在这个过程中, 预训练语料库的规模和质量对于 LLM 获得强大的能力至关重要。