摘要
自从图灵测试在20世纪50年代提出以来,人类一直在探索机器掌握语言智能的方法。语言本质上是一个由语法规则控制的复杂、精细的人类表达系统。开发能够理解和掌握语言的能力强大的人工智能(AI)算法是一个重大挑战。作为一种主要方法,语言建模在过去二十年中已经被广泛研究,从统计语言模型发展到神经语言模型。最近,通过在大规模语料库上预训练Transformer模型,提出了预训练语言模型(PLMs),在解决各种自然语言处理(NLP)任务方面表现出强大的能力。由于研究人员发现模型扩展可以提高模型容量,他们进一步通过将参数规模增加到更大的尺寸来研究扩展效果。有趣的是,当参数规模超过一定水平时,这些扩大的语言模型不仅可以实现显著的性能提升,而且还表现出一些特殊的能力(例如上下文学习),这些能力在小规模语言模型(例如BERT)中不存在。为了区分不同参数规模的语言模型,研究界为具有显著规模(例如包含数十亿或数百亿个参数)的PLMs创造了大型语言模型(LLM)这个术语。最近,学术界和工业界对LLMs的研究取得了很大进展,其中一个显著的进展是ChatGPT的推出(一种基于LLMs开发的强大AI聊天机器人),引起了社会的广泛关注。LLMs的技术进化对整个AI社区产生了重要影响,这将革命性地改变我们开发和使用AI算法的方式。考虑到这种快速的技术进步,在本次调查中,我们通过介绍背景、关键发现和主流技术,回顾了LLMs的最新进展。特别是,我们关注LLMs的四个主要方面,即预训练、适应调整、利用和容量评估。此外,我们还总结了开发LLMs的可用资源,并讨论了未来方向的剩余问题。本次调查提供了LLMs文献的最新综述,可供研究人员和工程师使用。
索引词 - 大型语言模型;新兴能力;适应调整;使用场景;对齐;能力评估
对齐含义:在自然语言处理中,对齐(Alignment)通常指将源语言和目标语言之间的单词或短语进行匹配,以便进行翻译或其他语言处理任务。对齐可以是单向的,也可以是双向的。在双向对齐中,源语言和目标语言之间的单词或短语是相互匹配的,这有助于提高翻译的准确性和流畅性。
原论文地址:https://arxiv.org/abs/2303.18223
前言
语言是人类表达和交流的重要能力,从儿童早期开始发展,并在一生中不断演变 [1, 2]。然而,机器无法自然地掌握理解和以人类语言形式进行交流的能力,除非配备强大的人工智能(AI)算法。实现这一目标,使机器能够像人类一样阅读、写作和交流,一直是一个长期的研究挑战 [3]。
从技术上讲,语言建模(LM)是推进机器语言智能的主要方法之一。通常,LM旨在对单词序列的生成可能性进行建模,以便预测未来(或缺失)标记的概率。LM的研究在文献中受到广泛关注,可以分为四个主要的发展阶段:
- 统计语言模型(SLM)。SLM [4-7] 是基于20世纪90年代兴起的统计学习方法开发的。其基本思想是基于马尔可夫假设构建单词预测模型,例如,根据最近的上下文预测下一个单词。具有固定上下文长度n的SLM也称为n-gram语言模型,例如,二元和三元语言模型。SLM已广泛应用于提高信息检索(IR)[8, 9]和自然语言处理(NLP)[10-12]的任务性能。然而,它们经常受到维度灾难的困扰:由于需要估计指数数量的转移概率,因此难以准确估计高阶语言模型。因此,引入了特别设计的平滑策略,例如后退估计[13]和Good-Turing估计[14],以缓解数据稀疏性问题。
- 神经语言模型(NLM)。NLM [15-17] 通过神经网络(例如,循环神经网络(RNN))对单词序列的概率进行建模。在 [15] 中,作为一个显著的贡献,引入了单词分布式表示的概念,并构建了基于聚合上下文特征(即分布式单词向量)的单词预测函数。通过扩展学习单词或句子有效特征的思想,开发了一种通用的神经网络方法,用于构建各种NLP任务的统一解决方案[18]。此外,word2vec [19, 20] 提出了构建简化的浅层神经网络,用于学习分布式单词表示,这些表示在各种NLP任务中被证明非常有效。这些研究开创了使用语言模型进行表示学习(超越单词序列建模)的先河,对NLP领域产生了重要影响。
- 预训练语言模型(PLM)。作为早期的尝试,ELMo [21] 提出了通过首先预训练双向LSTM(biLSTM)网络(而不是学习固定的单词表示),然后根据特定的下游任务微调biLSTM网络,以捕获上下文感知的单词表示。此外,基于高度可并行化的Transformer架构[22]和自注意机制,BERT [23] 提出了通过在大规模未标记的语料库上使用特别设计的预训练任务预训练双向语言模型。这些预训练的上下文感知的单词表示非常有效,作为通用的语义特征,大大提高了NLP任务的性能。这项研究启发了大量的后续工作,建立了“预训练和微调”学习范式。在这个范式下,开发了大量关于PLM的研究,引入了不同的架构[24, 25](例如,GPT-2 [26]和BART [24])或改进的预训练策略[27-29]。在这个范式下,通常需要微调PLM以适应不同的下游任务。
- 大型语言模型(LLM)。研究人员发现,扩展PLM(例如,扩展模型大小或数据大小)通常会导致在下游任务上改进模型容量(即遵循缩放定律[30])。许多研究已经通过训练越来越大的PLM(例如,175B参数的GPT-3和540B参数的PaLM)来探索性能极限。尽管缩放主要是在模型大小方面进行的(具有类似的架构和预训练任务),但这些大型PLM显示出与较小的PLM(例如,330M参数的BERT和1.5B参数的GPT-2)不同的行为,并在解决一系列复杂任务时显示出惊人的能力(称为 emergent abilities [31])。例如,GPT-3可以通过上下文学习解决少样本任务,而GPT-2则做不好。因此,研究界为这些大型PLM [32-35] 创造了“大型语言模型(LLM)”1这个术语。LLM的一个显著应用是ChatGPT2,它将来自GPT系列的LLM用于对话,展现出与人类惊人的对话能力。
在现有文献中,PLM已经得到广泛讨论和调查[36-39],而LLM很少以系统的方式进行审查。为了激发我们的调查,我们首先强调LLM和PLM之间的三个主要区别。首先,LLM显示出一些令人惊讶的 emergent abilities,这些能力在以前较小的PLM中可能没有被观察到。这些能力对于语言模型在复杂任务上的表现至关重要,使得AI算法变得前所未有的强大和有效。其次,LLM将彻底改变人类开发和使用AI算法的方式。与小型PLM不同,访问LLM的主要方法是通过提示接口(例如,GPT-4 API)。人类必须理解LLM的工作原理,并以LLM可以遵循的方式格式化他们的任务。第三,LLM的开发不再区分研究和工程。LLM的训练需要大规模数据处理和分布式并行训练的广泛实践经验。为了开发有能力的LLM,研究人员必须解决复杂的工程问题,与工程师合作或成为工程师。
如今,LLM对AI社区产生了重大影响,ChatGPT和GPT-4的出现引发了对人工通用智能(AGI)可能性的重新思考。OpenAI发表了一篇名为“规划AGI及其以上”的技术文章,讨论了接近AGI的短期和长期计划[40],最近的一篇论文则认为GPT-4可能被视为AGI系统的早期版本[41]。LLM的快速进展正在彻底改变AI的研究领域。在NLP领域,LLM可以作为通用的语言任务求解器(在某种程度上),研究范式已经转向使用LLM。在IR领域,传统的搜索引擎受到通过AI聊天机器人(即ChatGPT)进行新型信息寻求方式的挑战,New Bing3提出了一种基于LLM增强搜索结果的初步尝试。在CV领域,研究人员试图开发类似于ChatGPT的视觉语言模型,以更好地服务于多模态对话[42-45],而GPT-4 [46]通过整合视觉信息支持多模态输入。这股新技术浪潮有可能引领基于LLM的实际应用的繁荣生态系统。例如,Microsoft 365正在通过LLM(即Copilot)赋能办公自动化,OpenAI支持在ChatGPT中使用插件来实现特殊功能。
尽管LLM取得了进展和影响,但LLM的基本原理仍未得到很好的探索。首先,令人困惑的是,为什么 emergent abilities 出现在LLM中,而不是较小的PLM中。作为一个更一般的问题,缺乏对促进LLM卓越能力的关键因素进行深入详细的研究。研究LLM何时以及如何获得这些能力是很重要的[47]。虽然对这个问题有一些有意义的讨论[31, 47],但需要更有原则性的调查来揭示LLM的“秘密”。其次,对于研究界来说,训练有能力的LLM是困难的。由于计算资源的巨大需求,进行重复的、消融的研究以调查各种训练LLM策略的效果非常昂贵。事实上,LLM主要是由工业界进行培训,许多重要的培训细节(例如数据收集和清理)并未向公众公开。第三,将LLM与人类价值观或偏好对齐是具有挑战性的。尽管具有能力,LLM也可能产生有毒、虚构或有害的内容。需要有效和高效的控制方法来消除使用LLM的潜在风险[46]。
面对机遇和挑战,需要更多关注LLM的研究和开发。为了提供对LLM的基本理解,本调查从四个主要方面,包括预训练(如何预训练有能力的LLM)、适应调整(如何从有效性和安全性两个方面有效地调整预训练的LLM)、利用(如何使用LLM解决各种下游任务)和能力评估(如何评估LLM的能力和现有的经验发现),对LLM的最新进展进行了文献综述。我们彻底梳理了文献,并总结了LLM的关键发现、技术和方法。为此,我们还创建了一个GitHub项目网站,收集了LLM的支持资源,链接为https://github.com/RUCAIBox/LLMSurvey。我们也注意到了几篇关于PLM或LLM的相关综述文章[32, 36, 38, 39, 43, 48-54]。这些论文要么讨论PLM,要么讨论LLM的某些特定(或一般)方面。与它们相比,我们关注开发和使用LLM的技术和方法,并提供相对全面的LLM重要方面的参考。
本调查的其余部分组织如下:第2节介绍LLM的背景,包括术语、设置、资源和组织大纲,接着在第3节总结了开发LLM的可用资源。第4、5、6和7节分别从预训练、适应调整、利用和能力评估四个方面回顾和总结了最近的进展。最后,在第8节中,我们总结了主要发现,并讨论了未来工作的剩余问题。
概述
在本节中,我们介绍LLM的背景,并总结GPT系列模型的技术演进。
大模型的背景
通常,大型语言模型(LLM)是指包含数百亿(或更多)参数的Transformer语言模型,这些模型是在大规模文本数据[32]上进行训练的,例如GPT-3 [55]、PaLM [56]、Galactica [35]和LLaMA [57]。LLM表现出强大的理解自然语言和解决复杂任务(通过文本生成)的能力。为了快速了解LLM的工作原理,本部分介绍LLM的基本背景,包括缩放定律、 emergent abilities 和关键技术。
LLM的缩放定律。目前,LLM主要建立在Transformer架构[22]之上,其中多头注意力层被堆叠在非常深的神经网络中。现有的LLM采用类似的Transformer架构和预训练目标(例如语言建模)作为小型语言模型。然而,LLM在模型大小、数据大小和总计算量方面大幅度缩放(数量级)。广泛的研究表明,缩放可以大大提高LLM的模型容量[26, 55, 56]。因此,建立一个定量的方法来表征缩放效应是有用的。接下来,我们介绍两个代表性的Transformer语言模型缩放定律[30, 34]。
KM缩放定律。2020年,Kaplan等人[30](OpenAI团队)首次提出了神经语言模型的模型性能与三个主要因素(即模型大小(N)、数据集大小(D)和训练计算量(C))之间的幂律关系。给定一个计算预算c,他们凭经验提出了三个基本公式来描述缩放定律:
其中L(·)表示以nats为单位的交叉熵损失。这三个定律是通过拟合具有不同数据大小(22M到23B个标记)、模型大小(768M到1.5B个非嵌入参数)和训练计算量的模型性能得出的,在一些假设下(例如,一个因素的分析不应受到其他两个因素的瓶颈限制)。他们表明,模型性能与这三个因素有强烈的依赖关系。
Chinchilla缩放定律。作为另一个代表性研究,Hoffmann等人[34](Google DeepMind团队)提出了一种替代形式的缩放定律,以指导LLM的计算最优训练。他们通过变化更大范围的模型大小(70M到16B)和数据大小(5B到500B个标记)进行了严格的实验,并拟合了一个类似的缩放定律,但具有不同的系数,如下所示[34]:
其中E = 1.69,A = 406.4,B = 410.7,α = 0.34和β = 0.28。通过在约束条件C ≈ 6ND下优化损失L(N,D),他们表明可以得出将计算预算最优分配给模型大小和数据大小的方法,如下所示:
其中a = α,b = β,而G是一个缩放系数,可以通过A、B、α和β计算得出。根据[34]的分析,随着计算预算的增加,KM缩放定律更倾向于在模型大小上分配更大的预算,而不是数据大小,而Chinchilla缩放定律则认为这两个大小应该以相等的比例增加,即在方程(3)中a和b的值应该相似。
尽管有一些限制性假设,这些缩放定律提供了对缩放效应的直观理解,使得在训练期间预测LLM的性能成为可能[46]。然而,一些能力(例如上下文学习[55])根据缩放定律是不可预测的,只有当模型大小超过一定水平时才能观察到(如下所讨论的)。
LLM的新兴能力
在文献[31]中,LLM的新兴能力被正式定义为“在小型模型中不存在但在大型模型中出现的能力”,这是区分LLM与以前的PLM最显著的特征之一。当新兴能力出现时,它还引入了一个显着的特征[31]:当规模达到一定水平时,性能显著高于随机水平。类比地,这种新兴模式与物理学中的相变现象有密切联系[31, 58]。原则上,新兴能力可以与一些复杂任务相关联[31, 59],而我们更关注可以应用于解决各种任务的通用能力。在这里,我们简要介绍LLM的三种典型的新兴能力和具有这种能力的代表性模型。
- 上下文学习。上下文学习(ICL)能力是由GPT-3 [55]正式引入的:假设语言模型已经提供了自然语言指令和/或几个任务演示,它可以通过完成输入文本的单词序列来为测试实例生成预期的输出,而不需要额外的训练或梯度更新8。在GPT系列模型中,175B GPT-3模型通常表现出很强的ICL能力,但GPT-1和GPT-2模型则不具备这种能力。然而,这种能力也取决于具体的下游任务。例如,ICL能力可以在算术任务(例如3位数的加减法)中出现,但13B GPT-3在波斯语QA任务上表现不佳,而175B GPT-3甚至无法很好地完成该任务[31]。
- 指令跟随。通过使用自然语言描述格式化的多任务数据集的混合微调(称为指令微调),LLM表现出在未见过的任务上表现良好,这些任务也以指令的形式描述[28, 61, 62]。通过指令微调,LLM可以在不使用显式示例的情况下遵循新任务的任务指令,从而具有改进的泛化能力。根据[62]中的实验,经过指令微调的LaMDA-PT [63]在模型大小达到68B时开始显著优于未经微调的模型,但对于8B或更小的模型大小则不是这样。最近的一项研究[64]发现,PaLM在四个评估基准(即MMLU、BBH、TyDiQA和MGSM)中表现良好至少需要62B的模型大小,尽管对于某些特定任务(例如MMLU),可能需要更小的模型大小。
- 逐步推理。对于小型语言模型,通常很难解决涉及多个推理步骤的复杂任务,例如数学问题。然而,通过链式思维(CoT)提示策略[33],LLM可以通过利用包含中间推理步骤的提示机制来解决这些任务,从而得出最终答案。这种能力被认为可能是通过对代码进行训练获得的[33, 47]。一项实证研究[33]表明,当应用于模型大小大于60B的PaLM和LaMDA变体时,CoT提示可以带来性能提升(在算术推理基准上),而当模型大小超过100B时,其优势比标准提示更加明显。此外,CoT提示对于不同的任务的性能提升似乎也有所不同,例如对于PaLM,GSM8K > MAWPS > SWAMP [33]。
LLM的关键技术
LLM发展到当前状态:成为具有广泛能力的学习者,经历了漫长的过程。在开发过程中,提出了许多重要的技术,这些技术在很大程度上提高了LLM的能力。在这里,我们简要列出了几项重要的技术,这些技术(可能)导致了LLM的成功,如下所示。
- 缩放。如前面所述,Transformer语言模型存在明显的缩放效应:更大的模型/数据大小和更多的训练计算通常会导致模型容量的提高[30, 34]。作为两个代表性模型,GPT-3和PaLM通过将模型大小分别增加到175B和540B来探索缩放极限。此外,由于计算预算通常是有限的,缩放定律可以用于更有效地分配计算资源。例如,通过在相同的计算预算下增加数据规模,Chinchilla(具有更多的训练标记)优于其对应的模型Gopher(具有更大的模型大小)[34]。然而,应该注意到,数据缩放应该进行仔细的清理过程,因为预训练数据的质量在模型容量中起着关键作用。
- 训练。由于模型大小巨大,成功训练一个具有能力的LLM非常具有挑战性。需要使用分布式训练算法来学习LLM的网络参数,其中通常联合使用各种并行策略。为了支持分布式训练,已经发布了几个优化框架,以便于实现和部署并行算法,例如DeepSpeed [65]和Megatron-LM [66-68]。此外,优化技巧对于训练稳定性和模型性能也很重要,例如重新启动以克服训练损失峰值[56]和混合精度训练[69]。最近,GPT-4 [46]提出开发特殊的基础设施和优化方法,可可靠地预测具有远小于其大小的模型的大型模型的性能。
- 能力引发。在大规模语料库上进行预训练后,LLM被赋予了作为通用任务求解器的潜在能力。然而,当LLM执行某些特定任务时,这些能力可能不会明确展示出来。作为技术方法,设计适当的任务指令或特定的上下文学习策略可以激发这些能力。例如,链式思维提示已被证明对于通过包含中间推理步骤来解决复杂的推理任务是有用的。此外,我们可以进一步使用自然语言表达的任务描述对LLM进行指令微调,以提高LLM在未见过的任务上的泛化能力。然而,这些技术主要对应于LLM的新兴能力,可能对小型语言模型没有相同的效果。
- 对齐微调。由于LLM被训练来捕捉预训练语料库的数据特征(包括高质量和低质量数据),它们可能会为人类生成有毒、有偏见甚至有害的内容。因此,有必要将LLM与人类价值观对齐,例如有益、诚实和无害。为此,InstructGPT [61]设计了一种有效的微调方法,使LLM能够遵循预期的指令,利用强化学习和人类反馈的技术[61, 70]。它将人类纳入训练循环中,并采用精心设计的标注策略。ChatGPT实际上是基于类似于InstructGPT的技术开发的,它在生成高质量、无害的响应方面表现出强大的对齐能力,例如拒绝回答侮辱性问题。
- 工具操作。实质上,LLM是在大规模纯文本语料库上训练的文本生成器,因此在不适合以文本形式表达的任务(例如数值计算)上表现不佳。此外,它们的能力也受到预训练数据的限制,例如无法捕捉最新信息。为了解决这些问题,最近提出的一种技术是利用外部工具来弥补LLM的不足[71, 72]。例如,LLM可以利用计算器进行准确的计算[71],并使用搜索引擎检索未知信息[72]。最近,ChatGPT已经实现了使用外部插件(现有或新创建的应用程序)的机制,这类似于LLM的“眼睛和耳朵”。这种机制可以广泛扩展LLM的能力范围。
此外,许多其他因素(例如硬件升级)也对LLM的成功做出了贡献。然而,我们将讨论限制在开发LLM的主要技术方法和关键发现上。
GBT系列的技术演进
由于在与人类交流方面具有出色的能力,自ChatGPT发布以来,它已经引起了人工智能社区的兴奋。ChatGPT是基于强大的GPT模型开发的,具有特别优化的对话能力。考虑到对ChatGPT和GPT模型日益增长的兴趣,我们添加了一个关于GPT系列模型技术演进的特别讨论,以简要总结它们在过去几年中的发展进展。总体而言,OpenAI在LLM的研究可以大致分为以下几个阶段10。
早期探索
根据Ilya Sutskever11(OpenAI的联合创始人和首席科学家)的一次采访,使用语言模型来处理智能系统的想法在OpenAI的早期就已经被探索过了,当时使用的是循环神经网络(RNN)[104]。随着Transformer的出现,OpenAI开发了两个最初的GPT模型,即GPT-1 [105]和GPT-2 [26],可以认为它们是后来更强大的模型(即GPT-3和GPT-4)的基础。
GPT-1。2017年,Google推出了Transformer模型[22],OpenAI团队迅速将他们的语言建模工作适应到这种新的神经网络架构上。他们在2018年发布了第一个GPT模型,即GPT-1 [105],并将GPT作为模型名称的缩写术语,代表生成式预训练。GPT-1基于生成式、仅解码的Transformer架构开发,并采用了无监督预训练和有监督微调的混合方法。GPT-1为GPT系列模型建立了核心架构,并建立了自然语言文本建模的基本原则,即预测下一个单词。
GPT-2。GPT-2 [26]采用了与GPT-1类似的架构,将参数规模增加到了1.5B,并使用大型网页数据集WebText进行训练。正如GPT-2的论文所声称的那样,它试图通过无监督的语言建模来执行任务,而不使用标记数据进行显式微调。为了激励这种方法,他们引入了一个多任务求解的概率形式,即p(output|input,task)(类似的方法已经在[106]中采用),它预测在给定输入和任务信息的条件下的输出。为了建模这种条件概率,语言文本可以自然地用作格式化输入、输出和任务信息的统一方式。通过这种方式,解决任务的过程可以被视为生成解决方案文本的单词预测问题。此外,他们为这个想法提出了一个更正式的说法:“由于(特定于任务的)监督目标与无监督(语言建模)目标相同,但仅在序列的子集上进行评估,因此无监督目标的全局最小值也是各种任务的监督目标的全局最小值”[26]12。对这个说法的基本理解是,每个(NLP)任务都可以被视为基于世界文本子集的单词预测问题。因此,如果训练具有恢复世界文本的足够能力,无监督语言建模可以解决各种任务。GPT-2论文中的这些早期讨论在Ilya Sutskever接受Jensen Huang采访时得到了回应:“神经网络学习的是产生文本的过程的某种表示。这个文本实际上是世界的投影...你在预测下一个单词时越准确,保真度就越高,你在这个过程中就会获得更高的分辨率...”13。
能力飞跃。尽管GPT-2旨在成为“无监督的多任务学习器”,但与监督微调的最先进方法相比,它的性能总体上较差。虽然它的模型规模相对较小,但在下游任务中被广泛微调,特别是对话任务[107, 108]。基于GPT-2,GPT-3通过扩展(几乎相同的)生成式预训练架构展示了一个关键的容量飞跃。
GPT-3。GPT-3 [55]于2020年发布,将模型参数扩展到了更大的规模,达到了175B。在GPT-3的论文中,它正式引入了上下文学习(ICL)14的概念,它以几个示例或零个示例的方式利用LLM。ICL可以教(或指导)LLM以自然语言文本的形式理解任务。通过ICL,LLM的预训练和利用收敛到相同的语言建模范式:预训练预测基于上下文的下一个文本序列,而ICL预测正确的任务解决方案,这也可以格式化为文本序列,给定任务描述和演示。GPT-3不仅在各种NLP任务中表现出非常出色的性能,而且在许多需要推理或领域适应能力的特别设计任务中也表现出色。虽然GPT-3的论文没有明确讨论LLM的新兴能力,但我们可以观察到大的性能飞跃,可能超越了基本的缩放定律[30],例如,更大的模型具有显着更强的ICL能力(在GPT-3的论文原始图1.2中有说明[55])。总的来说,GPT-3可以被视为从PLM到LLM演变过程中的一个显著里程碑。它经验证明,将神经网络扩展到显著的规模可以导致模型容量的巨大增加。
能力增强。由于其强大的能力,GPT-3已成为OpenAI开发更具能力的LLM的基础模型。总体而言,OpenAI已经探索了两种主要方法来进一步改进GPT-3模型,即在代码数据上进行训练和与人类偏好的对齐,具体如下所述。
在代码数据上进行训练。原始的GPT-3模型(在纯文本上进行预训练)的一个主要限制在于缺乏对复杂任务的推理能力,例如完成代码和解决数学问题。为了增强这种能力,OpenAI在2021年7月推出了Codex [89],这是一个在GitHub代码的大型语料库上微调的GPT模型。它证明了Codex可以解决非常困难的编程问题,并且在解决数学问题方面也带来了显著的性能提升[109]。此外,2022年1月报道了一种对比方法[110],用于训练文本和代码嵌入,该方法被证明可以改善一系列相关任务(即线性探针分类、文本搜索和代码搜索)。实际上,GPT-3.5模型是基于一个基于代码的GPT模型(即code-davinci-002)开发的,这表明在代码数据上进行训练是提高GPT模型容量的一种非常有用的实践,特别是推理能力。此外,还有一种猜测,即在代码数据上进行训练可以极大地增加LLM的思维链提示能力[47],但仍值得进一步研究以进行更彻底的验证。
人类对齐。OpenAI的人类对齐相关研究可以追溯到2017年(或更早):在OpenAI博客上发布了一篇名为“从人类偏好中学习”的博客文章15,描述了一项应用强化学习(RL)来学习人类注释的偏好比较的工作[70](类似于图6中InstructGPT对齐算法中的奖励训练步骤)。在这篇RL论文[70]发布后不久,Proximal Policy Optimization(PPO)[111]的论文于2017年7月发表,现在已成为从人类偏好中学习的基础RL算法[61]。随后在2020年1月,使用上述RL算法[70,111]微调了GPT-2,利用人类偏好来提高GPT-2在NLP任务上的能力。同年,另一项工作[112]以类似的方式训练了一个摘要模型以优化人类偏好。基于这些先前的工作,InstructGPT [61]于2022年1月提出,以改进GPT-3模型的人类对齐,正式建立了一个从人类反馈中进行三阶段强化学习(RLHF)算法。请注意,OpenAI的论文和文档中似乎很少使用“指令调整”这个词,而是用人类演示进行监督微调(即RLHF算法的第一步[61])。除了提高指令跟随能力外,RLHF算法特别有用于缓解LLM生成有害或有毒内容的问题,这对于在实践中安全部署LLM至关重要。OpenAI在一篇技术文章[113]中描述了他们的对齐研究方法,总结了三个有前途的方向:“训练AI系统使用人类反馈,协助人类评估和进行对齐研究”。
这些增强技术导致了具有更强容量的改进GPT-3模型,OpenAI称之为GPT-3.5模型(请参见第3.1节中有关OpenAI API的讨论)。
语言模型的里程碑
基于所有的探索努力,OpenAI已经实现了两个重要的里程碑,即ChatGPT [114]和GPT-4 [46],这两个模型在很大程度上提高了现有AI系统的容量门槛。
- ChatGPT。2022年11月,OpenAI发布了基于GPT模型(GPT-3.5和GPT-4)的对话模型ChatGPT。正如官方博客文章[114]所介绍的那样,ChatGPT的训练方式与InstructGPT类似(在原始帖子中称为“InstructGPT的姊妹模型”),但专门针对对话进行了优化。他们报告了ChatGPT和InstructGPT的训练数据收集设置之间的差异:将人类生成的对话(扮演用户和AI的双重角色)与InstructGPT数据集以对话格式相结合,用于训练ChatGPT。ChatGPT在与人类交流方面表现出卓越的能力:拥有丰富的知识库,在数学问题的推理技能上表现出色,在多轮对话中准确追踪上下文,并与人类价值观良好地对齐,以确保安全使用。随后,ChatGPT支持了插件机制,这进一步扩展了ChatGPT与现有工具或应用程序的能力。到目前为止,它似乎是AI历史上最强大的聊天机器人。ChatGPT的推出对未来的AI研究产生了重大影响,为探索类人AI系统提供了启示。
- GPT-4。另一个显著的进展是,GPT-4 [46]于2023年3月发布,将文本输入扩展到多模态信号。总体而言,GPT-4在解决复杂任务方面比GPT-3.5具有更强的能力,在许多评估任务上显示出了很大的性能提升。最近的一项研究[41]通过使用人类生成的问题进行定性测试,涵盖了各种困难任务,并显示GPT-4可以比之前的GPT模型(如ChatGPT)实现更优越的性能。此外,由于六个月的迭代对齐(在RLHF训练中增加了额外的安全奖励信号),GPT-4对恶意或挑衅性查询的响应更加安全。在技术报告中,OpenAI强调了如何安全地开发GPT-4,并采用了许多干预策略来缓解LLM可能存在的问题,例如幻觉、隐私和过度依赖。例如,他们引入了称为“读取团队”的机制[115],以减少有害或有毒内容的生成。作为另一个重要方面,GPT-4是在一个成熟的深度学习基础设施上开发的,具有改进的优化方法。他们引入了一种称为可预测缩放的新机制,在模型训练期间可以使用少量计算准确预测最终性能。
尽管取得了巨大的进展,这些优秀的LLM仍然存在一些限制,例如在某些特定情境下生成具有事实错误或潜在风险响应的幻觉[46]。LLM的更多限制或问题将在第7节中讨论。开发更具能力、更安全的LLM是一个长期存在的研究挑战。从工程的角度来看,OpenAI采用了迭代部署策略[116],通过遵循五个阶段的开发和部署生命周期来开发模型和产品,旨在有效降低使用模型的潜在风险。接下来,我们将深入探讨技术细节,以便具有具体的了解它们是如何开发的。
近年来大型语言模型(在本次调查中大小大于10B)的统计数据,包括容量评估、预训练数据规模(以标记数或存储大小表示)和硬件资源成本。在此表中,我们仅包括具有有关技术细节的公共论文的LLM。这里,“发布时间”表示相应论文正式发布的日期。“公开可用”表示模型检查点可以公开访问,而“闭源”则表示相反。“适应性”表示模型是否进行了后续微调:IT表示指令微调,RLHF表示强化学习与人类反馈。“评估”表示模型是否在其原始论文中评估了相应的能力:ICL表示上下文学习,CoT表示思维链。 “*”表示最大的公开可用版本。参考:https://github.com/feihengye/LLMSurvey 。
大语言模型的资源
考虑到技术上的挑战和计算资源的巨大需求,开发或复制LLMs绝非易事。一种可行的方法是从现有的LLMs中学习经验,并重复使用公开可用的资源进行增量开发或实验研究。在本节中,我们简要总结了用于开发LLMs的公开可用资源,包括模型检查点(或API)、语料库和库。
公开可用的模型检查点或API
考虑到模型预训练的巨大成本,经过良好训练的模型检查点对于研究社区的LLM研究和开发至关重要。由于参数规模是使用LLMs时需要考虑的关键因素,我们将这些公共模型分为两个规模级别(即数百亿个参数和数千亿个参数),这有助于用户根据其资源预算确定适合的资源。此外,对于推理,我们可以直接使用公共API执行任务,而无需在本地运行模型。接下来,我们介绍公开可用的模型检查点和API。
参数规模在数百亿的模型中,大多数模型的参数规模在10B到20B之间,除了LLaMA [57](最大版本包含65B参数)和NLLB [82](最大版本包含54.5B参数)。这个范围内的其他模型包括mT5 [74]、PanGu-α [75]、T0 [28]、GPT- NeoX-20B [78]、CodeGen [77]、UL2 [80]、Flan-T5 [64]和mT0 [84]。其中,Flan-T5(11B版本)可以作为指令微调研究的首选模型,因为它从三个方面探索了指令微调[64]:增加任务数量、扩大模型规模和使用思维链提示数据进行微调。此外,CodeGen(11B版本)作为一个用于生成代码的自回归语言模型,可以被认为是探索代码生成能力的良好候选模型。它还引入了一个新的基准MTPB [77],专门用于多轮程序合成,由115个专家生成的问题组成。为了解决这些问题,需要LLMs获得足够的编程知识(例如数学、数组操作和算法)。对于多语言任务,mT0(13B版本)可能是一个良好的候选模型,它已经在多语言提示下进行了微调。此外,基于深度学习框架MindSpore [117]开发的PanGu-α [75]在零样本或少样本情况下在中文下游任务中表现良好。需要注意的是,PanGu-α [75]拥有多个版本的模型(最多200B参数),而最大的公共版本只有13B参数。作为最近发布的模型,LLaMA(65B版本)[57]包含的参数数量约为其他模型的五倍,在指令跟随相关任务中表现出了卓越的性能。由于其开放性和有效性,LLaMA引起了研究界的广泛关注,许多努力[118-121]已经致力于微调或持续预训练其不同的模型版本,以实现新模型或工具的实现。通常,这个规模的预训练模型需要数百甚至数千个GPU或TPU。例如,GPT-NeoX-20B使用了12个超微服务器,每个服务器配备8个NVIDIA A100-SXM4-40GB GPU,而LLaMA在其原始出版物中报告使用了2,048个A100-80G GPU。为了准确估计所需的计算资源,建议使用衡量涉及计算数量的指标,如FLOPS(即每秒浮点数操作次数)[30]。
参数规模在数千亿个的模型中,只有少数模型被公开发布。例如,OPT [81]、OPT-IML [85]、BLOOM [69]和BLOOMZ [84]的参数数量几乎与GPT-3(175B版本)相同,而GLM [83]和Galactica [35]的参数数量分别为130B和120B。其中,OPT(175B版本)被特别激励进行开放共享,旨在使研究人员能够在规模上进行可重复的研究。对于跨语言通用性的研究,BLOOM(176B版本)和BLOOMZ(176B版本)可以作为基础模型,因为它们在多语言语言建模任务中表现出了竞争力。在这些模型中,OPT-IML已经进行了指令微调,这可能是研究指令微调效果的良好候选模型。这个规模的模型通常需要数千个GPU或TPU来进行训练。例如,OPT(175B版本)使用了992个A100-80GB GPU,而GLM(130B版本)使用了一个由96个NVIDIA DGX-A100(8x40G)GPU节点组成的集群。
LLMs的公共API。与直接使用模型副本相比,API为普通用户提供了更方便的使用LLMs的方式,无需在本地运行模型。作为使用LLMs的代表性接口,GPT系列模型的API [46、55、61、89]已经被学术界和工业界广泛使用。OpenAI为GPT-3系列模型提供了七个主要接口:ada、babbage、curie、davinci(GPT-3系列中最强大的版本)、text-ada-001、text-babbage-001和text-curie-001。其中,前四个接口可以在OpenAI的主机服务器上进一步微调。特别是,babbage、curie和davinci分别对应于GPT-3(1B)、GPT-3(6.7B)和GPT-3(175B)模型[55]。此外,还有两个与Codex [89]相关的API,称为code-cushman-001(Codex(12B)的强大和多语言版本[89])和code-davinci-002。此外,GPT-3.5系列包括一个基础模型code-davinci-002和三个增强版本,即text-davinci-002、text-davinci-003和gpt-3.5-turbo-0301。值得注意的是,gpt-3.5-turbo-0301是调用ChatGPT的接口。最近,OpenAI还发布了GPT-4的相应API,包括gpt-4、gpt-4-0314、gpt-4-32k和gpt-4-32k-0314。总的来说,API接口的选择取决于具体的应用场景和响应要求。详细的使用方法可以在它们的项目网站上找到。
常用的语料库
与早期的PLMs相比,由大量参数组成的LLMs需要更多涵盖广泛内容的训练数据。为了满足这个需求,越来越多的可用训练数据集已经发布供研究使用。在本节中,我们将简要总结几个用于训练LLMs的广泛使用的语料库。根据它们的内容类型,我们将这些语料库分为六类:书籍、CommonCrawl、Reddit链接、维基百科、代码和其他。
- 书籍。BookCorpus [122]是先前小规模模型(例如GPT [105]和GPT-2 [26])中常用的数据集,包括超过11,000本书,涵盖广泛的主题和流派(例如小说和传记)。另一个大规模的书籍语料库是Project Gutenberg [123],包括超过70,000本文学作品,包括小说、散文、诗歌、戏剧、历史、科学、哲学和其他类型的公共领域作品。它目前是最大的开源书籍集合之一,被用于MT-NLG [97]和LLaMA [57]的训练。至于GPT-3 [55]中使用的Books1 [55]和Books2 [55],它们比BookCorpus大得多,但迄今为止还没有公开发布。
- CommonCrawl。CommonCrawl [132]是最大的开源网络爬虫数据库之一,包含PB级别的数据量,已被广泛用作现有LLMs的训练数据。由于整个数据集非常大,现有的研究主要在特定时间段内从中提取网页子集。然而,由于网络数据中存在大量嘈杂和低质量的信息,因此在使用之前需要进行数据预处理。基于CommonCrawl,现有工作中常用的有四个经过过滤的数据集:C4 [73]、CC-Stories [124]、CC-News [27]和RealNews [125]。巨大的清洁爬行语料库(C4)包括五个变体,即en(806G)、en.noclean(6T)、realnewslike(36G)、web-textlike(17G)和多语言(38T)。en版本已被用于T5 [73]、LaMDA [63]、Gopher [59]和UL2 [80]的预训练。多语言C4,也称为mC4,已在mT5 [74]中使用。CC-Stories(31G)由CommonCrawl数据的子集组成,其中内容以故事方式呈现。然而,CC-Stories的原始来源现在不可用,因此在表2中包含了一个复制版本CC-Stories-R [133]。此外,从CommonCrawl中提取的两个新闻语料库,即REALNEWS(120G)和CC-News(76G),也常用作预训练数据。
- Reddit链接。Reddit是一种社交媒体平台,用户可以提交链接和文本帖子,并通过“赞”或“踩”进行投票。高赞的帖子通常被认为是有用的,可以用来创建高质量的数据集。WebText [26]是一个著名的语料库,由Reddit上高赞的链接组成,但它并没有公开发布。作为替代,有一个易于获取的开源替代品叫做OpenWebText [126]。从Reddit中提取的另一个语料库是PushShift.io [127],这是一个实时更新的数据集,包括自Reddit创建以来的历史数据。Pushshift不仅提供每月的数据转储,还提供有用的实用工具,支持用户在整个数据集上进行搜索、摘要和初步调查。这使得用户可以轻松地收集和处理Reddit数据。
- 维基百科。维基百科 [128]是一个在线百科全书,包含大量关于各种主题的高质量文章。这些文章大多以解释性的写作风格(带有支持性的参考文献)撰写,涵盖广泛的语言和领域。通常,大多数LLMs(例如GPT-3 [55]、LaMDA [63]和LLaMA [57])中广泛使用维基百科的英文过滤版本。维基百科提供多种语言版本,因此可以在多语言环境中使用。
- 代码。为了收集代码数据,现有的工作主要从互联网上爬取开源许可的代码。两个主要的来源是开源许可的公共代码仓库(例如GitHub)和与代码相关的问答平台(例如StackOverflow)。Google已经公开发布了BigQuery数据集 [129],其中包括各种编程语言的大量开源许可的代码片段,作为代表性的代码数据集。CodeGen已经利用BIGQUERY [77],BigQuery数据集的一个子集,用于训练CodeGen-Multi的多语言版本。
- 其他。The Pile [130]是一个大规模、多样化和开源的文本数据集,包括来自多个来源的超过800GB的数据,包括书籍、网站、代码、科学论文和社交媒体平台。它由22个不同的高质量子集构成。The Pile数据集被广泛用于具有不同参数规模的模型,例如GPT-J (6B) [134]、CodeGen (16B) [77]和Megatron-Turing NLG (530B) [97]。此外,ROOTS [131]由各种较小的数据集组成(总共1.61 TB的文本),涵盖59种不同的语言(包括自然语言和编程语言),已被用于训练BLOOM [69]。
在实践中,为了预训练LLMs(见图2),通常需要混合使用不同的数据源,而不是单一的语料库。因此,现有的研究通常混合几个现成的数据集(例如C4、OpenWebText和The Pile),然后进行进一步的处理以获得预训练语料库。此外,为了训练适应特定应用程序的LLMs,从相关来源(例如维基百科和BigQuery)提取数据以丰富预训练数据中的相应信息也很重要。为了快速了解现有LLMs中使用的数据源,我们介绍了三个代表性LLMs的预训练语料库:
- GPT-3 (175B) [55]是在混合数据集(包括CommonCrawl [132]、WebText2 [55]、Books1 [55]、Books2 [55]和Wikipedia [128])的基础上进行训练的,总共包含300B个标记。
- PaLM (540B) [56]使用了一个预训练数据集,包含780B个标记,来源于社交媒体对话、过滤的网页、书籍、Github、多语言维基百科和新闻。
- LLaMA [57]从各种来源提取训练数据,包括CommonCrawl、C4 [73]、Github、维基百科、书籍、ArXiv和StackExchange。LLaMA (6B)和LLaMA (13B)的训练数据大小为1.0T标记,而LLaMA (32B)和LLaMA (65B)使用了1.4T标记。
库资源
在这部分中,我们简要介绍了一系列可用于开发LLMs的库。
- Transformers [135]是一个开源的Python库,用于使用Transformer架构构建模型,由Hugging Face开发和维护。它具有简单和用户友好的API,使得使用和定制各种预训练模型变得容易。它是一个功能强大的库,拥有庞大而活跃的用户和开发者社区,他们定期更新和改进模型和算法。
- DeepSpeed [65]是由微软开发的深度学习优化库(与PyTorch兼容),已被用于训练许多LLMs,例如MT-NLG [97]和BLOOM [69]。它提供了各种优化技术的支持,用于分布式训练,例如内存优化(ZeRO技术、梯度检查点)和管道并行。
- Megatron-LM [66-68]是由NVIDIA开发的深度学习库,用于训练大规模语言模型。它还提供了丰富的分布式训练优化技术,包括模型和数据并行、混合精度训练和FlashAttention。这些优化技术可以大大提高训练效率和速度,实现跨GPU的高效分布式训练。
- JAX [136]是由Google开发的用于高性能机器学习算法的Python库,允许用户在具有硬件加速(例如GPU或TPU)的数组上轻松执行计算。它可以在各种设备上进行高效计算,并支持几个特色功能,例如自动微分和即时编译。
- Colossal-AI [137]是由HPC-AI Tech开发的深度学习库,用于训练大规模AI模型。它基于PyTorch实现,并支持丰富的并行训练策略集合。此外,它还可以使用PatrickStar [138]提出的方法优化异构内存管理。最近,一个名为ColossalChat [121]的ChatGPT类似模型已经公开发布,有两个版本(7B和13B),它们是使用基于LLaMA [57]的Colossal-AI开发的。
- BMTrain [139]是由OpenBMB开发的高效库,用于以分布式方式训练具有大规模参数的模型,强调代码简洁、资源低、可用性高。BMTrain已经将几个常见的LLMs(例如Flan-T5 [64]和GLM [83])纳入其ModelCenter中,开发人员可以直接使用这些模型。
- FastMoE [140]是一种专门用于MoE(即专家混合)模型的训练库。它基于PyTorch开发,设计上优先考虑效率和用户友好性。FastMoE简化了将Transformer模型转换为MoE模型的过程,并支持在训练期间进行数据并行和模型并行。
除了上述库资源外,现有的深度学习框架(例如PyTorch [141]、TensorFlow [142]、MXNet [143]、PaddlePaddle [144]、MindSpore [117]和OneFlow [145])也提供了对并行算法的支持,这些算法通常用于训练大规模模型。
预训练
预训练为LLMs的能力奠定了基础。通过在大规模语料库上进行预训练,LLMs可以获得基本的语言理解和生成技能[55, 56]。在这个过程中,预训练语料库的规模和质量对于LLMs获得强大的能力至关重要。此外,为了有效地预训练LLMs,需要设计良好的模型架构、加速方法和优化技术。接下来,我们首先在第4.1节讨论数据收集和处理,然后在第4.2节介绍常用的模型架构,最后在第4.3节介绍稳定高效地优化LLMs的训练技术。
数据收集
与小规模语言模型相比,LLMs对于模型预训练的高质量数据有更强的需求,它们的模型容量在很大程度上依赖于预训练语料库以及它是如何被预处理的。在这部分中,我们讨论预训练数据的收集和处理,包括数据来源、预处理方法以及预训练数据如何影响LLMs性能的重要分析。
数据来源
要开发一个能力强大的LLM,关键是从各种数据源收集大量的自然语言语料库。现有的LLMs主要利用各种公共文本数据集的混合作为预训练语料库。图2显示了一些代表性LLMs的预训练数据来源分布。
预训练语料库的来源可以广泛分为两种类型:通用数据和专业数据。由于其规模大、多样化和易于获取,大多数LLMs [55, 56, 81]都利用通用数据,例如网页、书籍和对话文本,这可以增强LLMs的语言建模和泛化能力。鉴于LLMs展示出的令人印象深刻的泛化能力,也有研究将它们的预训练语料库扩展到更专业的数据集,例如多语言数据、科学数据和代码,赋予LLMs特定的任务解决能力[35, 56, 77]。接下来,我们描述这两种类型的预训练数据来源及其对LLMs的影响。有关常用语料库的详细介绍,请参见第3.2节。
通用文本数据
如图2所示,绝大多数LLMs采用通用预训练数据,例如网页、书籍和对话文本,这提供了各种主题的丰富文本来源。接下来,我们简要总结了三种重要的通用数据类型。
- 网页。由于互联网的普及,各种类型的数据已经被创建,这使得LLMs能够获得多样化的语言知识并增强它们的泛化能力[26, 73]。为了方便使用这些数据资源,以前的工作从网络中爬取了大量数据,例如CommonCrawl [132]。然而,爬取的网络数据往往包含高质量的文本,例如维基百科,也包含低质量的文本,例如垃圾邮件,因此过滤和处理网页以提高数据质量非常重要。
- 对话文本。对话数据可以增强LLMs的对话能力[81],并潜在地提高它们在一系列问答任务上的表现[56]。研究人员可以利用公共对话语料库的子集(例如PushShift.io Reddit语料库)[127, 146]或从在线社交媒体收集对话数据。由于在线对话数据通常涉及多个参与者之间的讨论,有效的处理方式是将对话转换为树形结构,其中话语与其回应的话语相连。通过这种方式,多方对话树可以分成多个子对话,这些子对话可以收集到预训练语料库中。此外,潜在的风险是,过度将对话数据集成到LLMs中可能会产生副作用[81]:声明性指令和直接疑问被错误地视为对话的开始,从而导致指令的有效性下降。
- 书籍。与其他语料库相比,书籍提供了正式长文本的重要来源,这对于LLMs学习语言知识、建模长期依赖关系以及生成叙述性和连贯性文本可能是有益的。为了获取开源书籍数据,现有研究通常采用Books3和Bookcorpus2数据集,这些数据集可在Pile数据集[130]中获取。
专业文本数据
专业数据集有助于提高LLMs在下游任务中的特定能力。接下来,我们介绍三种专业数据。
- 多语言文本。除了目标语言的文本外,整合多语言语料库可以增强语言理解和生成的多语言能力。例如,BLOOM [69]和PaLM [56]在它们的预训练语料库中精选了覆盖46种和122种语言的多语言数据。这些模型在多语言任务中展示出了令人印象深刻的性能,例如翻译、多语言摘要和多语言问答,并且在目标语言的语料库上进行微调的最先进模型相比,它们实现了可比或更优秀的性能。
- 科学文本。人类对科学的探索已经见证了科学出版物的不断增长。为了增强LLMs对科学知识的理解[35, 147],将科学语料库纳入模型预训练是有用的[35, 147]。通过在大量的科学文本上进行预训练,LLMs可以在科学和推理任务中实现令人印象深刻的性能[148]。为了构建科学语料库,现有的工作主要收集arXiv论文、科学教科书、数学网页和其他相关的科学资源。由于科学领域数据的复杂性,例如数学符号和蛋白质序列,通常需要特定的标记化和预处理技术,将这些不同格式的数据转换为可以被语言模型处理的统一形式。
- 代码。程序综合已经在研究界广泛研究[89, 149-152],特别是使用训练过的PLMs来处理代码[134, 153]。然而,对于这些PLMs(例如GPT-J [134]),生成高质量和准确的程序仍然具有挑战性。最近的研究[89, 152]发现,将LLMs训练在大量的代码语料库上可以显著提高合成程序的质量。生成的程序可以成功通过专家设计的单元测试用例[89]或解决竞争性编程问题[98]。一般来说,用于预训练LLMs的代码语料库通常有两种类型。第一种来源是来自编程问答社区,例如Stack Exchange [154, 155]。第二个来源是来自公共软件存储库,例如GitHub [77, 89, 152],其中收集了代码数据(包括注释和文档字符串)以供利用。与自然语言文本相比,代码以编程语言的格式呈现,对应着长程依赖和准确的执行逻辑[156]。最近的一项研究[47]还推测,训练代码可能是复杂推理能力(例如思维链能力[33])的来源。此外,已经表明,将推理任务格式化为代码可以帮助LLMs生成更准确的结果[156, 157]。
在收集大量文本数据之后,对数据进行预处理以构建预训练语料库至关重要,特别是要删除噪声、冗余、不相关和潜在有害的数据[56, 59],这可能会极大地影响LLMs的容量和性能。在本部分中,我们回顾了详细的数据预处理策略,以提高收集数据的质量[59, 69, 96]。预处理LLMs的预训练数据的典型流程已在图3中说明。
数据预处理
质量过滤:为了从收集的语料库中删除低质量的数据,现有的工作通常采用两种方法:(1)基于分类器的方法和(2)基于启发式的方法。前一种方法基于高质量文本训练选择分类器,并利用它来识别和过滤低质量数据。通常,这些方法[55, 56, 96]使用精心策划的数据(例如维基百科页面)作为正例,将候选数据作为负例,训练一个二元分类器,并预测衡量每个数据示例质量的分数。然而,一些研究[59, 96]还发现,基于分类器的方法可能会意外地删除方言、口语和社会语言中的高质量文本,这可能导致预训练语料库中的偏见并减少语料库的多样性。作为第二种方法,一些研究,例如BLOOM [69]和Gopher [59],采用基于启发式的方法通过一组精心设计的规则消除低质量文本,这些规则可以总结如下:
- 基于语言的过滤。如果LLM主要用于某些语言的任务,则可以过滤其他语言的文本。
- 基于度量的过滤。可以使用生成文本的评估度量,例如困惑度,来检测和删除不自然的句子。
- 基于统计的过滤。可以利用语料库的统计特征,例如标点符号分布、符号与单词比例和句子长度,来衡量文本质量并过滤低质量数据。
- 基于关键词的过滤。基于特定的关键词集,可以识别和删除文本中的噪声或无用元素,例如HTML标记、超链接、样板和冒犯性词语。
去重:现有的研究[158]发现,语料库中的重复数据会降低语言模型的多样性,这可能导致训练过程不稳定,从而影响模型性能。因此,有必要对预训练语料库进行去重。特别地,可以在不同的粒度上进行去重,包括句子级、文档级和数据集级去重。首先,应删除包含重复单词和短语的低质量句子,因为它们可能会引入重复的语言模式[159]。在文档级别上,现有的研究主要依靠文档之间表面特征(例如单词和n-gram重叠)的重叠比率来检测和删除包含相似内容的重复文档[57, 59, 69, 160]。此外,为了避免数据集污染问题,还需要通过从训练集中删除可能的重复文本来防止训练和评估集之间的重叠[56]。已经表明,三个级别的去重对于改善LLMs的训练是有用的[56, 161],在实践中应该共同使用。
隐私保护:大多数预训练文本数据来自于网络来源,包括涉及敏感或个人信息的用户生成内容,这可能增加隐私泄露的风险[162]。因此,有必要从预训练语料库中删除个人身份信息(PII)。一种直接有效的方法是采用基于规则的方法,例如关键词检测,来检测和删除姓名、地址和电话号码等PII[131]。此外,研究人员还发现,LLMs在隐私攻击下的脆弱性可以归因于预训练语料库中存在重复的PII数据[163]。因此,去重也可以在一定程度上降低隐私风险。
Token化:Token化也是数据预处理的关键步骤。它旨在将原始文本分割成单个标记序列,随后将其用作LLMs的输入。虽然利用现有的标记器(例如OPT [81]和GPT-3 [55]利用GPT-2 [26]的标记器)是方便的,但是使用专门为预训练语料库设计的标记器可能会非常有益[69],特别是对于由多个领域、语言和格式组成的语料库。因此,一些最近的LLMs使用SentencePiece [164]专门为预训练语料库训练定制的标记器。利用字节级别的Byte Pair Encoding(BPE)算法[165]可以确保标记化后的信息不会丢失[56, 59]。然而,在BPE中的规范化技术,例如NFKC [166],可能会降低标记化性能[34, 59, 69]。
预训练数据对LLMs的影响
与小规模PLMs不同,由于对计算资源的巨大需求,通常不可能多次迭代LLMs的预训练。因此,在训练LLMs之前构建一个准备充分的预训练语料库尤为重要。在本部分中,我们讨论预训练语料库的质量和分布如何潜在地影响LLMs的性能。
混合来源:如前所述,来自不同领域或场景的预训练数据具有不同的语言特征或语义知识。通过在来自不同来源的文本数据上进行预训练,LLMs可以获得广泛的知识范围,并可能展现出强大的泛化能力。在混合不同来源时,需要仔细设置预训练数据的分布,因为这也可能影响LLMs在下游任务上的性能[59]。Gopher [59]对数据分布进行了消融实验,以研究混合来源对下游任务的影响。在LAMBADA数据集[167]上的实验结果表明,增加书籍数据的比例可以提高模型在捕捉文本中的长期依赖关系方面的能力,而增加C4数据集[73]的比例则会导致在C4验证数据集上的性能提高[59]。然而,作为副作用,过多地训练某个领域的数据会影响LLMs在其他领域的泛化能力[35, 59]。因此,建议研究人员应仔细确定预训练语料库中来自不同领域的数据比例,以开发更符合其特定需求的LLMs。读者可以参考图2,比较不同LLMs的数据来源。
预训练数据量:为了预训练一个有效的LLM,收集足够的高质量数据以满足LLM的数据量需求非常重要。现有的研究发现,随着LLM中参数规模的增加,也需要更多的数据来训练模型[34, 57]:与模型大小相似的缩放规律也观察到了数据大小与模型性能之间的关系。最近的一项研究表明,由于预训练数据不足,许多现有的LLMs训练效果不佳[34]。通过进行广泛的实验,它进一步证明了在相等的规模下增加模型大小和数据大小可以导致更高效的计算模型(即Chinchilla模型),对于给定的计算预算。最近,LLaMA [57]表明,通过更多的数据和更长的训练,较小的模型也可以实现良好的性能。总的来说,建议研究人员在扩展模型参数时,应更加关注足够的高质量数据量,以充分训练模型。
架构
在本节中,我们回顾LLMs的架构设计,即主流架构、预训练目标和详细配置。表3列出了几个具有公开细节的代表性LLMs的模型卡。
主流架构
由于其出色的可并行性和容量,Transformer架构[22]已成为开发各种LLMs的事实标准骨干,使得将语言模型扩展到数百亿或数千亿个参数成为可能。一般来说,现有LLMs的主流架构可以大致分为三种主要类型,即编码器-解码器、因果解码器和前缀解码器,如图4所示。
- 编码器-解码器架构。基于编码器-解码器架构[22]构建了基本的Transformer模型,其中包括两个Transformer块堆栈,分别作为编码器和解码器。编码器采用堆叠的多头自注意力层对输入序列进行编码,以生成其潜在表示,而解码器对这些表示进行交叉注意力,并自回归地生成目标序列。编码器-解码器PLMs(例如T5 [73]和BART [24])已经在各种NLP任务中显示出有效性。到目前为止,只有少数基于编码器-解码器架构构建的LLMs,例如Flan-T5 [64]。我们将在第4.2.4节中留下关于架构选择的详细讨论。
- 因果解码器架构。因果解码器架构采用单向注意力掩码,以确保每个输入标记只能关注过去的标记和自身。输入和输出标记通过解码器以相同的方式进行处理。作为该架构的代表性语言模型,GPT系列模型[26, 55, 105]是基于因果解码器架构开发的。特别是,GPT-3 [55]已经成功展示了这种架构的有效性,同时也展示了LLMs惊人的上下文学习能力。有趣的是,GPT-1 [105]和GPT-2 [26]并没有展现出GPT-3中那样的卓越能力,似乎扩展在增加该模型架构的模型容量方面起着重要作用。到目前为止,因果解码器已经被各种现有的LLMs广泛采用作为架构,例如OPT [81]、BLOOM [69]和Gopher [59]。请注意,下面讨论的因果解码器和前缀解码器都属于仅解码器架构。当提到“仅解码器架构”时,除非特别说明,否则主要指现有文献中的因果解码器架构。
- 前缀解码器架构。前缀解码器架构(也称为非因果解码器[169])修改了因果解码器的掩码机制,以便在前缀标记上执行双向注意力[170],并仅在生成的标记上执行单向注意力。这样,就像编码器-解码器架构一样,前缀解码器可以双向编码前缀序列,并自回归地逐个预测输出标记,其中在编码和解码期间共享相同的参数。实际建议是不要从头开始预训练,而是持续训练因果解码器,然后将其转换为前缀解码器以加速收敛[29],例如U-PaLM [102]是从PaLM [56]派生出来的。基于前缀解码器的现有代表性LLMs包括GLM-130B [83]和U-PaLM [102]。
对于这三种架构,我们还可以考虑通过混合专家(MoE)扩展它们,其中每个输入的一部分神经网络权重被稀疏激活,例如Switch Transformer [25]和GLaM [96]。已经表明,通过增加专家数量或总参数大小,可以观察到显著的性能提升[171]。
详细配置
自Transformer [22]推出以来,已经提出了各种改进来增强其训练稳定性、性能和计算效率。在本部分中,我们将讨论Transformer的四个主要部分的相应配置,包括归一化、位置嵌入、激活函数和注意力和偏置。为了使本调查更加自包含,我们在表4中提供了这些配置的详细公式。
- 归一化。训练不稳定是预训练LLMs的一个具有挑战性的问题。为了缓解这个问题,层归一化(Layer Norm,LN)[173]被广泛应用于Transformer架构中。LN的位置对LLMs的性能至关重要。虽然最初的Transformer [22]使用后LN,但大多数LLMs采用前LN以获得更稳定的训练,尽管会降低性能[182]。基于前LN,Sandwich-LN [172]在残差连接之前添加额外的LN以避免值爆炸。然而,已经发现Sandwich-LN有时无法稳定LLMs的训练,可能导致训练崩溃[83]。最近,一些先进的归一化技术已被提出作为LN的替代方案。在Gopher [59]和Chinchilla [34]中,由于其在训练速度和性能方面的优越性,采用了RMS Norm [174]。与LN相比,DeepNorm [175]已经显示出更好的确保训练稳定性的能力,已经被GLM-130B采用后归一化。此外,在嵌入层之后添加额外的LN也可以稳定LLMs的训练。然而,这往往会导致显着的性能下降[184],已经在一些最近的LLMs中被移除[69]。
- 激活函数。为了获得良好的性能,激活函数在前馈网络中也需要适当设置。在现有的LLMs中,广泛使用GeLU激活函数[185]。此外,在最新的LLMs(例如PaLM和LaMDA)中,也已经使用了GLU激活函数的变体[179, 186],特别是SwiGLU和GeGLU变体,在实践中通常能够获得更好的性能[183]。然而,与GeLU相比,它们在前馈网络中需要额外的参数(约50%)[184]。
- 位置嵌入。由于Transformer中的自注意力模块是置换等变的,因此使用位置嵌入来注入绝对或相对位置信息以建模序列。在香草Transformer [22]中有两种绝对位置嵌入的变体,即正弦函数和学习的位置嵌入,后者通常在LLMs中使用。与绝对位置嵌入不同,相对位置编码可以更好地处理长序列[187]。在GPT-1 [105]中,相对位置编码被引入到自注意力机制中,以便在不增加参数的情况下处理更长的序列。在后续的GPT系列模型中,相对位置编码被广泛采用[55, 188]。值得注意的是,相对位置编码需要在训练期间进行动态计算,因此会增加计算成本。
- 根据键和查询之间的偏移量生成嵌入[73],因此它可以在训练期间看到的序列长度之外的序列上表现良好,即外推[181]。ALiBi [181]使用基于键和查询之间距离的惩罚来偏置注意力分数。实证结果表明,它比其他位置嵌入具有更好的零-shot泛化能力和更强的外推能力[29]。此外,通过基于绝对位置设置特定的旋转矩阵,RoPE [180]中键和查询之间的分数可以使用相对位置信息计算,这对于建模长序列非常有用。因此,RoPE已被广泛采用于几个最新的LLMs中[56, 57, 83]。
- 注意力和偏置。除了原始Transformer [22]中的全自注意力外,GPT-3还使用了计算复杂度较低的稀疏注意力(即分解注意力[55, 187])。为了有效且高效地建模更长的序列,通过引入特殊的注意力模式[188, 189]或考虑GPU内存访问(即FlashAttention [190])等方式进行了更多尝试。此外,遵循原始Transformer的做法,大多数LLMs在每个密集核和层归一化中保留偏置。然而,在PaLM [56]和Galactica [35]中,偏置被移除。这表明,对于LLMs,没有偏置可以增强训练稳定性[56]。
综合上述讨论,我们总结了现有文献中对详细配置的建议。为了获得更强的泛化能力和训练稳定性,建议选择前RMS Norm进行层归一化,并选择SwiGLU或GeGLU作为激活函数。然而,LN可能不适用于嵌入层之后,这可能会导致性能下降。此外,对于位置嵌入,RoPE或ALiBi是更好的选择,因为它们在长序列上表现更好。
预训练任务
预训练在将大规模语料库中的通用知识编码到大规模模型参数中起着关键作用。对于训练LLMs,有两种常用的预训练任务,即语言建模和去噪自编码。
语言建模。语言建模任务(LM)是预训练仅包含解码器的LLMs(例如GPT3 [55]和PaLM [56])最常用的目标。给定一个令牌序列x = {x1,...,xn},LM任务旨在基于序列中前面的令牌x<i,自回归地预测目标令牌xi。一般的训练目标是最大化以下似然:
由于大多数语言任务都可以基于输入进行预测,这些仅包含解码器的LLMs可能具有潜在的优势,可以隐式地学习如何以统一的LM方式完成这些任务。一些研究还表明,仅包含解码器的LLMs可以通过自回归地预测下一个令牌[26, 55]自然地转移到某些任务,而无需微调。LM的一个重要变体是前缀语言建模任务,它是为了预训练具有前缀解码器架构的模型而设计的。在计算前缀语言建模的损失时,不会使用随机选择的前缀内的令牌。在预训练期间看到相同数量的令牌时,前缀语言建模的表现略差于语言建模,因为序列中涉及的令牌较少[29]。
去噪自编码。除了传统的LM之外,去噪自编码任务(DAE)也被广泛用于预训练语言模型[24, 73]。DAE任务的输入xx ̃是带有随机替换跨度的损坏文本。然后,语言模型被训练以恢复替换的令牌x ̃。形式上,DAE的训练目标如下所示:
然而,DAE任务在实现上似乎比LM任务更加复杂。因此,它并没有被广泛用于预训练大型语言模型。采用DAE作为预训练目标的现有LLMs包括T5 [73]和GLM-130B [83]。这些模型主要是以自回归的方式训练以恢复替换的跨度。
总结和讨论
架构和预训练任务的选择可能会为LLMs带来不同的归纳偏差,这将导致不同的模型容量。在本部分中,我们总结了现有文献中关于这个问题的一些重要发现或讨论。
过使用LM目标进行预训练,因果解码器架构似乎可以实现更优越的零样本和少样本泛化能力。现有研究表明,在没有多任务微调的情况下,因果解码器比其他架构具有更好的零样本性能[29]。GPT-3 [55]的成功证明了大型因果解码器模型可以成为良好的少样本学习器。此外,第5节讨论的指令调整和对齐调整已被证明可以进一步增强大型因果解码器模型的能力[61, 62, 64]。
在因果解码器中,缩放定律已被广泛观察到。通过缩放模型大小、数据集大小和总计算量,可以大幅提高因果解码器的性能[30, 55]。因此,通过缩放已成为增加因果解码器模型容量的重要策略。然而,对于编码器-解码器模型的更详细调查仍然缺乏,需要更多的努力来研究大规模编码器-解码器模型的性能。
需要更多的研究努力来讨论架构和预训练目标的选择如何影响LLMs的容量,特别是对于编码器-解码器架构。除了主要架构之外,LLM的详细配置也值得关注,这在第4.2.2节中已经讨论过。
模型训练
在本部分中,我们回顾了训练LLMs的重要设置、技术或技巧。
优化设置
对于LLMs的参数优化,我们介绍了批量训练、学习率、优化器和训练稳定性的常用设置。
- 批量训练。对于语言模型的预训练,现有的工作通常将批量大小设置为一个较大的数字(例如,8,196个示例或16M个标记),以提高训练稳定性和吞吐量。对于像GPT-3和PaLM这样的LLMs,它们引入了一种新的策略,在训练过程中动态增加批量大小,最终达到百万级别。具体而言,GPT-3的批量大小从32K逐渐增加到3.2M个标记。实证结果表明,批量大小的动态调度可以有效稳定LLMs的训练过程[56]。
- 学习率。现有的LLMs通常采用类似的学习率调度和预热和衰减策略进行预训练。具体而言,在训练步骤的初始0.1%到0.5%中,采用线性预热调度逐渐增加学习率到最大值,该最大值范围约为5×10−5到1×10−4(例如,GPT-3为6×10−5)。然后,在随后的步骤中采用余弦衰减策略,逐渐将学习率降低到其最大值的约10%,直到训练损失收敛。
- 优化器。Adam优化器[191]和AdamW优化器[192]被广泛用于训练LLMs(例如,GPT-3),它们基于对第一阶梯度进行自适应估计的低阶矩的优化。通常,它的超参数设置如下:β1 = 0.9,β2 = 0.95和ε = 10−8。同时,Adafactor优化器[193]也被用于训练LLMs(例如,PaLM和T5),它是Adam优化器的一种变体,专门设计用于在训练期间保留GPU内存。Adafactor优化器的超参数设置为:β1 = 0.9和β2 = 1.0 − k−0.8,其中k表示训练步骤的数量。
- 训练稳定性。在LLMs的预训练过程中,经常会遇到训练不稳定的问题,这可能会导致模型崩溃。为了解决这个问题,广泛使用了权重衰减和梯度裁剪,其中现有研究[55, 69, 81, 83, 97]通常将梯度裁剪的阈值设置为1.0,权重衰减率设置为0.1。然而,随着LLMs的扩展,训练损失峰值也更容易发生,导致训练不稳定。为了缓解这个问题,PaLM [56]和OPT [81]采用了一种简单的策略,即从早期的检查点重新启动训练过程,以避免出现峰值,并跳过可能导致问题的数据。此外,GLM [83]发现嵌入层的异常梯度通常会导致峰值,并提出缩小嵌入层梯度以减轻这种情况。
可扩展训练技术
随着模型和数据大小的增加,如何在有限的计算资源下高效地训练LLMs已经成为一个挑战。特别是,需要解决两个主要的技术问题,即提高训练吞吐量和将更大的模型加载到GPU内存中。在本部分中,我们回顾了现有工作中几种广泛使用的方法来解决上述两个挑战,即3D并行[66, 194, 195]、ZeRO[196]和混合精度训练[197],并提出了如何利用它们进行训练的一般建议。
- 3D并行。3D并行实际上是三种常用的并行训练技术的组合,即数据并行、管道并行[194, 195]和张量并行[66]19。接下来我们介绍这三种并行训练技术。
- 数据并行。数据并行是提高训练吞吐量最基本的方法之一。它将模型参数和优化器状态复制到多个GPU上,然后将整个训练语料库分配到这些GPU上。这样,每个GPU只需要处理分配给它的数据,并执行前向和反向传播以获取梯度。在不同GPU上计算的梯度将进一步聚合,以获得整个批次的梯度,以更新所有GPU上的模型。由于在不同GPU上独立执行梯度计算,因此数据并行机制具有高度可扩展性,可以通过增加GPU数量来提高训练吞吐量。此外,这种技术在实现上很简单,大多数现有的流行深度学习库已经实现了数据并行,例如TensorFlow和PyTorch。
- 管道并行。管道并行旨在将LLM的不同层分配到多个GPU上。特别是,在Transformer模型的情况下,管道并行将连续的层加载到同一个GPU上,以减少在GPU之间传输计算的隐藏状态或梯度的成本。然而,管道并行的朴素实现可能会导致GPU利用率降低,因为每个GPU都必须等待前一个GPU完成计算,从而导致不必要的气泡开销[194]。为了减少管道并行中的这些气泡,GPipe [194]和PipeDream [195]提出了填充多个数据批次和异步梯度更新的技术,以提高管道效率。
- 张量并行。张量并行也是一种常用的技术,旨在将LLM分解为多GPU加载。与管道并行不同,张量并行侧重于分解LLMs的张量(参数矩阵)。对于LLM中的矩阵乘法操作Y = XA,参数矩阵A可以按列分成两个子矩阵A1和A2,可以表示为Y = [X A1,X A2]。通过将矩阵A1和A2放置在不同的GPU上,矩阵乘法操作将在两个GPU上并行调用,并且可以通过跨GPU通信将两个GPU的输出组合成最终结果。目前,张量并行已经在几个开源库中得到支持,例如Megatron-LM [66],并且可以扩展到更高维的张量。此外,Colossal-AI还为更高维的张量实现了张量并行[198-200],并提出了序列并行[201],特别是针对序列数据,可以进一步分解Transformer模型的注意力操作。
- ZeRO。DeepSpeed [65]库提出的ZeRO [196]技术专注于解决数据并行中的内存冗余问题。如前所述,数据并行要求每个GPU存储LLM的相同副本,包括模型参数、模型梯度和优化器参数。然而,并非所有上述数据都需要在每个GPU上保留,这会导致内存冗余问题。为了解决这个问题,ZeRO技术旨在仅在每个GPU上保留部分数据,而其余数据可以在需要时从其他GPU中检索。具体而言,ZeRO提供了三种解决方案,取决于如何存储数据的三个部分,即优化器状态分区、梯度分区和参数分区。实证结果表明,前两个解决方案不会增加通信开销,第三个解决方案会增加约50%的通信开销,但可以节省与GPU数量成比例的内存。PyTorch已经实现了与ZeRO类似的技术,称为FSDP [202]。
- 混合精度训练。在以前的PLMs(例如BERT [23])中,主要使用32位浮点数,也称为FP32,进行预训练。近年来,为了预训练极大的语言模型,一些研究[197]开始使用16位浮点数(FP16),这可以减少内存使用和通信开销。此外,由于流行的NVIDIA GPU(例如A100)具有两倍于FP32的FP16计算单元数量,因此FP16的计算效率可以进一步提高。然而,现有的研究发现FP16可能会导致计算精度的损失[59, 69],从而影响最终的模型性能。为了缓解这个问题,一种称为Brain Floating Point(BF16)的替代方法已经用于训练,它分配更多的指数位和较少的有效位比FP16。对于预训练,BF16通常比FP16在表示准确性方面表现更好[69]。
总体训练建议。在实践中,上述训练技术,特别是3D并行,通常联合使用以提高训练吞吐量和大模型加载。例如,研究人员已经将8路数据并行、4路张量并行和12路管道并行纳入BLOOM [69]的训练中,使其能够在384个A100 GPU上进行训练。目前,像DeepSpeed [65]、Colossal-AI [137]和Alpa [203]这样的开源库可以很好地支持这三种并行训练方法。为了减少内存冗余,可以使用ZeRO、FSDP和激活重计算技术[68, 204]来训练LLMs,这些技术已经集成到DeepSpeed、PyTorch和Megatron-LM中。此外,混合精度训练技术,如BF16,也可以利用来提高训练效率和减少GPU内存使用,但需要硬件的必要支持(例如A100 GPU)。由于训练大模型是一个耗时的过程,因此在早期预测模型性能并检测异常问题将非常有用。为此,GPT-4 [46]最近引入了一种称为可预测扩展的新机制,该机制建立在深度学习堆栈上,可以使用更小的模型对大模型的性能进行预测,这可能非常有用于开发LLMs。在实践中,可以进一步利用主流深度学习框架的支持训练技术。例如,PyTorch支持数据并行训练算法FSDP [202](即完全分片数据并行),如果需要,可以将部分训练计算卸载到CPU上。
除了上述的训练策略,提高LLMs的推理速度也非常重要。通常,量化技术被广泛用于减少LLMs在推理阶段的时间和空间成本[205]。虽然会损失一些模型性能,但量化的语言模型具有更小的模型大小,可以实现更快的推理速度[83, 206, 207]。对于模型量化,INT8量化[206]是一个流行的选择。此外,一些研究工作尝试开发更激进的INT4量化方法[83]。最近,Hugging Face发布了几个公开可用的语言模型的量化模型副本,包括BLOOM20、GPT-J21和ChatGLM22。
本文翻译摘要、概述、大语言资源、预训练;(后续会人工修改里面不好理解的句子)
下篇文章翻译LLM适应性调试、利用、能力进化、总结。