本篇学习目标
上一篇我们了解了 LLM 的基本概念、应用场景以及预训练+微调的两阶段训练范式。本篇将深入 LLM 的底层架构和具体实现细节:
- 原始 Transformer 架构(编码器+解码器)
- BERT vs GPT:两条技术路线的分化
- 零样本与少样本学习
- GPT-3 的训练数据规模和成本
- GPT 架构详解:自监督学习、自回归模型、涌现能力
- 全书三阶段路线图
1.4 使用 LLM 执行不同任务
原始 Transformer 架构(2017)
大多数现代 LLM 依赖于 Transformer 架构 ,这是一种在 2017 年论文《Attention Is All You Need 》中引入的深度神经网络架构。要理解 LLM,我们需要简要回顾一下最初为机器翻译(将英文文本翻译为德文和法文)而开发的原始 Transformer。
原始 Transformer 架构的简化示意图。它是一种用于语言翻译的深度学习模型。Transformer 由两部分组成: 编码器(encoder) 处理输入文本并产生文本的嵌入表示(一种在不同维度中捕获多种不同因素的数值表示),解码器(decoder) 可以利用这个表示逐词生成翻译文本。注意,图中展示的是翻译过程的最后阶段,解码器只需要生成最后一个词("Beispiel"),给定原始输入文本("This is an example")和部分翻译的句子("Das ist ein"),以完成翻译。
编码器和解码器
Transformer 架构由两个子模块组成:
- 编码器模块 :处理输入文本并将其编码为一系列数值表示或向量,这些向量捕获输入的上下文信息。
- 解码器模块:接收这些编码向量并从中生成输出文本。
在翻译任务中,编码器会将源语言的文本编码为向量,解码器会将这些向量解码以生成目标语言的文本。编码器和解码器都由许多层 组成,通过所谓的 自注意力机制(self-attention mechanism) 连接。关于输入如何被预处理和编码,这些将在后续章节中通过逐步实现来解答。
自注意力机制
Transformer 和 LLM 的一个关键组件是自注意力机制 (图中未显示),它允许模型权衡序列中不同词或 token 相对于彼此的重要性 。这个机制使模型能够捕获输入数据中的长距离依赖关系和上下文关系 ,增强其生成连贯且与上下文相关的输出的能力。由于其复杂性,我们将在第3章 中逐步讨论和实现它。此外,我们还将在第2章(处理文本数据)中讨论和实现创建模型输入的数据预处理步骤。
BERT vs GPT:两条技术路线
Transformer 架构的后续变体,如 BERT (bidirectional encoder representations from transformers,双向编码器表示来自 Transformer)和各种 GPT 模型(generative pretrained transformers,生成式预训练 Transformer),在原始概念上进行构建,以适应不同任务的架构。(参考文献可在附录 B 中找到。)
BERT 建立在原始 Transformer 的编码器子模块 之上,其训练方法与 GPT 不同。GPT 为生成任务设计,而 BERT 及其变体专注于掩码词预测(masked word prediction)------模型预测给定句子中被掩盖或隐藏的词。
Transformer 编码器和解码器子模块的视觉表示。左侧,编码器部分示例展示了类 BERT 的 LLM,专注于掩码词预测,主要用于文本分类等任务。右侧,解码器部分展示了类 GPT 的 LLM,为生成任务设计,产生连贯的文本序列。
这种独特的训练策略使 BERT 在文本分类任务 中具有优势,包括情感预测和文档分类。作为其能力的应用,截至撰写时,Twitter 使用 BERT 来检测有害内容。
GPT 另一方面专注于原始 Transformer 架构的解码器部分 ,为需要生成文本的任务设计。这包括机器翻译、文本摘要、小说写作、编写计算机代码等等。我们将在本章的其余部分更详细地讨论 GPT 架构,并在本书中从零实现它。
零样本与少样本学习
GPT 模型虽然主要为执行文本补全任务 而设计和训练,但也展现出了其能力的显著多面性。这些模型擅长执行**零样本(zero-shot)和少样本(few-shot)**学习任务:
- 零样本学习:指在没有任何先前具体示例的情况下,泛化到完全未见过的任务的能力。
- 少样本学习 :涉及从用户提供的最少数量的示例作为输入中学习。
除了文本补全之外,类 GPT 的 LLM 可以根据其输入解决各种任务,无需重新训练、微调或任务特定的模型架构更改。有时,在输入中提供目标的示例是有帮助的,这被称为少样本设置。然而,类 GPT 的 LLM 也能够在没有具体示例的情况下执行任务,这被称为零样本设置。
Transformer vs LLM:重要辨析
当今的 LLM 基于前面介绍的 Transformer 架构。因此,Transformer 和 LLM 是文献中经常同义使用的术语。然而,需要注意:
- 并非所有 Transformer 都是 LLM :Transformer 也可以用于计算机视觉。
- 并非所有 LLM 都是 Transformer :存在基于循环架构和卷积架构的大语言模型。
这些替代方法的主要动机是提高 LLM 的计算效率。然而,这些替代 LLM 架构能否与基于 Transformer 的 LLM 的能力竞争,以及它们是否会被实际采用,仍有待观察。(感兴趣的读者可以在本章末尾的扩展阅读部分找到描述这些架构的文献参考。)
1.5 利用大规模数据集
流行的 GPT 和 BERT 类模型的大型训练数据集代表了多样化且全面的文本语料库,包含数十亿个词,涵盖大量主题以及自然语言和编程语言。
GPT-3 的训练数据(Table 1.1)
为了提供一个具体的例子,Table 1.1 总结了用于预训练 GPT-3 的数据集(GPT-3 是第一版 ChatGPT 的基础模型):
| 数据集名称 | 数据集描述 | Token 数量 | 在训练数据中的占比 |
|---|---|---|---|
| CommonCrawl(过滤后) | 网页爬取数据 | 4100 亿 | 60% |
| WebText2 | 网页爬取数据 | 190 亿 | 22% |
| Books1 | 基于互联网的图书语料库 | 120 亿 | 8% |
| Books2 | 基于互联网的图书语料库 | 550 亿 | 8% |
| Wikipedia | 高质量文本 | 30 亿 | 3% |
Table 1.1 报告的是 token 数量,其中 token 是模型读取的一个文本单元,数据集中的 token 数量大致等同于文本中的词和标点符号的数量 。我们将在下一章中更详细地介绍将文本转换为 token 的过程------分词(tokenization)。
主要启示是:训练数据集的规模和多样性使得这些模型能够在各种任务上表现良好,包括语言语法、语义、上下文,甚至一些需要常识知识的任务。
GPT-3 数据集的详细说明
关于 Table 1.1,有几个重要的细节值得注意:
采样策略 :并非每个数据集中的所有数据都被使用。实际上从所有数据集中总共只抽取了3000 亿个 token 用于训练过程。这种采样方法意味着训练并没有涵盖每个数据集中的每一条数据。而是利用了从所有数据集中抽取的 3000 亿 token 的子集。虽然某些数据集在这个子集中没有被完全覆盖,但其他数据集可能被多次包含以达到 3000 亿 token 的总数。表中表示占比的列在不考虑舍入误差的情况下总和为这些采样数据的 100%。
存储规模参考 :仅 CommonCrawl 数据集就包含 4100 亿个 token,需要约 570 GB 的存储空间。
后续模型的数据扩展 :GPT-3 的后续版本,如 Meta 的 LLaMA,扩展了训练范围以包括额外的数据源,如 Arxiv 研究论文 (92 GB)和 StackExchange 的代码相关问答(78 GB)。
数据集来源详解:
- Wikipedia 语料库:由英文维基百科组成
- Books1:可能是 Project Gutenberg(https://www.gutenberg.org/)的样本
- Books2:可能来自 Libgen(https://en.wikipedia.org/wiki/Library_Genesis)
- CommonCrawl:CommonCrawl 数据库(https://commoncrawl.org/)的过滤子集
- WebText2:来自所有获得 3+ 赞的 Reddit 帖子的外部链接网页文本
公开替代数据集 :GPT-3 论文的作者没有共享训练数据集,但一个可比较的公开可用数据集是 The Pile(https://pile.eleuther.ai/)。然而,该集合可能包含受版权保护的作品,具体使用条款可能取决于预期用途和国家/地区。
预训练的价值与成本
这些模型的预训练特性使它们在下游任务的微调上具有极大的灵活性,这也是它们被称为基座模型或基础模型的原因。预训练 LLM 需要大量资源且非常昂贵。例如,GPT-3 的预训练成本估计为云计算积分方面的 460 万美元。
注释 [2]:GPT-3, The $4,600,000 Language Model
好消息是,许多预训练 LLM 作为开源模型 提供,可以作为通用工具来编写、提取和编辑不在训练数据中的文本。此外,LLM 可以在相对较小的数据集上针对特定任务进行微调,减少所需的计算资源并提高特定任务上的性能。
本书的做法 :我们将实现预训练代码,并出于教育目的用它来预训练一个 LLM。所有计算都将能在消费级硬件上执行。在实现预训练代码后,我们将学习如何重用公开可用的模型权重并将其加载到我们将实现的架构中,这样当我们在本书后面微调 LLM 时,就可以跳过昂贵的预训练阶段。
1.6 深入了解 GPT 架构
GPT 的全称和起源
首先,GPT 代表 Generative Pretrained Transformer(生成式预训练 Transformer),最初在以下论文中引入:
Improving Language Understanding by Generative Pre-Training (2018),作者:Radford et al.,来自 OpenAI
GPT → GPT-3 → ChatGPT 的演化链
- GPT-3 是该模型的放大版本,拥有更多参数且在更大的数据集上训练。
- ChatGPT 中最初提供的模型是通过使用 OpenAI 的 InstructGPT 论文中的方法,在大型指令数据集上对 GPT-3 进行微调而创建的。
正如我们之前所见,这些模型是称职的文本补全模型,并且可以执行其他任务,如拼写纠正、分类或语言翻译。这实际上非常了不起,因为 GPT 模型是在相对简单的下一词预测任务上预训练的。
在 GPT 模型的下一词预训练任务中,系统通过查看之前出现的词来学习预测句子中即将出现的词。这种方法帮助模型理解词和短语通常如何在语言中组合在一起,形成了可以应用于各种其他任务的基础。
自监督学习详解
下一词预测任务是自监督学习(self-supervised learning)的一种形式,也是一种自标注形式。这意味着我们不需要显式收集训练数据的标签,而是可以利用数据本身的结构:我们可以使用句子或文档中的下一个词作为模型应该预测的标签。由于这种下一词预测任务允许我们"即时"创建标签,因此可以利用大规模的未标注文本数据集来训练 LLM。
GPT = 仅解码器的自回归模型
与我们在 1.4 节中介绍的原始 Transformer 架构相比,通用 GPT 架构相对简单。从本质上讲,它只是没有编码器的解码器部分。
GPT 架构仅采用原始 Transformer 的解码器部分。它设计用于单向的、从左到右的处理,使其非常适合文本生成和下一词预测任务,以迭代方式逐词生成文本。
由于解码器风格的模型(如 GPT)通过逐词预测文本来生成文本,它们被认为是一种自回归模型(autoregressive model) 。自回归模型将之前的输出作为未来预测的输入。因此,在 GPT 中,每个新词都是基于前面的序列来选择的,这提高了生成文本的连贯性。
GPT-3 的规模
GPT-3 这样的架构比原始 Transformer 模型大得多。原始 Transformer 将编码器和解码器块各重复 6 次 。GPT-3 则有 96 个 Transformer 层 和总共 1750 亿个参数。
GPT 架构的持续相关性
GPT-3 于 2020 年引入,按照深度学习和 LLM 发展的标准来看,这被认为是很久以前的事了。然而,更近期的架构,如 Meta 的 Llama 模型 ,仍然基于相同的底层概念,仅引入了少量修改。因此,理解 GPT 仍然一如既往地相关,本书专注于实现 GPT 背后的突出架构,同时提供指向替代 LLM 所采用的特定调整的指引。
涌现能力(Emergent Behavior)
最后,有一个有趣的观察值得注意:虽然原始 Transformer 模型是明确为语言翻译而设计的,但 GPT 模型------尽管其更大但更简单的架构旨在进行下一词预测------也能够执行翻译任务。这种能力最初让研究人员感到意外,因为它出现在一个主要为下一词预测任务训练的模型中,而这个任务并没有专门针对翻译。
执行模型未被明确训练过的任务 的能力被称为**"涌现行为"(emergent behavior)。这种能力不是在训练过程中明确教授的,而是作为模型在多样化上下文中接触大量多语言数据的 自然结果**而涌现出来的。GPT 模型可以在不同语言之间"学习"翻译模式并执行翻译任务,尽管它们并没有为此专门训练------这一事实证明了这些大规模生成语言模型的能力。我们可以使用一个模型执行多种多样的任务,而不需要为每个任务使用不同的模型。
1.7 构建大语言模型的路线图
在本章中,我们为理解 LLM 奠定了基础。在本书的其余部分,我们将从头开始编写一个。我们将以 GPT 背后的基本思想作为蓝图,按三个阶段来完成。
本书涵盖的构建 LLM 的各阶段包括:实现 LLM 架构和数据准备过程、预训练 LLM 以创建基础模型、以及微调基础模型使其成为个人助手或文本分类器。
Stage 1:数据预处理 + 注意力机制
首先,我们将学习基本的数据预处理步骤 ,并编码每个 LLM 核心的注意力机制。
Stage 2:编码和预训练 GPT
接下来,我们将学习如何编码和预训练一个能够生成新文本的类 GPT 的 LLM。我们还将了解评估 LLM 的基础知识,这对于开发有能力的 NLP 系统至关重要。
注意,从头预训练一个大型 LLM 是一项重大工程,对于 GPT 类模型来说需要数千到数百万美元的计算成本。因此,Stage 2 的重点是使用小数据集 来实现训练以用于教育目的。此外,本书还将提供加载公开可用模型权重的代码示例。
Stage 3:微调
最后,我们将取一个预训练的 LLM 并对其进行微调,使其能够遵循指令,例如回答查询或分类文本------这是许多实际应用和研究中最常见的任务。
1.8 总结
-
LLM 改变了 NLP 领域,之前主要依赖于显式的基于规则的系统和更简单的统计方法。LLM 的出现引入了新的深度学习驱动方法,带来了理解、生成和翻译人类语言方面的进步。
-
现代 LLM 的两步训练:首先,在大型无标签文本语料库上预训练,使用句子中下一个词的预测作为"标签"。然后,在较小的标注目标数据集上微调,以遵循指令或执行分类任务。
-
LLM 基于 Transformer 架构。关键思想是注意力机制,它在逐词生成输出时为 LLM 提供对整个输入序列的选择性访问。
-
原始 Transformer 架构由用于解析文本的编码器 和用于生成文本的解码器组成。
-
用于生成文本和遵循指令的 LLM(如 GPT-3 和 ChatGPT)只实现了解码器模块,简化了架构。
-
由数十亿词组成的大型数据集对于预训练 LLM 是必不可少的。在本书中,我们将在小数据集上实现和训练 LLM 以用于教育目的,同时也会了解如何加载公开可用的模型权重。
-
虽然 GPT 类模型的通用预训练任务是预测句子中的下一个词,但这些 LLM 展现出**"涌现"属性**,如分类、翻译或摘要文本的能力。
-
一旦 LLM 预训练完成,得到的基础模型可以更高效地针对各种下游任务进行微调。
-
在自定义数据集上微调的 LLM 可以在特定任务上超越通用 LLM。
预习思考
可以思考以下问题:
- GPT 只有解码器没有编码器,那翻译任务的"源语言编码"是如何实现的? 提示:自回归模型将整个输入(包括提示词和部分翻译)作为上下文。
- 为什么 GPT 的涌现能力让研究者感到意外? 提示:模型只被训练做一件事(预测下一词),却"学会"了许多从未被明确教授的技能。
- GPT-3 使用了 3000 亿 token 训练,但 CommonCrawl 就有 4100 亿 token。为什么不全部用上? 提示:考虑数据质量、计算预算和过拟合风险。
- 为什么理解 GPT 架构在 2020 年代中期仍然"一如既往地相关"? 提示:Llama 等最新模型仍基于同一核心概念。