Build a Large Language Model (From Scratch) · Chapter 1 中文译文
理解大型语言模型
译自 Build a Large Language Model (From Scratch) MEAP V08 第一章。本文保留原章结构、图、表、脚注与链接;本章没有独立代码清单或成块数学公式,HTML 已预置代码样式与 MathJax 公式渲染支持。
本章内容
- 从高层解释大型语言模型(LLM)背后的基本概念。
- 理解 Transformer 架构:ChatGPT 平台所用一类 LLM 正是由这类架构发展而来。
- 给出从零构建一个 LLM 的路线图。
大型语言模型(large language models,LLMs),例如 OpenAI 的 ChatGPT 所提供的模型,是近几年发展起来的深度神经网络模型。它们开启了自然语言处理(Natural Language Processing,NLP)的新时代。在大型语言模型出现之前,传统方法在电子邮件垃圾分类、以及可以用手写规则或较简单模型捕捉的直接模式识别等分类任务上表现很好。然而,对于需要复杂理解和生成能力的语言任务,例如解析详细指令、进行上下文分析,或生成连贯且上下文恰当的原创文本,传统方法通常表现不足。举例来说,上一代语言模型无法根据一组关键词写出一封电子邮件,而这对当代 LLM 来说已经是很平常的任务。
LLM 具有理解、生成和解释人类语言的显著能力。不过需要澄清的是,当我们说语言模型“理解”时,意思是它们能够以看起来连贯且与上下文相关的方式处理和生成文本,而不是说它们拥有类似人类的意识或理解力。
得益于深度学习的发展,LLM 能够在海量文本数据上训练。深度学习是机器学习和人工智能(AI)的一个子领域,重点研究神经网络。与过去的方法相比,这使 LLM 能够捕捉人类语言中更深层的上下文信息和细微差别。因此,LLM 在广泛的 NLP 任务上显著提升了性能,包括文本翻译、情感分析、问答等。
当代 LLM 与早期 NLP 模型之间还有一个重要区别:早期 NLP 模型通常是为特定任务设计的,例如文本分类、语言翻译等。那些早期模型在狭窄应用中表现出色,而 LLM 则在范围更广的 NLP 任务上展示出更通用的能力。
LLM 的成功可以归因于许多 LLM 所依赖的 Transformer 架构,以及用于训练 LLM 的海量数据。这些数据让模型能够捕捉丰富的语言细微差别、上下文和模式,而这些内容很难手工编码。
这种转向基于 Transformer 架构实现模型、并使用大规模训练数据训练 LLM 的变化,已经从根本上改变了 NLP,为理解和交互人类语言提供了能力更强的工具。
从本章开始,我们将为本书的主要目标打下基础:通过一步步用代码实现一个类似 ChatGPT、基于 Transformer 架构的 LLM,来理解 LLM。
1.1 什么是 LLM?
LLM,即大型语言模型,是一种被设计用来理解、生成并回应类人文本的神经网络。这类模型是深度神经网络,在海量文本数据上训练;有时,其训练数据会覆盖互联网上公开可得文本的很大一部分。
大型语言模型中的“大型”既指模型参数规模,也指它所用训练数据集的巨大规模。这类模型往往拥有数百亿甚至数千亿参数。参数是网络中可调节的权重,会在训练过程中被优化,用来预测序列中的下一个词。预测下一个词是合理的,因为它利用了语言天然的序列性,让模型学习文本中的上下文、结构和关系。然而,这个任务本身又非常简单,因此它竟然能产生如此强大的模型,常常让许多研究者感到惊讶。后续章节会一步步讨论并实现这种下一个词预测训练过程。
LLM 使用一种称为 Transformer 的架构(第 1.4 节会更详细介绍)。这种架构让模型在做预测时能够选择性地关注输入中的不同部分,因此特别擅长处理人类语言中的细微差异和复杂性。
由于 LLM 能够生成文本,它们也常被称为生成式人工智能(generative artificial intelligence),通常简称为生成式 AI 或 GenAI。如图 1.1 所示,AI 是更广泛的领域,目标是创造能够执行需要类人智能的任务的机器,包括理解语言、识别模式和做出决策;其中包括机器学习和深度学习等子领域。
用于实现 AI 的算法,是机器学习领域的重点。具体来说,机器学习涉及开发算法,使其能够从数据中学习,并在没有被显式编程的情况下基于数据做出预测或决策。为说明这一点,可以把垃圾邮件过滤器想象成机器学习的一个实际应用。我们不需要手工写规则来识别垃圾邮件,而是向机器学习算法提供一些被标注为垃圾邮件和正常邮件的样例。模型通过最小化自己在训练数据集上的预测误差,学习识别表明垃圾邮件的模式和特征,从而能够把新邮件分类为垃圾邮件或正常邮件。
如图 1.1 所示,深度学习是机器学习的一个子集,它专注于使用三层或更多层的神经网络(也称为深度神经网络)来建模数据中的复杂模式和抽象。与深度学习相比,传统机器学习需要手工特征提取。这意味着人类专家需要为模型识别和选择最相关的特征。
如今 AI 领域由机器学习和深度学习主导,但它也包括其他方法,例如基于规则的系统、遗传算法、专家系统、模糊逻辑或符号推理。
回到垃圾邮件分类的例子。在传统机器学习中,人类专家可能会从邮件文本中手工提取特征,例如某些触发词(“prize”“win”“free”)出现的频率、感叹号数量、全大写单词的使用、是否存在可疑链接等。然后,用基于这些专家定义特征创建的数据集训练模型。与传统机器学习不同,深度学习不需要手工特征提取。这意味着人类专家不必为深度学习模型识别和选择最相关的特征。(不过,无论是传统机器学习还是用于垃圾邮件分类的深度学习,仍然需要收集标签,例如垃圾邮件或非垃圾邮件;这些标签需要由专家或用户收集。)
接下来的几节会介绍 LLM 今天能够解决的一些问题、LLM 所应对的挑战,以及本书将实现的通用 LLM 架构。
1.2 LLM 的应用
由于 LLM 具备解析并理解非结构化文本数据的高级能力,它们在多个领域都有广泛应用。今天,LLM 被用于机器翻译、新文本生成(见图 1.2)、情感分析、文本摘要等许多任务。近来,LLM 也被用于内容创作,例如写小说、写文章,甚至编写计算机代码。
LLM 也可以驱动复杂的聊天机器人和虚拟助手,例如 OpenAI 的 ChatGPT 或 Google 的 Gemini(原名 Bard)。它们可以回答用户查询,并增强 Google Search 或 Microsoft Bing 等传统搜索引擎。
此外,LLM 可用于从医学或法律等专业领域的大量文本中进行有效的知识检索。这包括筛选文档、总结长篇段落以及回答技术问题。
简而言之,LLM 对于自动化几乎任何涉及解析和生成文本的任务都极有价值。它们的应用几乎没有尽头。随着我们继续创新并探索这些模型的新用法,显然,LLM 有潜力重新定义我们与技术的关系,使其更加对话化、直观且易于访问。
本书将重点从底层理解 LLM 如何工作,并编写一个能够生成文本的 LLM。我们还会学习让 LLM 执行查询的技术,其范围从回答问题到总结文本、把文本翻译成不同语言等等。换句话说,在本书中,我们会通过一步步构建一个复杂的 LLM 助手,来理解 ChatGPT 这样的系统如何工作。
1.3 构建与使用 LLM 的阶段
为什么要构建自己的 LLM?从零编写 LLM 是理解其机制和限制的绝佳练习。同时,它也让我们获得所需知识,以便把已有的开源 LLM 架构预训练或微调到我们自己的领域特定数据集或任务上。
研究表明,在建模性能方面,定制构建的 LLM,也就是为特定任务或领域定制的模型,可能优于像 ChatGPT 所提供的那类通用 LLM,因为后者被设计用于广泛应用。例子包括专门面向金融领域的 BloombergGPT,以及面向医学问答定制的 LLM(更多细节见附录 B 的进一步阅读和参考资料部分)。
使用定制 LLM 有若干优势,尤其是在数据隐私方面。例如,出于保密考虑,公司可能不希望把敏感数据分享给 OpenAI 这样的第三方 LLM 提供商。此外,开发定制 LLM 还可以让模型直接部署在客户设备上,例如笔记本电脑和智能手机;Apple 等公司目前就在探索这件事。这种本地实现能够显著降低延迟并减少服务器相关成本。除此之外,定制 LLM 也给予开发者完整自主权,使其能够按需控制模型更新和修改。
创建 LLM 的一般流程包括预训练和微调。“预训练”(pretraining)中的“预”指初始阶段:像 LLM 这样的模型会在大而多样的数据集上训练,以形成对语言的广泛理解。这个预训练模型随后作为基础资源,可以通过微调进一步精炼。微调是指在一个范围更窄、且更面向特定任务或领域的数据集上专门训练模型。由预训练和微调组成的两阶段训练方法如图 1.3 所示。
如图 1.3 所示,创建 LLM 的第一步是在大型文本数据语料上训练它,这类数据有时也称为原始文本。这里的“原始”是指这些数据只是普通文本,不包含任何标签信息[1]。(可以应用过滤,例如移除格式字符或未知语言文档。)
LLM 的第一个训练阶段也称为预训练,它会创建一个初始的预训练 LLM,通常称为基座模型或基础模型。GPT-3 模型就是这类模型的典型例子,它是 ChatGPT 最初所提供模型的前身。该模型能够进行文本补全,也就是补完用户给出的半句话。它还具有有限的 few-shot 能力,也就是说,它可以只根据少量示例学习执行新任务,而不需要大量训练数据。下一节“Transformer 架构简介”会进一步说明这一点。
在用大规模文本数据集训练得到预训练 LLM 之后,也就是让 LLM 学习预测文本中的下一个词之后,我们可以继续在带标签数据上训练 LLM,这也称为微调。
LLM 微调中最流行的两类是指令微调和分类任务微调。在指令微调中,带标签数据集由指令和答案对组成,例如一个翻译文本的查询,以及与之配套的正确译文。在分类微调中,带标签数据集由文本及其对应类别标签组成,例如带有垃圾邮件和非垃圾邮件标签的邮件。
本书会覆盖预训练和微调 LLM 的代码实现。在预训练一个基础 LLM 之后,我们还会进一步深入了解指令微调和分类微调的具体细节。
1.4 Transformer 架构简介
大多数现代 LLM 都依赖 Transformer 架构。这是一种深度神经网络架构,最早由 2017 年论文 Attention Is All You Need 提出。为了理解 LLM,我们需要先简要回顾原始 Transformer。它最初是为机器翻译开发的,用于把英文文本翻译成德文和法文。图 1.4 展示了一个简化版 Transformer 架构。
图 1.4 所示的 Transformer 架构由两个子模块组成:编码器和解码器。编码器模块处理输入文本,并把它编码为一系列数值表示或向量,这些表示捕捉输入的上下文信息。随后,解码器模块接收这些编码向量,并由此生成输出文本。例如在翻译任务中,编码器会把源语言文本编码为向量,而解码器会解码这些向量,生成目标语言文本。编码器和解码器都由许多层组成,这些层通过所谓的自注意力机制连接起来。你可能会对输入如何预处理和编码有许多问题,这些问题会在后续章节的逐步实现中得到解答。
Transformer 和 LLM 的关键组件是自注意力机制(图中未显示)。它让模型能够衡量一个序列中不同词或词元相对于彼此的重要性。这个机制使模型能够捕捉输入数据中的长距离依赖和上下文关系,从而增强生成连贯且上下文相关输出的能力。不过,由于它较复杂,我们会把解释推迟到第 3 章,在那里逐步讨论并实现它。此外,我们还会在第 2 章“处理文本数据”中讨论并实现用于创建模型输入的数据预处理步骤。
Transformer 架构的后续变体,例如所谓的 BERT(bidirectional encoder representations from transformers,来自 Transformer 的双向编码器表示)以及各种 GPT 模型(generative pretrained transformers,生成式预训练 Transformer),都是基于这一概念发展而来,并把这种架构适配到不同任务上。(参考文献见附录 B。)
BERT 建立在原始 Transformer 的编码器子模块之上,它与 GPT 的训练方式不同。GPT 为生成任务而设计;BERT 及其变体则专门用于掩码词预测,也就是让模型预测给定句子中被遮蔽或隐藏的词,如图 1.5 所示。这种独特训练策略赋予 BERT 在文本分类任务上的优势,包括情感预测和文档分类。作为其能力的一个应用,截至本书写作时,Twitter 使用 BERT 来检测有毒内容。
另一方面,GPT 关注原始 Transformer 架构中的解码器部分,面向需要生成文本的任务而设计。这包括机器翻译、文本摘要、小说写作、编写计算机代码等等。我们会在本章后续部分更详细地讨论 GPT 架构,并在本书中从零实现它。
GPT 模型主要被设计和训练来执行文本补全任务,但它们也显示出显著的多功能性。这些模型擅长执行 zero-shot 和 few-shot 学习任务。Zero-shot 学习指的是在没有任何先前特定示例的情况下,泛化到完全未见过任务的能力。Few-shot 学习则是从用户作为输入提供的极少数示例中学习,如图 1.6 所示。
1.5 利用大规模数据集
流行的 GPT 类和 BERT 类模型所用的大规模训练数据集,是多样而全面的文本语料,包含数十亿词,覆盖广泛主题以及自然语言和计算机语言。为给出一个具体例子,表 1.1 总结了用于预训练 GPT-3 的数据集。GPT-3 是 ChatGPT 第一版所用模型的基础模型。
| 数据集名称 | 数据集描述 | 词元数量 | 训练数据占比 |
|---|---|---|---|
| CommonCrawl(过滤后) | 网页抓取数据 | 4100 亿 | 60% |
| WebText2 | 网页抓取数据 | 190 亿 | 22% |
| Books1 | 基于互联网的图书语料 | 120 亿 | 8% |
| Books2 | 基于互联网的图书语料 | 550 亿 | 8% |
| Wikipedia | 高质量文本 | 30 亿 | 3% |
表 1.1 报告的是词元数量。词元是模型读取的文本单位;一个数据集中的词元数量,大致相当于文本中的词和标点符号数量。下一章会更详细介绍词元化,也就是把文本转换为词元的过程。
这里的主要结论是:训练数据集的规模和多样性,让这些模型能够在多种任务上表现良好,包括语言句法、语义、上下文,甚至一些需要一般知识的任务。
这些模型的预训练性质,使它们在进一步针对下游任务微调时极其灵活,这也是它们又被称为基座模型或基础模型的原因。预训练 LLM 需要大量资源,成本非常高。例如,据估计,GPT-3 的预训练成本按云计算积分计算为 460 万美元[2]。
好消息是,许多作为开源模型提供的预训练 LLM,可以作为通用工具,用于编写、抽取和编辑训练数据之外的文本。此外,LLM 可以用相对较小的数据集针对特定任务微调,从而降低所需计算资源,并提升特定任务上的性能。
本书将实现预训练代码,并用它出于教学目的预训练一个 LLM。所有计算都可以在消费级硬件上执行。在实现预训练代码之后,我们会学习如何复用公开可用的模型权重,并将其加载到我们将实现的架构中。这样,当我们在本书后续部分微调 LLM 时,就可以跳过昂贵的预训练阶段。
1.6 更仔细地观察 GPT 架构
本章前面提到过 GPT 类模型、GPT-3 和 ChatGPT。现在让我们更仔细地看一下通用 GPT 架构。首先,GPT 代表 Generative Pretrained Transformer,最早由下面这篇论文提出:
Improving Language Understanding by Generative Pre-Training(2018),OpenAI 的 Radford 等人,http://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf
GPT-3 是这个模型的放大版本,拥有更多参数,并在更大的数据集上训练。ChatGPT 最初提供的模型,是通过使用 OpenAI InstructGPT 论文中的方法,在大型指令数据集上微调 GPT-3 得到的。我们会在第 7 章“基于人类反馈进行微调以遵循指令”中更详细地介绍这一点。正如前面图 1.6 所示,这些模型是有能力的文本补全模型,也能执行其他任务,例如拼写纠错、分类或语言翻译。考虑到 GPT 模型是在相对简单的下一个词预测任务上预训练的,这一点实际上非常了不起,如图 1.7 所示。
下一个词预测任务是一种自监督学习形式,也是一种自标注形式。这意味着我们不需要显式收集训练数据标签,而是可以利用数据本身的结构:我们可以把句子或文档中的下一个词作为模型应该预测的标签。由于这个下一个词预测任务允许我们“即时”创建标签,所以可以利用前面第 1.5 节“利用大规模数据集”所讨论的大规模无标签文本数据集来训练 LLM。
与第 1.4 节介绍的原始 Transformer 架构相比,通用 GPT 架构相对简单。本质上,它只是没有编码器的解码器部分,如图 1.8 所示。由于 GPT 这样的解码器式模型通过一次预测一个词来生成文本,它们被认为是一类自回归模型。自回归模型会把先前输出作为未来预测的输入。因此,在 GPT 中,每个新词都是基于它之前的序列选择的,这提升了生成文本的连贯性。
GPT-3 这样的架构也显著大于原始 Transformer 模型。例如,原始 Transformer 将编码器和解码器块各重复 6 次。GPT-3 则有 96 层 Transformer 层,总参数量为 1750 亿。
GPT-3 于 2020 年提出。按照深度学习和大型语言模型(LLM)发展的标准,这已经算是相当久以前了。不过,更新的架构,例如 Meta 的 Llama 模型,仍然基于相同的底层概念,只引入了较小修改。因此,理解 GPT 依然和以往一样重要。本书会聚焦于实现 GPT 背后的代表性架构,同时指出其他 LLM 所采用的一些具体调整。
最后,值得注意的是,原始 Transformer 模型由编码器块和解码器块组成,是明确为语言翻译设计的;而 GPT 模型尽管采用更大但更简单的仅解码器架构,并以预测下一个词为目标,却也能够执行翻译任务。这种能力最初出乎研究者意料,因为它来自一个主要在下一个词预测任务上训练的模型,而这个任务并没有专门针对翻译。
模型能够执行其并未被显式训练去执行的任务,这种能力称为“涌现行为”。它并不是在训练中被明确教授的,而是模型接触大量多语言、多上下文数据后的自然结果。GPT 模型能够“学习”语言之间的翻译模式并执行翻译任务,尽管它并没有专门为此训练,这展示了这些大规模生成式语言模型的优势和能力。我们可以在不为每类任务使用不同模型的情况下执行多样任务。
1.7 构建大型语言模型
在本章中,我们为理解 LLM 打下了基础。在本书余下部分,我们将从零用代码实现一个 LLM。我们会把 GPT 背后的基本思想作为蓝图,并按照图 1.9 所示的三个阶段来完成。
首先,我们会学习基本的数据预处理步骤,并编写每个 LLM 核心中的注意力机制。
接着,在第 2 阶段,我们会学习如何编写并预训练一个类似 GPT 的 LLM,使其能够生成新文本。我们还会了解评估 LLM 的基础知识,这对于开发有能力的 NLP 系统非常关键。
需要注意,从零预训练一个 LLM 是一项重大工程;对于 GPT 类模型,它需要数千到数百万美元的计算成本。因此,第 2 阶段的重点,是使用小数据集实现教学目的的训练。此外,本书也会提供加载公开可用模型权重的代码示例。
最后,在第 3 阶段,我们会拿一个预训练 LLM,对其进行微调,使其能够遵循指令,例如回答查询或分类文本。这些是许多真实应用和研究中最常见的任务。
希望你已经期待开启这段令人兴奋的旅程!
1.8 小结
- LLM 已经改变了自然语言处理领域。此前,该领域主要依赖显式的基于规则系统和较简单的统计方法。LLM 的出现引入了由深度学习驱动的新方法,推动了人类语言理解、生成和翻译方面的进展。
- 现代 LLM 主要分两步训练。首先,它们在大型无标签文本语料上预训练,使用句子中下一个词的预测作为“标签”。然后,它们在较小的带标签目标数据集上微调,以遵循指令或执行分类任务。
- LLM 基于 Transformer 架构。Transformer 架构的关键思想是注意力机制:当模型一次生成一个词时,它让 LLM 能够选择性访问整个输入序列。
- 原始 Transformer 架构由用于解析文本的编码器和用于生成文本的解码器组成。
- 用于生成文本并遵循指令的 LLM,例如 GPT-3 和 ChatGPT,只实现了解码器模块,从而简化了架构。
- 由数十亿词组成的大规模数据集对于预训练 LLM 至关重要。本书会出于教学目的在小数据集上实现并训练 LLM,同时也会展示如何加载公开可用的模型权重。
- 虽然 GPT 类模型的一般预训练任务是预测句子中的下一个词,但这些 LLM 展现出“涌现”性质,例如分类、翻译或总结文本的能力。
- 一旦 LLM 完成预训练,由此得到的基础模型就可以更高效地针对各种下游任务进行微调。
- 在自定义数据集上微调的 LLM,在特定任务上可能优于通用 LLM。
[1] 有机器学习背景的读者可能会注意到,传统机器学习模型以及通过常规监督学习范式训练的深度神经网络,通常需要标签信息。然而,LLM 的预训练阶段并非如此。在这个阶段,LLM 利用自监督学习:模型从输入数据中生成自己的标签。本章后面会介绍这个概念。
[2] GPT-3, The $4,600,000 Language Model, https://www.reddit.com/r/MachineLearning/comments/h0jwoz/d_gpt3_the_4600000_language_model/
章节范围:原 PDF 物理第 5-21 页(书内页码 1-17)。图片从同一页段抽取并嵌入本文。