原文下载地址:https://wandb.ai/site/wp-content/uploads/2023/09/Current-Best-Practices-for-Training-LLMs-from-Scratch-Final.pdf
介绍
这篇白皮书详细介绍了从头开始训练大型语言模型(LLMs)的最佳实践,主要涵盖以下几个方面:
- 扩展法则:讨论了如何根据模型大小和数据集规模来确定训练策略,以实现模型性能的最优平衡。
- 硬件需求:介绍了训练LLMs所需的硬件配置,包括GPU、TPU等高性能计算设备,强调了硬件资源的合理配置对模型训练效率的重要性。
- 并行化技术:提供了多种并行化技术,如数据并行和模型并行,来加速训练过程,并减轻计算资源的负担。
- 数据集收集和预处理:强调了高质量训练数据集的重要性,介绍了数据收集的标准和预处理方法,以确保数据集的多样性和代表性。
- 内存和计算效率管理:提出了多种方法来优化内存使用和计算效率,包括混合精度训练和梯度检查点保存等技术。
- 偏见和毒性管理:讨论了LLMs在训练过程中可能出现的偏见和毒性问题,提出了检测和缓解这些问题的策略,如公平性评估和偏见消除技术。
- 性能和安全性改进:通过指令调优和人类反馈的强化学习等方法,来提高模型的性能和安全性,确保模型在实际应用中的可靠性。
这些内容为组织在决定是否自行训练LLMs或使用现有模型时提供了全面的指导,并提供了实际操作中的具体建议和注意事项。
介绍
尽管transformer模型的突破仅仅发生在几年前,大型语言模型(LLMs)在性能、成本和潜力方面已经取得了巨大的飞跃。在 Weights & Biases (W&B),我们有幸见证了比任何人都更多的团队尝试构建 LLM。然而,许多关键细节和重要决策点往往是通过口口相传的方式传播的。
本白皮书的目标是提炼出从零开始训练 LLM 的最佳实践。我们将涵盖从扩展性与硬件到数据集选择与模型训练的各个方面,帮助您了解需要权衡的取舍,并指出潜在的陷阱。这是一份相对全面的指南,旨在阐明从头训练 LLM 时需要经历的重要步骤和考量因素。
在开始之前,您首先需要问自己一个问题:从零训练一个 LLM 是否适合您的组织?因此,我们将从这个问题开始探讨。
构建与购买预训练大模型
在开始LLM预训练之前,你需要首先考虑的问题是,你应该自己预训练一个LLM,还是使用一个现有的。基本上有以下3种方法:
- 使用商业LLM的API,例如GPT-3 (OpenAI, 2020)、Cohere APIs、AI21 J-1
- 使用现有的开源LLM,例如GPT-J (EleutherAI, 2021)、GPT-NeoX (EleutherAI, 2022)、Galactica (Meta AI)、UL2 (Google, 2022)、OPT (Meta AI, 2022)、BLOOM (BigScience, 2022)、Megatron-LM (NVIDIA, 2021)、CodeGen (Salesforce, 2022)
- 自己预训练一个LLM或与顾问合作:你可以自己管理训练过程,或雇佣LLM顾问和平台。例如,Mosaic ML 提供专注于LLM的训练服务。
话虽如此,在做出选择时,还有很多细节需要考虑。下面是每个选项的优缺点和适用场景。
方法 | 使用商业LLM的API | 使用现有的开源LLM | 自己预训练一个LLM或与顾问合作 |
---|---|---|---|
优点 | 1. 需要最少的LLM训练技术技能。 2.前期训练/探索成本最低,主要成本在推理时产生。 3. 对数据需求最少的选项。只需要几个示例(或无需示例),模型即可执行推理。 4. 可以利用市场上表现最好的LLMs,打造出色的体验。 5. 减少应用程序的上市时间,并使用有效的LLM模型降低项目风险。 |
1. 利用LLMs从大量互联网数据中学到的知识,并在此基础上进行构建,而无需在推理时支付IP费用的一个好方法。 2. 与选项1相比,您对LLM服务提供商未来发展方向的依赖性更小,因此在路线图和向后兼容性方面拥有更多控制。 3. 与选项3相比,由于您不是从零开始构建LLMs,因此获得价值的时间更快,这也意味着所需的数据、训练时间和训练预算更少。 |
1. 与选项1和2相比,您对LLM的性能和未来方向拥有最多的控制权,这为您在技术创新和/或定制下游任务时提供了极大的灵活性。 2. 完全控制用于预训练的训练数据集,这直接影响模型质量、偏见和毒性问题。相比之下,这些问题在选项1或2中不那么可控。 3. 自己训练LLM还为您提供了一个深厚的护城河:在水平使用案例或垂直定制中实现卓越的LLM性能,特别是如果您通过LLM部署创建了一个积极的数据/反馈循环,可以让您建立持久的优势。 |
缺点 | 1. 商用LLM服务在进行大量微调或推理任务时可能会变得昂贵。这归结为每次推理时分摊到的LLM总体拥有成本(TCO)。 2. 很多行业/用例禁止使用商用LLM服务,因为敏感数据/PII数据出于合规性原因不能被服务看到(例如医疗保健用例)。 3. 如果构建外部应用程序,你需要找到其他护城河并降低业务风险,尤其是在你高度依赖外部LLM服务技术时。 4. 下游灵活性差:不支持边缘推理,定制模型(微调变得昂贵)的能力有限,持续改进模型的能力有限。 |
1. 要求不像自己构建那样高,但仍需要大量领域专家技能来训练、微调和托管开源的大型语言模型。大型语言模型的可重复性仍然是一个重要问题,因此所需的时间和工作量不能低估。 2. 如果你在构建下游应用,由于更垂直的技术栈,上市时间较慢且灵活性较差。 3. 开源模型的性能通常落后于商业模型几个月/几年。如果你的竞争对手利用商业模型,他们在大型语言模型技术上具有优势,你将需要找到其他竞争优势。 |
1. 非常昂贵的计划,且风险很高。需要跨领域的知识,涵盖NLP/ML、主题领域专长、软件和硬件专长。如果做得不好,你可能会遇到一种情况,花费了成千上万甚至数百万美元,却得到一个次优模型。失误,尤其是在训练阶段后期的失误,很难修复/逆转。 2. 比第二种选择效率低。第二种选择利用现有的LLM,从整个互联网的数据中学习,可以提供一个牢固的起点。采用第三种选择,你需要从零开始,并且需要大量高质量/多样化的数据集来使你的模型获得泛化能力。 |
何时考虑每个选项 | 1. 最好是在你有较少技术团队但希望利用LLM技术来构建下游应用程序,或者你希望出于性能原因利用最先进的LLM(外包LLM技术)。 2. 如果你的训练数据集非常有限并希望利用LLM的零/少样本学习能力,这也是个好选择。 3. 适合用于原型应用程序和探索LLM可能实现的功能。 |
1. 在选项2和选项3之间,如果你不打算改变模型架构,几乎总是更好直接选择一个现成的预训练大语言模型(LLM)并进行微调,或者将现有预训练LLM的权重作为起点并继续预训练。原因是像GPT-NeoX这样的优秀预训练LLM已经见过大量数据,因此从数据中学习到了通用能力。特别是如果你的训练数据集不大或不多样化,你可以利用这种学习。 2. 另一个典型场景是,你在一个监管环境中操作,或者有用户/敏感数据不能提供给商业LLM服务。或者由于延迟或位置原因,你需要在边缘部署模型。 |
1. 如果您需要从现有的预训练大型语言模型(LLM)中更改模型架构或训练数据集,这是最佳选择。例如,如果您想使用不同的分词器、改变词汇表大小,或更改隐藏维度、注意力头或层的数量。 2. 通常在这种情况下,LLM是您业务策略和技术壁垒的核心部分。您在LLM训练中进行了一些或大量的创新,并且有大量的投资热情,能够持续训练和维护昂贵的模型。 3. 通常,您拥有或将拥有大量与LLM相关的专有数据,以创建一个连续的模型改进循环,实现可持续的竞争优势。 |
值得一提的是,如果你只有一组非常有针对性的用例,不需要LLM的通用功能或生成功能,你可能需要考虑训练或微调一个小得多的transformer或其他更简单的深度学习模型。这样可以导致复杂性更低、训练时间更短以及持续成本更低。
扩展法则
在开始训练之前,了解LLMs如何扩展是很重要的。理解扩展可以让你有效地平衡模型的大小和复杂性,以及用来训练它的数据的大小。
这里有一些相关的历史:OpenAI在2020年首次提出了“LLM扩展定律”。他们认为增加模型的大小比扩展数据大小更重要。这一观点维持了大约2年,然后DeepMind提出了几乎完全相反的观点:以前的模型明显训练不足,增加基础训练数据集实际上会带来更好的性能。
这一切在2022年发生了变化。具体而言,DeepMind在他们的《计算最优大语言模型训练》论文中提出了一种替代方法。他们发现当前的LLMs实际上显著训练不足。简单来说:这些大模型的训练数据远远不够。
DeepMind用一个名为Chinchilla的模型展示了这一点,该模型仅是上面提到的Gopher模型大小的1/4,但训练数据多了4.6倍。在这个缩小的大小但训练数据大大增加的情况下,Chinchilla的表现超越了Gopher和其他LLMs。
DeepMind声称,为了达到最佳性能,模型大小和训练tokens数量应以大致相同的速度增加。如果你的计算能力增加10倍,你的模型应该增加3.1倍,数据训练量应增加3.1倍;如果你的计算能力增加100倍,你的模型应该增加10倍,数据训练量应增加10倍。
注意:在NLP中,分词是将一段文本分成称为tokens的小单元的基本步骤。tokens可以是单词、字符或子词。训练tokens的数量是经过分词后的token形式的训练数据大小。稍后我们将深入探讨具体的分词方法。
在每条曲线的最小值的左侧,模型太小——在较少数据上训练的较大模型会有所改进。在每条曲线的最小值的右侧,模型太大——在更多数据上训练的较小模型会有所改进。最好的模型位于最小值处。
DeepMind提供了下表,展示了对不同规模的模型进行最佳训练所需的数据量和计算量。
估计不同模型规模的最佳训练FLOPs和训练tokens数量, Training Compute-Optimal Large Language Models
话虽如此,大多数现有的LLMs仍然训练不足。
总之,选择你的LLM模型大小的当前最佳实践主要基于两条规则:
- 决定你的数据集,并根据数据大小找到Chinchilla最佳模型大小(或在数据收集限制范围内接近Chinchilla最佳)
- 根据你的训练计算预算和推理延迟要求,确定最佳的数据和模型大小组合
硬件
预训练LLMs是一项硬件密集型工作,这一点并不令人惊讶。以下是一些当前模型的例子,它们是很好的参考:
- PaLM(540B, Google):总共使用了6144个TPU v4芯片,由两个TPU v4 Pods通过数据中心网络(DCN)连接,结合了模型和数据并行性
- OPT(175B, Meta AI):992个80GB A100 GPU,使用Megatron-LM张量并行性进行完全共享的数据并行
- GPT-NeoX(20B, EleutherAI):总共96个40GB A100 GPU
- Megatron-Turing NLG(530B, NVIDIA & MSFT):560个DGX A100节点,每个集群节点拥有8个NVIDIA 80GB A100 GPU
从基础设施的角度来看,训练LLMs有两个主要挑战。首先,即使是最大的GPU(例如NVIDIA 80GB-A100),也无法将所有模型参数放入内存,因此这里需要一些并行架构。另一个挑战是,如果不同时优化算法、软件和硬件堆栈(例如训练175B参数的GPT-3单个V100 NVIDIA GPU需要约288年),大量的计算操作可能会导致训练时间过长。
内存与计算效率 vs 并行化技术
为了实现数千个分布式GPU的全部潜力,在你的架构中设计并行性以平衡内存和计算效率是至关重要的。
内存效率
训练一个LLM需要数TB的聚合内存来存储模型权重、梯度和优化器状态,这远远超出了单个GPU的可用范围。一种典型的缓解策略是梯度累积,其中完整的训练批次被分割成依次处理的小批次,它们的梯度在更新模型权重之前被累加。这意味着你的训练批次大小可以扩展,而不需要增加峰值驻留激活内存。
计算效率
尽管大型GPU集群可能拥有数千个高吞吐量的GPU,但在这种规模上实现高计算效率是具有挑战性的。采用大的批处理规模可以作为提高计算效率的有效方法,因为它增加了GPU内核的算术强度,并有助于摊销因通信和同步而导致的等待时间。然而,使用过大的批处理规模可能会对模型质量产生负面影响。尽管并行化至关重要,但有许多不同的实现方法。我们将在下一节中讨论最常见的方法。
并行化技术
并行化是指将任务分解并分配到多个处理器或设备(例如GPU)上,以便它们可以同时完成。与在单个处理器或设备上运行相比,这样可以更高效地利用计算资源并加快完成速度。在多个GPU上进行并行化训练是一种有效减少训练过程所需总时间的方法。有几种不同的策略可以用于并行化训练,包括梯度累积、微批处理、数据并行化、张量并行化和流水线并行化等。典型的大型语言模型(LLM)预训练采用这些方法的组合。让我们分别定义每个方法:
数据并行
数据并行是处理在深度学习工作流程中无法放入单台计算机的大型数据集的最佳且最常见的方法。更具体地说,数据并行将训练数据分成多个分片(分区)并分配到不同的节点。每个节点首先使用其本地数据训练其子模型,然后在某些间隔与其他节点通信以组合它们的结果,从而获得全局模型。数据并行的参数更新可以是异步的也可以是同步的。
这种方法的优点是它提高了计算效率,且相对容易实现。最大的缺点是在反向传播过程中需要将整个梯度传递给所有其他GPU。它还在所有工作节点上复制模型和优化器,这相当不利于内存效率。
张量并行
张量并行将大型矩阵乘法分成较小的子矩阵计算,然后使用多GPU同时执行。
这种方法由于其异步性质并能够减少节点之间的通信开销,从而允许更快的训练时间。这种方法的优点是节省内存。然而,缺点是它在每次前向和后向传播中引入了额外的激活通信,因此需要高通信带宽才能高效运行。
流水线并行与模型并行
流水线并行通过将模型的层划分为可以并行处理的阶段,提高了深度学习训练的内存和计算效率。
这显著提升了整体吞吐速度,同时增加了最小的通信开销。你可以将流水线并行视为“层间并行”(而张量并行则可以视为“层内并行”)。与流水线并行类似,模型并行是将模型分割在多个GPU上并为每个模型使用相同的数据;因此,每个GPU处理模型的一部分,而不是数据的一部分。流水线和模型并行的缺点是,由于流水线并行的程度受模型深度的限制,因此无法无限扩展。
正如本节开始所提到的,团队在训练过程中结合使用并行技术并不少见。例如,PaLM(Google Brain,2022)和OPT(Meta AI,2022)都结合使用了张量模型并行和数据并行。
NVIDIA在《Efficient Large-Scale Language Model Training on GPU Clusters Using Megatron-LM》论文中采用了不同的方法。他们提出了一种PTD-P技术,将流水线、张量和数据并行结合起来,在数千个GPU上实现了最先进的计算性能(达到设备峰值吞吐量的52%)。
具体来说,PTD-P利用跨多GPU服务器的流水线并行、单个多GPU服务器内的张量并行和数据并行,实际训练具有1万亿参数的模型。该方法还在优化的集群环境中使用了优雅的扩展,服务器内部和服务器之间的GPU通过高带宽链接进行连接。
使用这些技术训练大规模语言模型不仅需要性能最高的GPU,还需要高带宽网络以实现最佳通信——通常使用InfiniBand在节点之间传输数据。
但这当然是有成本的。利用数千个高性能GPU和高带宽网络来训练大规模语言模型需要大量基础设施。例如,一次简单的计算估计PaLM模型(540B,Google)的成本可能高达2300万美元(详见分析)。
为了实现分布式深度学习训练系统,通常需要软件工具包如Distributed TensorFlow、Torch Distributed、Horovod,以及库如DeepSeed和Megatron。这存在实施复杂性,因此如果想要成功,需要系统专业知识。
此外,以下技术和策略常用于实现并行。
梯度累积
梯度累积涉及将多个批次的梯度加在一起,然后在所有累积的梯度上执行一次权重更新步骤。
这种方法减少了GPU之间的通信开销,因为它们可以在自己的本地数据批次上独立工作,直到在为单次优化步骤积累了足够的梯度后再次同步。
异步随机梯度下降优化
在多个GPU上进行模型优化时,也可以采用异步随机梯度下降优化方法。
这种方法使用每个节点的数据小子集(微批次),而不是一次性加载所有数据,这有助于减少内存需求,同时由于其异步性质仍然允许快速收敛。其工作流程如下:
- 首先,我们从参数服务器获取处理当前小批次所需的最新模型参数。
- 然后,我们计算这些参数与损失函数之间的梯度。
- 最后,这些梯度被发送回参数服务器,然后参数服务器据此更新模型。
微批处理
微批处理将小的微型批次合并为较大的批次,从而可以在更短的时间内处理更多的批次,并且在反向传播操作期间减少设备之间的同步点。由于其能够减少内存消耗和提高可扩展性的能力,它在跨多个GPU训练非常大型模型时变得越来越受欢迎。总体而言,微批处理是一种在处理非常大型数据集或需要大量处理能力的模型时,利用分布式深度学习技术的有效方法。
既然我们已经讨论了扩展、硬件以及一些并行化训练运行的技术,现在让我们来看一下你的LLM实际将从中学到什么:数据。
数据集收集
坏数据会导致不良模型。但对高质量、高容量、多样化的数据集进行仔细处理,能够直接提升模型在下游任务中的表现以及模型的收敛性。数据集多样性对大型语言模型(LLM)尤其重要。这是因为多样性能够提升模型的跨领域知识,以及其在下游任务中的泛化能力。在多样化示例上进行训练,可以有效地扩展你的LLM在各种细微任务上的表现能力。
一个典型的训练数据集由来自多种来源的文本数据组成,例如抓取的公共数据、在线出版物或书籍存储库、来自GitHub的代码数据、维基百科、新闻、社交媒体对话等。
例如,考虑The Pile。The Pile是由EleutherAI创建的一个用于大规模语言建模的流行文本语料库。它包含来自22个数据源的数据,大致分为5个大类:
- 学术写作:PubMed Abstracts和PubMed Central、arXiv、FreeLaw、USPTO Backgrounds、PhilPapers、NIH Exporter
- 在线或抓取资源:CommonCrawl、OpenWebText2、Stack Exchange、Wikipedia
- Prose: BookCorpus2, Bibliotik, Project Gutenberg
- Dialog: YouTube字幕, Ubuntu IRC, OpenSubtitles, Hacker News, Europarl
- 杂项: GitHub, the DeepMind Mathematics dataset, Enron邮件
请注意,The Pile数据集是为数不多的对公众免费开放的大规模文本数据集之一。目前大多数现有的模型如GPT-3、PaLM和Galactica,它们的训练和评估数据集并不公开。鉴于编制和预处理这些用于LLM训练的数据集需要大规模的努力,大多数公司为了保持竞争优势,会将它们内部使用。这使The Pile和一些来自AllenAI的数据集对于公共大规模NLP研究非常有价值。
另一个值得一提的是,在数据集收集过程中,一般数据可以由非专家收集,但特定领域的数据通常需要由主题专家(SMEs)收集或咨询,例如医生、物理学家、律师等。SMEs可以标记NLP工程师可能会遗漏的主题或概念空白。由于NLP工程师了解LLM如何“学习表示数据”,他们也应该在这个阶段深度参与,以标记任何数据异常或SMEs可能遗漏的数据空白。
一旦你确定了将要使用的数据集,接下来你要为模型准备这些数据。让我们开始吧:
数据集预处理
在本节中,我们将讨论数据调整(如去重和清理)以及各种分词策略的优缺点。让我们从前者开始:
数据集处理
为了确保训练数据的高质量和多样性,可以在预训练步骤之前使用几种预处理技术:
数据采样:
某些数据组件可以对其进行上采样,以获得更平衡的数据分布。一些研究会对质量较低的数据集(例如未过滤的网络爬取数据)进行下采样。其他研究则根据模型目标,对特定领域的数据进行上采样。
还有一些高级方法可以用来过滤高质量数据,例如使用训练过的分类器模型应用于数据集。例如,Meta AI 的 Galactica 模型专门为科学构建,特别是用于存储、结合和推理科学知识。
由于其目标,预训练数据集主要由高质量的数据组成,主要来自科学资源,如论文、教科书、讲义、百科全书。数据集也经过高度策划,例如,通过特定任务的数据集来促进将这些知识组合到新的任务情境中。
数据清理
通常,在训练之前会进行数据清理和重新格式化。示例包括删除样板文本,删除HTML代码或标记。此外,对于某些项目,还会修正拼写错误、处理跨域同形异义词和/或删除偏见/有害言论,以提高模型性能。对于其他项目,这些技术不被使用,因为认为模型应该看到现实世界的公平代表,并学会处理拼写错误和有害内容,作为模型能力的一部分。
非标准文本组件处理
在某些情况下,将非标准文本组件转换为文本是很重要的,例如将表情符号转换为它们的文本等效形式:❄️成为“雪花”。当然,这种转换可以通过编程实现。
数据去重
一些研究人员发现从训练数据中去重有显著的好处。模糊去重方法如局部敏感哈希(LSH)在这里常被使用。参见“Deduplicating Training Data Makes Language Models Better”论文以了解有关去重的详细信息。
下游任务数据删除
当你用来训练的数据恰好含有你试图预测的信息时,就会发生数据泄漏。下游任务数据删除方法(如n-grams)需要移除在评估数据集中也存在的训练数据。
Token化
Tokenization 是将一段文本编码为 transformer 可读的 token ID 整数的过程。大多数最先进的大型语言模型(LLM)使用基于子词的 tokenizer,比如字节对编码(BPE),而不是基于单词的方法。我们将在下面介绍各种技术的优缺点,特别关注子词策略,因为它们目前比其他方法更受欢迎。
Token化方法 | 基于单词的Token化 | 基于字符的Token化 | 基于子词的Token化 |
---|---|---|---|
示例分词器 | 空格分词(通过空格拆分句子);基于规则的分词(例如 Moses, spaCy) | 字符分词(简单地对每个字符进行分词) | 字节对编码(BPE);WordPiece;SentencePiece;Unigram(通过单词的一部分进行分词 vs. 整个单词进行分词) |
考虑事项 | 1. 缺点:生成非常大的词汇量,导致输入和输出层的嵌入矩阵非常大;大量的词汇外(OOV)标记;非常相似的词具有不同的意义; 2.Transformer模型通常词汇量少于50,000个词,特别是在只训练单一语言时 |
1. 导致词汇量非常小;没有OOV(词汇外)标记,因为每个词可以由单个字符组装; 2. 缺点:生成非常长的序列和不太有意义的单个标记,使得模型更难学习有意义的输入表示。但是,如果在非英语语言上使用基于字符的标记化,一个单字符可能信息量非常大(例如中文的“山”)。 |
1. 基于子词的标记化方法遵循的原则是,频繁使用的词不应被拆分为更小的子词,而罕见的词应该被分解为有意义的子词; 2. 优点:解决了基于词的标记化和基于字符的标记化所面临的缺点,并且在合理的词汇量大小和有意义的学习到的上下文无关表示之间取得平衡 |
换句话说,分词技术的选择取决于具体任务和所分析的语言。
- 基于词的分词简单且高效,但在处理复杂语言时可能受限。
- 基于字符的分词对于没有明显词界限的语言可能有用。
- 基于子词的分词,包括BPE、wordpiece分词、sentencepiece分词和unigram分词,特别适用于处理复杂形态词和生僻词。
让我们更详细地看看这些基于子词的方法:
基于子词的分词方法 | 字节对编码(BPE) | WordPiece | Unigram | SentencePiece |
---|---|---|---|---|
描述 | 最流行的子词标记化算法之一。字节对编码(BPE)的工作原理是从字符开始,合并那些最常一起出现的字符,从而创建新的标记。然后它迭代地工作,从语料库中看到的最频繁的对中构建新的标记。BPE可以通过使用多个子词标记构建从未见过的单词,因此需要更小的词汇表,有更少的可能性出现“unk”(未知)标记 | 与BPE非常相似。不同之处在于WordPiece不是选择最高频率的符号对,而是选择一旦添加到词汇表中就最大化训练数据的可能性的符号对(评估合并两个符号是否值得) | 与BPE / WordPiece不同,Unigram将其基础词汇表初始化为大量符号,然后逐步修剪每个符号以获得更小的词汇表。它通常与SentencePiece一起使用 | 左边的3个标记器假设输入文本使用空格分隔单词,因此通常不适用于不使用空格分隔单词的语言(例如中文)。SentencePiece将输入视为原始输入流,因此将空格包括在要使用的字符集中。然后它使用BPE / Unigram算法来构建适当的词汇表 |
注意事项 | BPE 在处理罕见和不在词汇表中的单词时特别有用,因为它可以基于最常见的字符序列生成新单词的子词。 缺点:BPE 可能会生成不对应于语言学上有意义单位的子词 |
WordPiece 对于词义依赖于其出现上下文的语言特别有用 | Unigram 分词法对具有复杂形态结构的语言特别有用,并且可以生成对应于语言学上有意义单位的子词。然而,unigram 分词法在处理罕见和不在词汇表中的单词时可能会遇到困难 | SentencePiece 对于词义依赖于其出现上下文的语言特别有用 |
Transformer 模型及其使用的分词方法 | GPT-2, GPT-3, Roberta | BERT, DistilBERT, Electra | 这些模型并未直接使用 Unigram 方法,而是将其与 SentencePiece 工具结合使用 | ALBERT, XLNet, Marian, T5 |
注意:最近有一项研究提出了一种无标记模型(ByT5),该模型从原始字节中学习。其优点是这些模型可以直接处理任何语言的文本,且在处理包含大量OOV(超出词汇表)词汇/标记的语料库时效果更佳,并且对噪声更具鲁棒性,同时通过移除复杂且容易出错的文本预处理管道来减少技术债务。缺点是与基于标记的模型相比,这些模型通常准确性较低。需要在这一领域进行更多的研究,以确定这种方法的前景。
在标记化之后,我们通常希望考虑一些额外的步骤,即填充和截断。填充是一种通过添加特殊填充标记以确保张量呈矩形的策略,用于使较短的句子统一成相同的张量形状。相反,截断则是缩短那些长度过长而模型无法处理的序列。
注意:基于子词分词器的LLM存在一种与分词器技术直接相关的固有限制。由于基于子词的分词器的标记粒度介于词和字符之间,LLMs无法像人类一样看到字母和单词。相反,它看到的是“标记”,即字符块。由于这种固有的限制,一个例子是它们在合并字符时会有困难。
预训练步骤
训练一个拥有数十亿参数的大型语言模型通常是一个高度实验性的过程,伴随大量的试验和错误。通常,团队会从一个小得多的模型尺寸开始,确保其有前景,然后逐步扩大到越来越多的参数。请记住,随着规模的扩大,会出现一些在较小数据规模训练时不会存在的问题。
让我们来看看一些常见的预训练步骤,从架构开始。
模型架构
为了减少训练不稳定的风险,实践者经常从一个流行的前任模型的架构和超参数开始,如GPT-2和GPT-3,并在途中进行信息化调整,以提高训练效率,扩大模型的规模(包括深度和宽度),并提高性能。两个例子:
GPT-NeoX-20B (20B, EleutherAI) 最初采用了GPT-3的架构并做出了这些更改:
- 旋转嵌入用于嵌入向量维度的前25%,而不是学习的定位嵌入,以平衡性能和计算效率。
- 并行注意力与前馈层结合,而不是串行运行它们,主要是为了计算效率。
- 虽然GPT-3使用交替的稠密和稀疏层,GPT-NeoX完全使用稠密层以减少实现复杂性。
OPT-175B (175B, Meta AI) 也基于GPT-3并进行了调整:
- 批量大小以提高计算效率。
- 学习率计划。具体来说,它遵循线性学习率(LR)计划,在OPT-175B的前2000步内或者在较小基线的375M tokens中从0逐渐上升到最大学习率,然后在300B tokens中衰减至最大LR的10%。还需要进行一些中途的学习率调整。
- 令牌数量。尽管OPT-175B与GPT-3(175B)模型大小相同,但它的训练数据集要小得多,仅为180B令牌(相比之下GPT-3为300B令牌)
实验和超参数搜索
正如我们上面提到的,典型的预训练涉及大量实验以找到优化模型性能的最佳设置。实验可以涉及以下任何或所有内容:权重初始化、位置嵌入、优化器、激活函数、学习率、权重衰减、损失函数、序列长度、层数、注意力头数、参数数量、稠密 vs. 稀疏层、批量大小和丢弃率。这些超参数组合的手动反复试验和自动超参数优化(HPO)通常用于找到达到最佳性能的配置集。通常自动搜索的超参数包括:学习率、批量大小、丢弃率等。
超参数搜索是一个昂贵的过程,对于数十亿参数的模型来说,通常全规模执行其成本过高。因此,通常选择较小规模上的混合实验,并基于之前发布的工作插值参数,而不是从头开始。此外,在训练期间的某些时期,有些超参数需要调整以平衡学习效率和训练收敛性。一些例子包括:
- 学习率:在早期阶段可以线性增加,然后在后期逐渐衰减。
- 批量大小:开始时使用较小的批量大小,然后逐渐增加到较大的批量大小。在预训练过程中,你会希望尽早完成很多这些工作。这主要是因为你将处理较少的数据,使你能够在早期进行更多实验,相比之下,后期进行这些实验成本将高得多。在继续之前,值得明确一个现实:你可能会在训练LLMs时遇到问题。毕竟,这些是大型项目,像任何足够大和复杂的事情一样,事情可能会出错。
硬件故障
在训练过程中,计算集群中可能会发生大量的硬件故障,这将需要手动或自动重启。在手动重启中,训练运行会暂停,并进行一系列诊断测试以检测有问题的节点。被标记的节点应在恢复从最后保存的检查点继续训练。
训练不稳定性
训练稳定性也是一个基本挑战。在训练模型时,你可能会注意到诸如学习率和权重初始化等超参数会直接影响模型的稳定性。例如,当损失发散时,降低学习率并从较早的检查点重新开始可能会允许任务恢复并继续训练。
此外,模型越大,越难避免训练期间的损失峰值。这些峰值可能会在非常不规则的间隔发生,有时会在训练的后期。对于缓解峰值的原则策略,尚没有很多系统的分析。以下是我们从行业中看到的一些有效使模型收敛的最佳实践:
- 批处理大小:一般来说,使用你的GPU允许的最大批处理大小是这里的最佳策略。
- 批量归一化:在小批量内归一化激活可以加速收敛并提高模型性能。
- 学习率调度:高学习率可能导致损失波动或发散,导致损失峰值。通过调度学习率随时间减少,你可以逐渐减少对模型参数的更新幅度,并提高稳定性。常见的调度方式包括阶梯衰减,即在固定步数后学习率减少固定量,以及指数衰减,即每步学习率按固定因子减少。注意,提前知道使用哪个学习率是不太可能的,但你可以使用不同的学习率调度来观察模型的响应。查看更多细节请点击这里。
- 权重初始化:正确初始化权重可以帮助模型更快收敛并提高性能。例如,通常使用小的高斯噪声,或,在Transformer的情况下, 使用T-Fixup初始化。权重初始化可以使用的技术包括随机初始化、逐层初始化和使用预训练权重的初始化。
- 模型训练的起点: 使用一个在相关任务上预训练的模型作为起点可以帮助模型更快收敛并提高性能。
- 正则化: 正则化技术, 如dropout、权重衰减和L1/L2正则化, 可以通过减少过拟合和提高泛化能力来帮助模型更好地收敛。
- 数据增强: 通过应用转换增强训练数据可以帮助模型更好地泛化并减少过拟合。
- 训练期间的热切换: 在LLM训练期间有时会使用优化器或激活函数的热切换来解决过程中出现的问题。这有时需要一个团队几乎24/7地尝试各种启发式方法进行进一步训练。
- 遇到不稳定问题时其他简单的缓解策略: 从以前的检查点重新开始训练;跳过在峰值期间看到的一些数据批次(直觉是峰值的出现是由于特定数据批次与特定模型参数状态的组合)。
注意: 上述大多数模型收敛的最佳实践不仅适用于Transformer训练, 还适用于更广泛的跨架构和用例的深度学习背景。
最后, 在完成LLM训练后, 确保模型训练环境保存并保持在最终状态是非常重要的。这样, 如果将来需要重新做什么或复制某些东西, 你可以因为拥有保留的训练状态而实现。
一个团队还可以尝试一些消融研究。这可以让你看到去除模型的某些部分如何影响性能。消融研究可以让你在大幅减少模型尺寸的同时,仍保留大部分模型的预测能力。
模型评估
通常,预训练模型会在各种语言模型数据集上进行评估,以测量它们在逻辑推理、翻译、自然语言推理、问答等方面的表现。
机器学习从业者围绕各种标准评估基准进行了整合。几个流行的例子包括:
- 开放域问答任务:TriviaQA, Natural Questions, Web Questions
- 完形填空和补全任务:LAMBADA, HellaSwag, StoryCloze
- Winograd风格任务:Winograd, WinoGrande
- 常识推理:PIQA, ARC, OpenBookQA
- 上下文阅读理解:DROP, CoQA, QuAC, SQuADv2, RACE, SuperGLUE
- 自然语言推理 (NLI): SNLI, QNLI
- 推理任务: 算术推理任务
- 代码任务: HumanEval, MBPP (文本到代码); TransCoder (代码到代码)
- 翻译任务: WMT语言对的翻译 BLEU 分数
- BIG-bench: 一个协作基准,旨在为大规模语言模型生成具有挑战性的任务,包括覆盖200+个任务的多样化文本任务和编程任务。
- LM Evaluation Harness: 一个用于EleutherAI发布的200+个任务中自回归大语言模型的标准化评估库。由于其系统的框架方法和稳健性,已经获得了广泛的认可。
以下是典型语言任务的摘要(蓝色为自然语言理解任务;青色为自然语言生成任务):
Datasets and task clusters in NLP,FINETUNED LANGUAGE MODELS ARE ZERO-SHOT
LEARNERS
另一种评估步骤是n-shot学习。这是一个与任务无关的维度,指的是在要求模型执行某个任务之前,提供给模型的监督样本(示例)的数量。通常通过一种称为提示的技术提供n-shot。你会常常看到n-shot捆绑在以下3个类别中:
- Zero-shot:指在推理时不向模型提供任何监督样本的评估。
- One-shot:与少样本学习相似,但n=1,评估时模型只提供1个有监督样本。
- Few-shot:指评估时模型提供少量的有监督样本(例如,提供5个样本 -> 5次样本学习)。
Few-shot学习的一个例子:
任务:情感分析
Prompt:推文:“我讨厌我的手机电池没电的时候。”
情感:消极
推文:“我的一天过得👍”
情感:积极
推文:“这是文章的链接”
情感:中立
推文:“这个新的音乐视频太棒了”
情感:
答案:______
评估通常涉及既查看上述任务的基准指标,也通过向模型提供提示并查看完成情况进行更多的手动评估以供人为评估。通常,NLP工程师和主题专家(SMEs)都会参与评估过程,并从不同的角度评估模型的性能:
NLP工程师:具有NLP、计算语言学、提示工程等背景的人,可以探测并评估模型的语义和句法缺陷,并提出模型故障类别以便持续改进。一个故障类的例子是”LLM不能处理整数(1, 2, 3 等)或它们的拼写形式:one, two, three。”
主题专家(SMEs):与NLP工程师不同,SMEs被要求探测LLM输出的特定类别,必要时修正错误,并在这样做时”大声思考”。SMEs需要以一步一步的方式解释他们正确答案背后的推理和逻辑与不正确的机器生成答案的区别。
偏见和有害性
大型、通用目的的语言模型在训练网络文本时存在潜在风险。也就是说:人类有偏见,这些偏见渗透进数据中,而从这些数据中学习的模型可能会继承这些偏见。除了延续或加剧社会刻板印象外,你还需要确保你的LLM不会记住并泄露私人信息。
通过模型卡等透明性手段,分析和记录这些潜在的非期望关联和风险是必不可少的。
与性能基准类似,一组由社区开发的偏见和有害性基准可用于评估LLM模型的潜在危害。典型的基准包括:
仇恨言论检测:ETHOS数据集可以帮助衡量LLM模型识别某些英语陈述是否种族主义或性别歧视的能力
社会偏见检测:CrowSPairs是一个基准,旨在衡量9个类别中的句内偏见:性别、宗教、种族/肤色、性取向、年龄、国籍、残疾、外貌和社会经济状况;StereoSet基准衡量4个类别中的刻板偏见
有害语言响应:RealToxicityPrompts数据集帮助评估模型是否以及如何使用有害语言。
对话安全性评估:SaferDialogues基准衡量模型响应的安全性,分为4个级别:安全、现实、不安全和对抗性。
迄今为止,对现有预训练模型的分析大多表明,互联网训练的模型具有互联网规模的偏见。此外,即使在提供相对无害的提示时,预训练模型也通常具有较高的生成有害语言的倾向,找到对抗性提示也很容易。
偏见和毒性缓解
那么我们如何解决这个问题呢?这里有几种方法可以在预训练过程中及之后减轻偏见:
训练集过滤:在这里,你需要分析训练数据集中显示出偏见的元素,并将它们从训练数据中移除。
训练集修改:这种技术不需要过滤训练数据,而是修改它以减少偏见。这可能涉及更改某些性别词汇(例如,将policeman改成policewoman或police officer)来帮助缓解偏见。
此外,你也可以在预训练之后减轻偏见:
提示工程:对每个查询的模型输入进行修改,以引导模型远离偏见(稍后会详细讨论)。
微调:对一个训练好的模型进行重新训练,使其消除偏见倾向。
输出引导:在推理过程中添加一个过滤步骤,以重新权衡输出值,并引导输出远离偏见的回应。
指令调优
在这一点上,让我们假设我们有一个预训练的、通用的LLM。如果我们做得好,我们的模型已经可以在不进行微调的情况下用于少样本学习和零样本学习的特定领域任务。也就是说,零样本学习在许多任务中通常比其少样本对手差得多,例如阅读理解、问答和自然语言推理。一个潜在的原因是,没有少样本示例,模型在面对与预训练数据格式不同的提示时更难表现出色。
为了解决这个问题,我们可以使用指令微调。指令微调是一种最先进的微调技术,它将预训练的LLM微调在以指令形式表达的一系列任务上。
它使预训练的大型语言模型能够更好地响应指令,并减少在提示阶段对少量示例的需求(即显著提高零样本性能)。
指令调整在2022年获得了巨大的普及,因为该技术在不影响模型泛化能力的情况下大大提高了模型性能。通常,一个预训练的大型语言模型会在一组语言任务上进行调整,并在这段时间未见过的另一组语言任务上进行评估,以证明其泛化能力和零样本能力。参见下图:
关于指令调优,需要记住几点:
- 指令调优调整整个模型参数,而不是在参数高效微调中冻结一部分参数。这意味着它不会带来参数高效微调所伴随的成本效益。然而,鉴于指令调优相比参数高效微调能够生成更具泛化能力的模型,指令调优的模型仍然可以作为一般用途的模型。
指令调优既可以有示例(即零次和少次)也可以没有示例,并且可以有或没有链式思考,从而在一系列评估场景中实现泛化。目的是为多个下游任务提供模型服务。这通常取决于你是否有可用的指令数据集和训练预算来进行指令调优。 - 指令调优在自然语言指令任务(例如,NLI、QA、翻译)上普遍有效,但在像推理这样的任务上就有些困难了。为了改进这些任务,你需要在调优过程中包含链式思考示例。
Instruction tuning both with and without exemplars (i.e., zero-shot and few-shot) and with and without chain-of-thought, enabling generalization across a range of evaluation scenarios from Scaling Instruction-Finetuned Language Models
通过人类反馈的强化学习 (RLHF)
RLHF是指令调优的扩展,在指令调优步骤之后增加了更多步骤,以进一步结合人类反馈。
如上所述,预训练的大型语言模型(LLM)通常会表现出意料之外的行为,例如编造事实、生成有偏见或有毒的回复,或者仅仅是不遵循用户指令。这是因为许多最近的大型语言模型的目标——即预测互联网页面上的下一个token——与“安全地遵循用户指令”的目标有很大的不同。
RLHF的行为如其名所示。在这里,我们结合了人类对给定提示下模型输出的反馈。这些关于输出质量的意见被用作额外的数据点,以改进模型的整体性能。
OpenAI在这方面最近取得了一些成功,他们的InstructGPT本质上是一个通过RLHF微调的预训练模型GPT-3。事实上,他们最近的ChatGPT模型也在更高级的GPT模型系列(称为GPT-3.5)上利用了RLHF。
更具体地说,RLHF 通常是这样工作的:
- 第1步:指令微调——只需收集一组标签员展示的所需模型行为的数据集,并使用它们通过监督学习对预训练的LLM进行微调。
- 第2步:收集模型输出之间的比较数据集,其中标签员指明他们在给定输入下更喜欢哪个输出。然后,训练一个奖励模型来预测人类偏好的输出。
- 第3步:采用训练好的奖励模型,并使用强化学习针对奖励模型优化一个策略。
第2步和第3步可以不断迭代。对当前最佳策略收集更多的比较数据,这些数据用来训练一个新的奖励模型,然后训练一个新的策略。请参阅下面的 RLHF 过程演示。
A diagram illustrating the three steps of our method: (1) supervised fine-tuning (SFT), (2)
reward model (RM) training, and (3) reinforcement learning via proximal policy optimization (PPO) on this reward model, Training language models to follow instructions with human feedback
截至目前,RLHF在InstructGPT和ChatGPT上的表现非常出色,提升了真实性并减少了有害输出的生成,同时与预训练的GPT相比,性能回归最小。需要注意的是,RLHF过程的确会导致某些下游任务的模型性能略微下降——这被称为对齐成本。Scale AI、Labelbox等公司正在投入其中,Surge 和 Label Studio 提供RLHF作为一项服务,因此如果你有兴趣走这条路,你不必自己处理这件事。但研究表明,使用RLHF技术可以减少对齐成本以增加其采用率,所以绝对值得考虑。
结论
无论是OpenAI、Cohere,还是像EleutherAI这样的开源项目,前沿的大型语言模型都建立在Weight & Biases上。我们的平台使团队能够协作完成训练和推向生产所需的复杂且昂贵的工作,记录关键指标,版本化数据集,促进知识共享,优化超参数等。LLM训练复杂且微妙,贯穿模型生命周期的共享真相源对于避免常见陷阱和每一步理解性能至关重要。
我们还想衷心感谢OpenAI、Deepmind、Meta和Google Brain。我们在本白皮书中经常参考他们的研究和突破,他们对这个领域的贡献已经是无价的。如果您有兴趣了解更多关于W&B如何提供帮助的信息,请联系我们,我们将安排一些时间。如果您有任何反馈,我们也很愿意听取。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/ai/315412.html