23年6月人大和蒙特利尔大学的论文“A Survey of Large Language Models”。
自上世纪 50 年代图灵测试提出以来,人类就开始探索机器对语言智能的掌握。语言本质上是一种由语法规则支配复杂、精密的人类表达系统,开发能够理解和掌握语言的人工智能算法是一项重大挑战。语言建模作为语言理解和生成的一种主要方法,在过去的二十年里得到了广泛的研究,从统计语言模型发展到神经语言模型。最近,通过在大规模语料上预训练 Transformer 模型,提出了预训练语言模型 (PLM),在解决各种自然语言处理 (NLP) 任务中表现出强大的能力。由于研究者发现模型规模化可以提升模型容量,他们进一步通过将参数规模增加到更大来研究规模化效果。有趣的是,当参数规模超过一定水平时,这些扩大的语言模型不仅实现了显著的性能提升,而且还表现出一些小规模语言模型(例如 BERT)所不具备的特殊能力(例如,上下文学习)。为了区分不同参数规模的语言模型,研究界为具有相当规模(例如,包含数百亿或数千亿个参数)的语言模型创造了一个术语“大语言模型”(LLM)。最近,学术界和工业界对 LLM 的研究取得了长足的进步,其中一项显著的进展是 ChatGPT(基于 LLM 开发的强大 AI 聊天机器人)的推出,引起了社会的广泛关注。LLM 的技术发展对整个 AI 社区产生了重要影响,这将彻底改变开发和使用 AI 算法的方式。本综述介绍背景、关键发现和主流技术来回顾 LLM 的最新进展。具体来说,重点关注 LLM 的四个主要方面,即预训练、自适应调整、利用率和能力评估。此外,总结开发 LLM 的可用资源,并讨论未来方向的剩余问题。
LLM 是基于神经网络大规模、预训练的统计语言模型。LLMs最近的成功是语言模型研究和开发积累的结果,可以分为四个历史浪潮:统计语言模型(SLM),神经语言模型(NLM),预训练语言模型(PLM)和LLM。
研究人员发现,扩展 PLM(例如扩展模型大小或数据大小)通常会导致下游任务的模型能力提高(即遵循规模化定律 [30])。许多研究通过训练更大的 PLM(例如 175B 参数的 GPT-3 和 540B 参数的 PaLM)探索了性能极限。尽管扩展主要在模型大小上进行(具有相似的架构和预训练任务),但这些大型 PLM 表现出与较小 PLM(例如 330M 参数的 BERT 和 1.5B 参数的 GPT-2)不同的行为,并在解决一系列复杂任务中表现出令人惊讶的能力(称为涌现能力 [31])。例如,GPT-3 可以通过上下文学习解决少样本任务,而 GPT-2 则表现不佳。因此,研究界为这些大型 PLM 创造了“大语言模型 (LLM)”1 一词 [32–35],它们引起了越来越多的研究关注(见图 1)。LLM 的一个显著应用是 ChatGPT2,它改编了 GPT 系列中的 LLM 进行对话,展现了与人类惊人的对话能力。在图中看到 ChatGPT 发布后与 LLM 相关的 arXiv 论文急剧增加。
LLM 的规模化定律
目前,LLM 主要建立在 Transformer 架构 [22] 之上,其中多头注意层堆叠在非常深的神经网络中。现有的 LLM 采用与小型语言模型类似的 Transformer 架构和预训练目标(例如语言建模)。然而,LLM 显著扩展了模型大小、数据大小和总计算量(放大几个数量级)。大量研究表明,规模化可以大大提高 LLM 的模型能力[26, 55, 56]。因此,建立一种定量方法来表征规模化效果是很有用的。
KM 规模化定律。2020 年,Kaplan [30](OpenAI 团队)首次提出针对神经语言模型,建立模型性能与模型大小(N)、数据集大小(D)和训练计算量(C)三个主要因素的幂律关系模型。
Chinchilla规模化定律。另一项代表性研究是 Hoffmann [34](谷歌 DeepMind 团队)提出了一种替代定律,用于指导 LLM 的计算优化训练。他们通过改变更大范围的模型大小(70M 到 16B)和数据大小(5B 到 500B 个 token)进行了严格的实验,并拟合了类似的规模化定律,但系数不同。
LLM 的涌现能力
在文献 [31] 中,LLM 的涌现能力被正式定义为“小模型中不存在但在大模型中出现的能力”,这是 LLM 与以前的 PLM 最显著的区别之一。它进一步介绍了涌现能力出现时的显著特征 [31]:当规模达到一定水平时,性能会显著高于随机水平。类似地,这种涌现模式与物理学中的相变现象有着密切的联系 [31, 58]。原则上,可以针对一些复杂任务来定义涌现能力 [31, 59],而关心的是应用于解决各种任务的一般能力。
• 上下文学习。上下文学习 (ICL) 能力是由 GPT-3 [55] 正式引入的:假设语言模型已经提供了自然语言指令和/或几个任务演示,它可以通过完成输入文本的单词序列为测试实例生成预期的输出,而无需额外的训练或梯度更新。在 GPT 系列模型中,175B GPT-3 模型总体上表现出很强的 ICL 能力,但 GPT-1 和 GPT-2 模型则不然。这种能力还取决于特定的下游任务。例如,对于 13B GPT-3,ICL 能力可以出现在算术任务(例如 3 位数加减)上,但 175B GPT-3 甚至不能很好地完成波斯语 QA 任务 [31]。
• 指令跟随。通过使用自然语言描述格式化的多任务数据集进行微调(称为指令调优),LLM 在以指令形式描述的未见过的任务上表现出色 [28, 61, 62]。通过指令调优,LLM 能够在不使用明确示例的情况下遵循新任务的任务指令,从而提高泛化能力。根据 [62] 中的实验,当模型大小达到 68B 时,指令调优的 LaMDA-PT [63] 在未见过的任务上的表现开始显著优于未调优的 LaMDA-PT,但对于 8B 或更小的模型大小则并非如此。最近的一项研究 [64] 发现,PaLM 至少需要 62B 的模型大小才能在四个评估基准(即 MMLU、BBH、TyDiQA 和 MGSM)中的各种任务上表现良好,尽管对于某些特定任务(例如 MMLU),更小的模型大小可能就足够了。
• 逐步推理。对于小型语言模型,通常很难解决涉及多个推理步骤的复杂任务,例如数学应用题。相比之下,通过思维链 (CoT) 提示策略 [33],LLM 可以通过利用涉及中间推理步骤的提示机制来得出最终答案,从而解决此类任务。据推测,这种能力可能是通过对代码进行训练获得的 [33, 47]。一项实证研究 [33] 表明,当将 CoT 提示应用于模型大小大于 60B 的 PaLM 和 LaMDA 变体时,可以带来性能提升(在算术推理基准上),而当模型大小超过 100B 时,其相对于标准提示的优势更加明显。此外,对于不同的任务,CoT 提示的性能提升似乎也有所不同,例如对于 PaLM,GSM8K > MAWPS > SWAMP [33]。
LLM 的关键技术
• 扩大规模。如前几部分所述,Transformer 语言模型存在明显的规模效应:更大的模型/数据大小和更多的训练计算通常会导致模型能力提高 [30, 34]。作为两个代表性模型,GPT-3 和 PaLM 分别通过将模型大小增加到 175B 和 540B 来探索扩展极限。由于计算预算通常有限,可以进一步采用规模化定律来对计算资源进行更高效的计算分配。例如,Chinchilla(具有更多训练 token)通过增加数据规模和相同的计算预算来胜过其对应模型 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的时间线:
如图是GPT系列的LLM技术演变说明:
考虑到具有挑战性的技术问题和对计算资源的巨大需求,开发或复制 LLM 绝非易事。一种可行的方法是学习现有 LLM 的经验并重用公开可用的资源进行增量开发或实验研究,比如开发 LLM 的公开可用资源,包括模型检查点(或 API)、语料库和库。
公开可用的模型检查点或 API
鉴于模型预训练的成本巨大,训练有素的模型检查点对于研究界研究和开发 LLM 至关重要。由于参数规模是使用 LLM 需要考虑的关键因素,将这些公共模型分为两个规模级别(即数百亿参数和数千亿参数),这有助于用户根据其资源预算确定合适的资源。此外,对于推理,可以直接使用公共 API 来执行任务,而无需在本地运行模型。
百亿参数的模型。此类模型大多数的参数规模在 10B 到 20B 之间,但 LLaMA [57](最大版本包含 65B 参数)、NLLB [82](最大版本包含 54.5B 参数)和 Falcon [117](最大版本包含 40B 参数)除外。此范围内的其他模型包括 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 个专家生成的问题组成。为了解决这些问题,它要求 LLM 获得足够的编程知识(例如数学、数组操作和算法)。对于多语言任务,mT0(13B 版)可能是一个很好的候选模型,该模型已经在多语言任务上进行了多语言提示的微调。
此外,基于深度学习框架 MindSpore [118] 开发的 PanGu-α [75] 在零样本或少样本设置下的中文下游任务中表现出色。请注意,PanGu-α [75] 拥有多个版本的模型(最多 200B 个参数),而最大的公开版本有 13B 个参数。作为一种流行的 LLM,LLaMA(65B 版本)[57] 包含的参数大约是其他模型的五倍,在与指令遵循相关的任务中表现出色。由于其开放性和有效性,LLaMA 引起了研究界的极大关注,许多努力 [119–122] 致力于微调或持续预训练不同模型版本,以实现新的模型或工具。最近,作为另一个开源 LLM,Falcon [117] 在开放基准上也取得了非常出色的表现。它的特点是更仔细的数据清理过程来准备预训练数据(使用公开共享的数据集 RefinedWeb [123])。通常,这种规模的预训练模型需要数百甚至数千个 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 版本)和指令调整版本 OPT-IML 特别适合开放共享,旨在使研究人员能够进行大规模可重复的研究。对于跨语言泛化研究,BLOOM(176B 版本)和 BLOOMZ(176B 版本)可以用作基础模型,因为它们在多语种语言建模任务中表现出色。作为双语 LLM,GLM 还提供了流行的小型中文聊天模型 ChatGLM2-6B(ChatGLM-6B 的更新版本),该模型在效率和能力方面具有许多改进(例如量化、32K 长度上下文、快速推理率)。这种规模的模型通常需要数千个 GPU 或 TPU 来训练。例如,OPT(175B 版本)使用了 992 个 A100-80GB GPU,而 GLM(130B 版本)使用了 96 个 NVIDIA DGX-A100(8x40G)GPU 节点集群。
LLaMA 模型系列。Meta AI 于 2023 年 2 月推出 LLaMA 模型集合 [57],包括四种大小(7B、13B、30B 和 65B)。自发布以来,LLaMA 引起了研究界和工业界的广泛关注。LLaMA 模型在各种开放基准上都取得了非常出色的表现,成为迄今为止最受欢迎的开源语言模型。大量研究人员通过指令调整或持续预训练扩展了 LLaMA 模型。特别是,由于计算成本相对较低,指令调整 LLaMA 已成为开发定制或专用模型的主要方法。为了有效地将 LLaMA 模型应用于非英语种的语言,通常需要扩展原始词汇表(主要在英语语料库上训练)或使用目标语言中的指令或数据对其进行微调。在这些扩展模型中,Stanford Alpaca [124] 是第一个基于 LLaMA(7B)微调的开放指令跟随模型。它使用 text-davinci-003 通过 self-instruct [125] 生成的 52K 指令跟随演示进行训练。名为 Alpaca-52K 的指令数据和训练代码已在后续工作中被广泛采用,例如 Alpaca-LoRA [126](用 LoRA [127] 对 Stanford Alpaca 的复制)、Koala [128] 和 BELLE [129]。此外,Vicuna [120] 是另一种流行的 LLaMA 变型,根据从 ShareGPT 收集的用户共享对话进行训练。由于 LLaMA 模型系列的出色性能和可用性,许多多模态模型都将它们作为基础语言模型,以实现强大的语言理解和生成能力。与其他变型相比,Vicuna 在多模态语言模型中更受欢迎,这导致出现了各种流行的模型,包括 LLaVA [130]、MiniGPT-4 [131]、InstructBLIP [132] 和 PandaGPT [133]。LLaMA 的发布极大地推动了 LLM 的研究进展。如图展示其一个简短的演化图。
LLM 的公共 API。与直接使用模型副本相比,API 为普通用户提供了一种更方便的方式来使用 LLM,而无需在本地运行模型。作为使用 LLM 的代表性接口,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 接口的选择取决于具体的应用场景和响应需求。
与早期的 PLM 相比,包含很多参数的 LLM 需要大量涵盖广泛内容的训练数据。为了满足这一需求,越来越多的训练数据集已被发布。简要总结几个广泛用于训练 LLM 的语料库,根据其内容类型,分为六类:书籍、CommonCrawl、Reddit 链接、维基百科、代码等。如下表所示:
在实践中,预训练 LLM 通常需要混合使用不同的数据源(如图所示各种数据的占比),而不是使用单个语料库。因此,现有研究通常将几个现成的数据集(例如 C4、OpenWebText 和 Pile)混合使用,然后进行进一步处理以获得预训练语料库。此外,为了训练适应特定应用的 LLM,从相关来源(例如 Wikipedia 和 BigQuery)提取数据以丰富预训练数据中的相应信息也很重要。
下面是三个代表性 LLM 的预训练语料库:
• GPT-3(175B)[55] 在 300B 个 tokens 的混合数据集上进行训练,包括 CommonCrawl [144]、WebText2 [55]、Books1 [55]、Books2 [55] 和 Wikipedia [140]。
• PaLM (540B) [56] 使用 780B 个 tokens 的预训练数据集,该数据集来自社交媒体对话、过滤后的网页、书籍、Github、多语言维基百科和新闻。
• LLaMA [57] 从各种来源提取训练数据,包括 CommonCrawl、C4 [73]、Github、维基百科、书籍、ArXiv 和 StackExchange。LLaMA (6B) 和 LLaMA (13B) 的训练数据大小为 1.0T 个 tokens,而 LLaMA (32B) 和 LLaMA (65B) 使用的训练数据大小为 1.4T 个 tokens。
如下是一些开发LLM的资源库:
• Transformers [147] 是一个开源 Python 库,用于Transformer 架构构建的模型,由 Hugging Face 开发和维护。它具有简单且用户友好的 API,可以轻松使用和定制各种预训练模型。这是一个功能强大的库,拥有庞大而活跃的用户和开发人员社区,他们定期更新和改进模型和算法。
• DeepSpeed [65] 是由 Microsoft 开发的深度学习优化库(与 PyTorch 兼容),已用于训练许多 LLM,例如 MT-NLG [97] 和 BLOOM [69]。它为分布式训练提供了各种优化技术的支持,例如内存优化(ZeRO 技术、梯度检查点)和流水线并行性。
• Megatron-LM [66–68] 是由 NVIDIA 开发的深度学习库,用于训练大规模语言模型。它还为分布式训练提供了丰富的优化技术,包括模型和数据并行性、混合精度训练和 Flash Attention。这些优化技术可以大大提高训练效率和速度,实现跨 GPU 的高效分布式训练。
• JAX [148] 是 Google 开发的高性能机器学习算法 Python 库,允许用户使用硬件加速(例如 GPU 或 TPU)轻松地对阵列执行计算。它能够在各种设备上进行高效计算,还支持多种特色功能,如自动微分和即时编译。
• Colossal-AI [149] 是由 HPC-AI Tech 开发用于训练大规模 AI 模型的深度学习库。它基于 PyTorch 实现,支持丰富的并行训练策略集合。此外,它还可以使用 PatrickStar [150] 提出的方法优化异构内存管理。最近,一个名为 ColossalChat [122] 的 ChatGPT 类模型已公开发布,有两个版本(7B 和 13B),它们是使用基于 LLaMA [57] 的 Colossal-AI 开发的。
• BMTrain [151] 是 OpenBMB 开发的高效库,用于以分布式方式训练具有大规模参数的模型,强调代码简单、资源占用少和可用性高。BMTrain 已将几种常见的 LLM(例如 Flan-T5 [64] 和 GLM [83])整合到其 Model Center 中,开发人员可以直接使用这些模型。
• FastMoE [152] 是一个专门用于 混合专家(MoE)模型的训练库。它基于 PyTorch 开发,在设计上兼顾效率和用户友好性。FastMoE 简化将 Transformer 模型转换为 MoE 模型的过程,并在训练期间支持数据并行和模型并行。
除了上述库资源之外,现有的深度学习框架(例如 PyTorch [153]、TensorFlow [154]、MXNet [155]、PaddlePaddle [156]、MindSpore [118] 和 OneFlow [157])也提供了对并行算法的支持,这些算法常用于训练大规模模型。
待续。。。