1理解大型语言模型
本章涵盖
大型语言模型背后的基本概念的高级解释(LLMs)
从中衍生出LLMs的变压器架构的见解
从零开始建造一个LLM的计划
大型语言模型(LLMs),例如 OpenAI 的 ChatGPT,是近年来开发的深度神经网络模型。它们为自然语言处理(NLP)开辟了一个新纪元。在LLMs出现之前,传统方法在电子邮件垃圾分类和可以通过手工规则或简单模型捕捉的简单模式识别等分类任务中表现出色。然而,它们在需要复杂理解和生成能力的语言任务中通常表现不佳,例如解析详细指令、进行上下文分析以及创建连贯且符合上下文的原创文本。例如,之前的语言模型无法根据一系列关键词撰写电子邮件,而这是当代LLMs的微不足道之事。
1.1 什么是LLM?
生成性人工智能或生成 AI
图 1.1
1.2 LLMs 的应用
图 1.2
1.3 构建和使用 LLMs 的阶段
注意
使用定制的 LLMs 具有多个优势,特别是在数据隐私方面。例如,由于保密问题,公司可能更倾向于不与第三方 LLM 提供商(如 OpenAI)共享敏感数据。此外,开发较小的定制 LLMs 可以直接在客户设备上部署,例如笔记本电脑和智能手机,这正是像苹果这样的公司目前正在探索的方向。这种本地实施可以显著降低延迟并减少与服务器相关的成本。此外,定制 LLMs 赋予开发者完全的自主权,使他们能够根据需要控制模型的更新和修改。
创建一个LLM的一般过程包括预训练和微调。“预训练”中的“预”指的是初始阶段,在这个阶段,像LLM这样的模型在一个大型、多样化的数据集上进行训练,以发展对语言的广泛理解。这个预训练的模型随后作为一个基础资源,可以通过微调进一步优化,微调是一个过程,在这个过程中,模型在一个更狭窄的数据集上进行特定训练,这个数据集更具体于特定的任务或领域。这种由预训练和微调组成的两阶段训练方法在图 1.3 中进行了描述。
图 1.3
注意
一个典型的此类模型的例子是 GPT-3 模型(ChatGPT 中提供的原始模型的前身)。该模型能够进行文本补全——即完成用户提供的半写好的句子。它还具有有限的少量学习能力,这意味着它可以根据仅有的几个示例学习执行新任务,而不需要大量的训练数据。LLM的第一阶段训练也被称为预训练,创建一个初始的预训练LLM,通常称为基础或基础模型。
指令微调和分类微调
1.4
变压器 https://arxiv.org/abs/1706.03762
图 1.4 原始变换器架构的简化示意图,这是一个用于语言翻译的深度学习模型。变换器由两个部分组成:(a) 编码器处理输入文本并生成文本的嵌入表示(捕捉不同维度中许多不同因素的数值表示),(b) 解码器可以利用这些嵌入表示逐字生成翻译文本。该图显示了翻译过程的最后阶段,在这一阶段,解码器需要根据原始输入文本(“这是一个例子”)和部分翻译句子(“这是一个”)生成最后一个单词(“Beispiel”),以完成翻译。
变压器架构由两个子模块组成:编码器和解码器。编码器模块处理输入文本,并将其编码为一系列数值表示或向量,这些向量捕捉输入的上下文信息。然后,解码器模块接收这些编码向量并生成输出文本。在翻译任务中,例如,编码器会将源语言的文本编码为向量,而解码器会解码这些向量以生成目标语言的文本。编码器和解码器都由许多层通过所谓的自注意力机制连接。您可能会对输入是如何预处理和编码的有很多问题。这些将在后续章节的逐步实现中进行解答。
变压器和LLMs的一个关键组成部分是自注意力机制(未显示),它允许模型相对彼此权衡序列中不同单词或标记的重要性。该机制使模型能够捕捉输入数据中的长距离依赖关系和上下文关系,从而增强其生成连贯且上下文相关输出的能力。然而,由于其复杂性,我们将把进一步的解释推迟到第 3 章,在那里我们将逐步讨论和实现它。
后来的变压器架构变体,如 BERT(即来自变压器的双向编码器表示)和各种 GPT 模型(即生成预训练变压器),在此概念的基础上进行了构建,以适应不同的任务。如果感兴趣,请参阅附录 B 以获取进一步的阅读建议。
BERT 基于原始变换器的编码器子模块,其训练方法与 GPT 不同。虽然 GPT 旨在用于生成任务,但 BERT 及其变体专注于掩码词预测,即模型预测给定句子中的掩码或隐藏词,如图 1.5 所示。这种独特的训练策略使 BERT 在文本分类任务中具备优势,包括情感预测和文档分类。作为其能力的应用,截至本文撰写时,X(前身为 Twitter)使用 BERT 来检测有害内容。
图 1.5 变换器的编码器和解码器子模块的视觉表示。左侧,编码器部分示例了类似 BERT 的 LLMs,它们专注于掩码词预测,主要用于文本分类等任务。右侧,解码器部分展示了类似 GPT 的 LLMs,旨在生成任务和生成连贯的文本序列。
GPT 则专注于原始变换器架构的解码器部分,旨在处理需要生成文本的任务。这包括机器翻译、文本摘要、小说创作、编写计算机代码等。
GPT 模型主要设计和训练用于文本补全任务,但在其能力上也表现出显著的多功能性。这些模型擅长执行零样本学习和少样本学习任务。零样本学习是指在没有任何先前特定示例的情况下,能够推广到完全未见过的任务。另一方面,少样本学习涉及从用户提供的少量示例中学习,如图 1.6 所示。
图 1.6 除了文本补全,类似 GPT 的 LLMs 可以根据输入解决各种任务,而无需重新训练、微调或特定任务模型架构的更改。有时在输入中提供目标的示例是有帮助的,这被称为少量示例设置。然而,类似 GPT 的 LLMs 也能够在没有特定示例的情况下执行任务,这被称为零示例设置。
1.5 利用大数据集
流行的 GPT 和 BERT 类模型的大型训练数据集代表了多样化和全面的文本语料库,涵盖了数十亿个单词,包括广泛的主题以及自然语言和计算机语言。作为一个具体的例子,表 1.1 总结了用于预训练 GPT-3 的数据集,该模型作为 ChatGPT 第一个版本的基础模型。
表 1.1 流行的 GPT-3 的预训练数据集 LLM
数据集名称 |
数据集描述 |
令牌数量 |
训练数据中的比例 |
---|---|---|---|
CommonCrawl(过滤) | 网络爬虫数据 | 4100 亿 | 60% |
WebText2 | 网络爬虫数据 | 190 亿 | 22% |
书籍 1 | 基于互联网的书籍语料库 | 120 亿 | 8% |
书籍 2 | 基于互联网的书籍语料库 | 550 亿 | 8% |
维基百科 | 高质量文本 | 30 亿 | 3% |
表 1.1 报告了标记的数量,其中标记是模型读取的文本单位,数据集中的标记数量大致等同于文本中的单词和标点符号的数量。第二章讨论了标记化,即将文本转换为标记的过程。
主要的结论是,这个训练数据集的规模和多样性使得这些模型能够在各种任务上表现良好,包括语言语法、语义和上下文——甚至一些需要一般知识的任务。
这些模型的预训练特性使它们在下游任务的进一步微调中变得非常灵活,这就是它们被称为基础模型或基础模型的原因。预训练 LLMs 需要访问大量资源,并且成本非常高。例如,GPT-3 的预训练成本估计为 460 万美元,按云计算积分计算 (https://mng.bz/VxEW)。
好消息是,许多预训练的LLMs作为开源模型,可以用作通用工具来撰写、提取和编辑不在训练数据中的文本。此外,LLMs可以在相对较小的数据集上进行微调,以减少所需的计算资源并提高性能。
我们将实现预训练的代码,并将其用于教育目的的LLM预训练。所有计算都可以在消费级硬件上执行。在实现预训练代码后,我们将学习如何重用公开可用的模型权重,并将其加载到我们将实现的架构中,这样在微调我们的LLM时就可以跳过昂贵的预训练阶段。
1.6 更深入地了解 GPT 架构
GPT 最初在 Radford 等人来自 OpenAI 的论文“通过生成预训练改善语言理解”中被介绍(https://mng.bz/x2qg)。GPT-3 是该模型的扩展版本,具有更多参数,并在更大的数据集上进行训练。此外,ChatGPT 中提供的原始模型是通过在一个大型指令数据集上微调 GPT-3 而创建的,使用了 OpenAI 的 InstructGPT 论文中的一种方法(https://arxiv.org/abs/2203.02155)。如图 1.6 所示,这些模型是能够进行文本补全的模型,并且可以执行其他任务,如拼写纠正、分类或语言翻译。考虑到 GPT 模型是在相对简单的下一个单词预测任务上进行预训练的,这实际上是非常显著的,如图 1.7 所示。
图 1.7 在 GPT 模型的下一个词预测预训练任务中,系统通过查看前面的单词来学习预测句子中即将出现的单词。这种方法帮助模型理解单词和短语在语言中通常是如何组合在一起的,形成可以应用于各种其他任务的基础。
下一个词预测任务是一种自我监督学习的形式,这是一种自我标记的形式。这意味着我们不需要显式地收集训练数据的标签,而是可以利用数据本身的结构:我们可以使用句子或文档中的下一个词作为模型应该预测的标签。由于这个下一个词预测任务允许我们“即时”创建标签,因此可以使用大量未标记的文本数据集来训练LLMs。
与我们在 1.4 节中讨论的原始变换器架构相比,通用的 GPT 架构相对简单。基本上,它只是解码器部分,没有编码器(图 1.8)。由于像 GPT 这样的解码器风格模型通过逐字预测文本来生成文本,因此它们被视为一种自回归模型。自回归模型将其先前的输出作为未来预测的输入。因此,在 GPT 中,每个新单词的选择是基于其前面的序列,这提高了生成文本的连贯性。
像 GPT-3 这样的架构也比原始的变换器模型大得多。例如,原始变换器的编码器和解码器块重复了六次。GPT-3 总共有 96 个变换器层和 1750 亿个参数。
图 1.8 GPT 架构仅使用原始变换器的解码器部分。它被设计为单向的,从左到右处理,使其非常适合文本生成和下一个单词预测任务,以迭代的方式生成文本,一次一个单词。
GPT-3 于 2020 年推出,按照深度学习和大型语言模型发展的标准,这被认为是很久以前的事。然而,最近的架构,如 Meta 的 Llama 模型,仍然基于相同的基本概念,仅进行了小幅修改。因此,理解 GPT 仍然非常重要,因此我专注于实现 GPT 背后的主要架构,同时提供对替代模型所采用的特定调整的指引。
尽管最初的变换器模型由编码器和解码器块组成,明确设计用于语言翻译,但 GPT 模型——尽管其更大但更简单的仅解码器架构旨在进行下一个单词预测——也能够执行翻译任务。这一能力最初令研究人员感到意外,因为它出现在一个主要针对下一个单词预测任务的模型中,而该任务并没有特别针对翻译。
执行模型未明确训练的任务的能力称为突现行为。这种能力在训练过程中并没有明确教授,而是作为模型接触大量多语言数据和多样化上下文的自然结果而出现。GPT 模型能够“学习”语言之间的翻译模式并执行翻译任务,即使它们并没有专门为此进行训练,这证明了这些大规模生成语言模型的优势和能力。我们可以在不为每个任务使用不同模型的情况下执行多样化的任务。
1.7 构建大型语言模型
现在我们已经为理解LLMs奠定了基础,让我们从头开始编码一个。我们将以 GPT 的基本理念为蓝图,分三个阶段来处理,如图 1.9 所示。
图 1.9 编码一个 LLM 的三个主要阶段是实现 LLM 架构和数据准备过程(阶段 1)、对 LLM 进行预训练以创建基础模型(阶段 2),以及对基础模型进行微调以成为个人助手或文本分类器(阶段 3)。
在第一阶段,我们将学习基本的数据预处理步骤,并编写每个LLM核心的注意力机制。接下来,在第二阶段,我们将学习如何编码和预训练一个类似 GPT 的LLM,能够生成新文本。我们还将讨论评估LLMs的基本知识,这对于开发有能力的自然语言处理系统至关重要。
从头开始预训练一个LLM是一项重大工作,要求为类似 GPT 的模型支付数千到数百万美元的计算成本。因此,第二阶段的重点是使用小型数据集进行教育目的的训练。此外,我还提供了加载公开可用模型权重的代码示例。
最后,在第 3 阶段,我们将使用预训练的LLM进行微调,以遵循指令,例如回答查询或分类文本——这是许多现实世界应用和研究中最常见的任务。
我希望你期待开始这段激动人心的旅程!
摘要
LLMs 已经改变了自然语言处理领域,该领域之前主要依赖于显式的基于规则的系统和更简单的统计方法。LLMs 的出现引入了新的深度学习驱动的方法,推动了对人类语言的理解、生成和翻译的进步。
现代LLMs的训练分为两个主要步骤:
首先,它们在大量未标记文本的语料库上进行预训练,使用句子中下一个单词的预测作为标签。
然后,它们在一个较小的标记目标数据集上进行微调,以遵循指令或执行分类任务。
LLMs 基于变换器架构。变换器架构的关键思想是注意力机制,它使得 LLM 在逐字生成输出时能够选择性地访问整个输入序列。
原始的变压器架构由一个用于解析文本的编码器和一个用于生成文本的解码器组成。
LLMs 用于生成文本和遵循指令,例如 GPT-3 和 ChatGPT,仅实现解码器模块,简化架构。
包含数十亿单词的大型数据集对于预训练是必不可少的LLMs。
虽然 GPT 类模型的一般预训练任务是预测句子中的下一个单词,但这些LLMs展现了突现特性,例如分类、翻译或总结文本的能力。
一旦LLM经过预训练,生成的基础模型可以更高效地针对各种下游任务进行微调。
LLMs 在定制数据集上进行微调可以在特定任务上超越一般的 LLMs。