用 pytorch 从零开始创建大语言模型(一):理解大型语言模型
用 pytorch 从零开始创建大语言模型(一):理解大型语言模型
- 1 理解大型语言模型
- LLM的语言理解能力
- LLM的进步来自深度学习
- LLM 与 早期 NLP 模型的不同
- LLM 成功的关键
- 本系列的目标
- 1.1 什么是 LLM?
- LLM 中的 "Large"(大型) 指的是什么?
- 为何使用“下一个单词预测”作为训练任务?
- LLM 基于 Transformer 架构
- 1.2 LLM 的应用
- 1.3 构建和使用 LLM 的阶段
- 1.4 LLM 在不同任务中的应用
- 1.5 利用大规模数据集
- 1.7 构建大型语言模型
- 1.8 总结
- 现代 LLM 的训练分为两个主要步骤:
- LLM 基于变换器(transformer) 架构:
- 大规模数据集对于 LLM 预训练至关重要:
- GPT 类模型的通用能力:
- 微调(finetuning) 的重要性
1 理解大型语言模型
本章内容包括:
- 对大型语言模型(LLM) 基本概念的高级解释。
- 深入解析变换器(transformer) 架构,该架构是类似ChatGPT的LLM的基础。
- 从零开始构建LLM的计划。
大型语言模型(LLM)(如 OpenAI的ChatGPT)是近年来发展起来的深度神经网络模型,它们开启了自然语言处理(NLP) 的新纪元。
在 LLM 出现之前,传统方法 在某些任务上表现出色,例如:
- 电子邮件垃圾分类(spam classification)。
- 基于规则的简单模式识别。
然而,这些方法通常在 需要复杂理解和文本生成能力的语言任务 上表现不佳,例如:
- 解析详细指令。
- 进行上下文分析。
- 生成连贯且符合语境的原创文本。
例如,早期的语言模型无法根据关键词列表写出完整的电子邮件,但这一任务对于现代LLM来说是轻而易举的。
LLM的语言理解能力
LLM 具有强大的能力来理解、生成和解释人类语言。
但需要明确一点,当我们说 “LLM理解语言” 时,实际指的是:
- 它们可以处理并生成看起来连贯且符合上下文的文本,
- 但并不意味着它们具备人类般的意识或理解能力。
LLM的进步来自深度学习
LLM的强大能力依赖于深度学习(Deep Learning) 的进步,其中:
- 深度学习是机器学习(Machine Learning) 和人工智能(AI) 的一个子领域,
- 核心技术是神经网络(Neural Networks)。
LLM 通过在大规模文本数据上训练,能够比以往的方法更深入地捕捉语言的上下文和细微差别。
因此,LLM 在广泛的 NLP 任务(如 文本翻译、情感分析、问答系统等)中都表现出色。
LLM 与 早期 NLP 模型的不同
- 早期 NLP 模型 通常是专门为某一特定任务设计的,在 狭窄的应用领域表现优异。
- LLM 则具有更广泛的能力,能够适用于多种NLP任务。
LLM 成功的关键
LLM 取得成功的 两个关键因素:
- 变换器(transformer) 架构——支撑许多LLM的基础。
- 大规模训练数据——使LLM能够捕捉丰富的语言模式、语境和细微差别,而这些信息难以手动编码。
这种 基于变换器架构和大规模数据训练的方式 彻底改变了 NLP,提供了 更强大的工具来理解和处理人类语言。
本系列的目标
从 本章开始,我们将 奠定基础,以实现本系列的核心目标:
- 通过代码逐步实现一个基于变换器架构的 ChatGPT 类LLM,深入理解LLM的工作原理。
1.1 什么是 LLM?
LLM(大型语言模型, Large Language Model) 是一种 神经网络,用于 理解、生成和响应类似人类的文本。
这些模型是 深度神经网络,通过在大规模文本数据上进行训练,有时甚至涵盖了互联网上公开可用的绝大部分文本。
LLM 中的 “Large”(大型) 指的是什么?
LLM 中的 “Large”(大型) 主要指:
- 模型的规模(以参数量衡量)。
- 训练所使用的庞大数据集。
LLM 的参数规模往往达到数十亿甚至上千亿,这些参数是 神经网络中可调节的权重(weights),在训练过程中进行优化,以 预测序列中的下一个单词(next-word prediction)。
为何使用“下一个单词预测”作为训练任务?
- 语言具有天然的序列特性,因此下一个单词预测任务可以让模型学习文本的上下文、结构和关系。
- 尽管“下一个单词预测”任务本身非常简单,但它竟然能够训练出如此强大的模型,这一点令许多研究人员感到惊讶。
- 在后续章节中,我们将逐步讨论并实现该训练过程。
LLM 基于 Transformer 架构
LLM 采用的架构是 变换器(Transformer)(详细内容见 1.4 节)。
- 变换器的核心机制是“注意力机制(attention)”,它允许模型 在预测时选择性地关注输入的不同部分。
- 这种机制使得LLM能够很好地处理人类语言的复杂性和细微差别。
由于 LLM 具备文本生成能力,因此它们通常被归类为 生成式人工智能(Generative AI, GenAI)。
如 图1.1 所示,人工智能(AI) 是一个 更广泛的领域,涉及创建能够执行需要人类智能的任务的机器,包括:
- 理解语言
- 识别模式
- 做出决策
AI 还包括 机器学习(Machine Learning, ML) 和 深度学习(Deep Learning, DL) 等子领域。
图1.1 说明
从层次结构上看,不同领域之间的关系如下:
- LLM 是深度学习技术的一个特定应用,利用其 处理和生成类人文本的能力。
- 深度学习(Deep Learning) 是 机器学习的一个专门分支,侧重于 使用多层神经网络(multi-layer neural networks)。
- 机器学习(ML) 和 深度学习(DL) 旨在开发算法,使计算机能够从数据中学习,并执行通常需要人类智能的任务。
用于实现 AI 的算法 是 机器学习(Machine Learning) 领域的核心研究方向。
具体来说,机器学习 旨在开发能够从数据中学习,并在没有明确编程的情况下进行预测或决策的算法。
例如,垃圾邮件过滤器(Spam Filter) 就是 机器学习的一个实际应用:
- 传统方法 需要 手动编写规则 来识别垃圾邮件。
- 机器学习算法 则 学习带有“垃圾邮件”或“正常邮件”标签的示例数据,
- 通过 最小化训练集上的预测误差,模型能够识别垃圾邮件的特征和模式,
- 进而自动分类新的邮件,判断其是垃圾邮件还是正常邮件。
如 图1.1 所示,深度学习(Deep Learning) 是 机器学习的一个子领域,专注于:
- 利用包含三层或更多层的神经网络(deep neural networks) 来建模数据中的复杂模式和抽象特征。
- 与传统机器学习相比,深度学习不需要手动特征提取。
在 传统机器学习 中:
- 需要 人工提取特征(feature extraction),即专家需要识别并选择最相关的特征。
- 例如,在垃圾邮件分类中,人工可能会提取以下特征:
- 特定触发词的出现频率(如
"prize"
、"win"
、"free"
)。 - 感叹号数量、全大写单词的使用。
- 是否包含可疑链接。
- 特定触发词的出现频率(如
- 训练数据基于这些 人工定义的特征 进行构建,然后用于训练模型。
在 深度学习 中:
- 不需要人工提取特征,模型会自动学习数据中的重要特征。
- 但 无论是传统机器学习还是深度学习,垃圾邮件分类仍然需要人工提供数据标签(如 “垃圾邮件” 或 “正常邮件”),这些标签可以由专家或用户**手动标注。
在接下来的章节中,我们将讨论:
- LLM 目前能够解决的问题。
- LLM 解决的挑战。
- LLM 的通用架构,并在本系列中实现它。
1.2 LLM 的应用
由于 LLM 具备强大的能力来解析和理解非结构化文本数据,因此它们在 多个领域 具有 广泛的应用。
目前,LLM 被用于:
- 机器翻译(machine translation)。
- 新文本生成(generation of novel texts)(见 图1.2)。
- 情感分析(sentiment analysis)。
- 文本摘要(text summarization)。
- 以及其他众多任务。
最近,LLM 还被用于内容创作(content creation),例如:
- 写作小说。
- 撰写文章。
- 甚至生成计算机代码。
图1.2 展示了 LLM 界面如何实现用户与 AI 系统之间的自然语言交互。
该截图显示 ChatGPT 根据用户的要求创作诗歌。
LLM 还可用于 支持高级聊天机器人(chatbots) 和虚拟助手(virtual assistants),例如:
- OpenAI 的 ChatGPT。
- Google 的 Gemini(前称 Bard)。
这些 聊天机器人 可以:
- 回答用户查询。
- 增强传统搜索引擎(如 Google Search 和 Microsoft Bing)。
此外,LLM 可用于从庞大的文本数据中高效检索专业知识,特别是在 医学或法律等专业领域,包括:
- 筛选文档。
- 总结长篇文本。
- 回答技术性问题。
简而言之,LLM 几乎可以自动化处理所有涉及文本解析和生成的任务。
其应用范围几乎无穷无尽,随着人们不断探索新的使用方式,LLM 有潜力重新定义我们与技术的关系,使其更加:
- 对话化(conversational)。
- 直观(intuitive)。
- 可访问(accessible)。
本系列目标
在本系列中,我们将从零开始理解 LLM 的工作原理,并编写一个能够生成文本的 LLM。我们还将学习 让 LLM 执行各种查询的技术,包括:
- 回答问题。
- 总结文本。
- 将文本翻译为不同语言 等等。
换句话说,在本系列中,我们将 逐步构建一个类似 ChatGPT 的复杂 LLM 助手,以理解其工作机制。
1.3 构建和使用 LLM 的阶段
为什么要构建自己的 LLM?
- 从零开始编写 LLM 是理解其机制和局限性的极佳练习。
- 掌握 LLM 训练的基础知识,有助于预训练(pretraining) 或微调(finetuning) 现有的开源 LLM,使其适应特定领域的数据集或任务。
研究表明,在建模性能方面,针对特定任务或领域定制的 LLM,往往能优于通用型 LLM(如 ChatGPT),后者被设计用于广泛的应用场景。
例如:
- BloombergGPT——专门针对金融领域优化的 LLM。
- 针对医学问答的 LLM(更多详情请参阅附录B的 “延伸阅读与参考文献” 部分)。
LLM 的训练流程:预训练(Pretraining) 和微调(Finetuning)
构建 LLM 的 核心流程 包括 预训练(pretraining) 和微调(finetuning)。
-
预训练(pretraining):
- “Pre” 代表 初始阶段,即 LLM 在 大规模、多样化的数据集 上进行训练,以形成对语言的广泛理解。
- 预训练模型 可作为通用基础模型,用于后续任务。
-
微调(finetuning):
- 在更小、更具体的领域数据集上进一步训练模型,使其适应特定任务或领域。
这一两阶段的训练方法(预训练 + 微调)在图 1.3 中进行了说明。
图 1.3 展示了:
- 预训练阶段:LLM 在 大规模文本数据集 上进行 “下一个单词预测(next-word prediction)” 任务。
- 微调阶段:使用 较小的带标签数据集 对 预训练的 LLM 进行优化。
如 图1.3 所示,构建 LLM 的第一步 是在 大规模文本数据(corpus of text data) 上进行训练,这些数据有时被称为 “原始文本(raw text)”。
其中,“raw” 指的是该数据只是普通文本,不包含任何标注信息。[1]
(在预处理阶段可能会进行 数据筛选,例如 去除格式字符 或 移除未知语言的文档。)
这一 LLM 训练的第一阶段 被称为 预训练(pretraining),它生成 初始的预训练LLM,通常称为 基础模型(base model) 或 基石模型(foundation model)。
典型示例:GPT-3 模型(即 ChatGPT 的前身)。
GPT-3 具备:
- 文本补全(text completion) 能力,即 能够完成用户提供的半句文本。
- 有限的 Few-Shot 能力,即 能够基于少量示例学习新任务,而无需大量训练数据。
- 更多关于 LLM 处理不同任务的能力将在下一节进行说明。
微调(Finetuning)
在 大规模文本数据集 上完成 预训练(即LLM 学会预测文本中的下一个单词)后,可以在带有标注的数据(labeled data) 上进一步训练 LLM,这一过程称为 微调(finetuning)。
最常见的两种 LLM 微调方式:
-
指令微调(Instruction-Finetuning):
- 训练数据由 指令-答案(instruction-answer) 对 组成,例如:
- “翻译文本” 任务的数据包含 原始文本及其正确翻译。
- 训练数据由 指令-答案(instruction-answer) 对 组成,例如:
-
分类微调(Classification-Finetuning):
- 训练数据由 文本及其对应的类别标签(class labels) 组成,例如:
- 垃圾邮件分类(spam classification) 任务的数据包含 邮件文本及其 “垃圾邮件” 或 “正常邮件” 标签。
- 训练数据由 文本及其对应的类别标签(class labels) 组成,例如:
在本系列中,我们将 实现 LLM 预训练(pretraining) 和 微调(finetuning) 的代码。在完成 基础 LLM 的预训练 后,我们还将 深入探讨指令微调和分类微调的具体实现。
1.4 LLM 在不同任务中的应用
大多数现代 LLM 依赖于变换器(transformer) 架构,该架构是一种深度神经网络,最早由 2017 年论文《Attention Is All You Need》 提出。
要理解 LLM,我们需要简要回顾 最初的变换器模型,它最早是为机器翻译(machine translation) 任务开发的,用于 将英语文本翻译成德语和法语。
图1.4 展示了 简化版的原始变换器架构。
图1.4 说明:
-
变换器由 两个部分 组成:
- 编码器(encoder):
- 处理输入文本,生成 嵌入表示(embedding representation)。
- 嵌入表示是一种数值表示(numerical representation),用于在不同维度上捕捉文本的多种特征。
- 解码器(decoder):
- 利用 编码器的嵌入表示,逐步生成翻译后的文本。
- 编码器(encoder):
-
图1.4 展示了翻译过程的最后阶段,其中:
- 原始输入文本:“This is an example”。
- 部分已翻译文本:“Das ist ein”。
- 解码器当前需生成的最终单词:“Beispiel” 以完成翻译。
如图 1.4 所示,变换器(transformer) 架构由两个子模块组成:
- 编码器(encoder):
- 处理输入文本,并将其编码为一系列 数值表示(numerical representations) 或 向量(vectors),以捕捉输入的上下文信息。
- 解码器(decoder):
- 采用编码器生成的 编码向量(encoded vectors),并根据这些向量生成输出文本。
在 翻译任务 中:
- 编码器 将源语言文本编码为向量。
- 解码器 根据这些向量解码并生成目标语言文本。
编码器和解码器都由多个层组成,并通过一种称为 自注意力(self-attention) 机制 的方法连接起来。
关于 输入如何预处理和编码 的问题,我们将在后续章节逐步实现。
自注意力机制(self-attention mechanism)
- 自注意力机制 是 变换器和 LLM 的关键组件(图 1.4 未显示)。
- 它允许模型计算序列中不同单词或标记的重要性,从而:
- 捕捉长距离依赖关系(long-range dependencies)。
- 理解输入数据的上下文关系(contextual relationships)。
- 这一机制增强了模型生成连贯且符合语境的输出能力。
- 由于其复杂性,我们将在 第 3 章 详细讨论并逐步实现该机制。
此外,我们将在 第 2 章《处理文本数据》(Working with Text Data) 讨论并实现 数据预处理步骤,以创建 模型输入。
变换器的后续变体
后来的变换器架构变体(如 BERT 和 各种 GPT 模型)在此基础上进行了扩展,以适应不同任务。
(相关文献可在 附录 B 中找到。)
BERT(Bidirectional Encoder Representations from Transformers):
- 基于原始变换器的编码器子模块,但其训练方式不同于 GPT。
- GPT 主要用于生成任务,而BERT 及其变体专注于“掩码单词预测(masked word prediction)”:
- 即在给定句子中预测被屏蔽(masked) 或隐藏(hidden) 的单词(如图 1.5 所示)。
- 这一独特的训练策略 使 BERT 在文本分类任务(如情感预测(sentiment prediction) 和文档分类(document categorization))中表现优异。
BERT 的应用示例:
- 截至目前,Twitter 采用 BERT 进行有害内容检测。
图 1.5 直观展示了变换器的编码器和解码器子模块:
- 左侧:编码器部分代表 BERT 类 LLM,主要用于 掩码单词预测,适用于 文本分类任务。
- 右侧:解码器部分代表 GPT 类 LLM,主要用于 生成任务,可 生成连贯的文本序列。
GPT 专注于原始变换器架构(transformer architecture) 的解码器(decoder) 部分,专为 需要文本生成的任务 设计。
这包括:
- 机器翻译(machine translation)。
- 文本摘要(text summarization)。
- 小说写作(fiction writing)。
- 编写计算机代码(writing computer code) 等。
在本系列的 后续章节,我们将 更详细地讨论 GPT 架构,并从零开始实现 GPT。
GPT 的学习能力
GPT 模型 主要设计用于 文本补全(text completion) 任务,但它们展现出了极强的泛化能力。
GPT 模型擅长:
- 零样本学习(zero-shot learning):
- 无需任何示例,直接对完全未见过的任务进行泛化。
- 少样本学习(few-shot learning):
- 通过用户提供的少量示例进行学习(如图 1.6 所示)。
图 1.6 说明
- GPT 类 LLM 除了文本补全外,还能在无需重新训练、微调或修改任务特定架构的情况下解决多种任务。
- 在某些情况下,提供目标任务的示例作为输入 会有所帮助,这被称为 少样本学习(few-shot setting)。
- 然而,GPT 类 LLM 也可以在没有具体示例的情况下完成任务,这称为零样本学习(zero-shot setting)。
变换器(Transformers) 与 LLM
当今的 LLM 基于上一节介绍的变换器(transformer) 架构,因此在文献中 “变换器” 和 “LLM” 这两个术语常被互换使用 。
然而,需要注意的是:
- 并非所有变换器都是 LLM,因为 变换器架构也可用于计算机视觉(computer vision)。
- 并非所有 LLM 都是变换器,因为仍然存在基于循环神经网络(RNN) 和卷积神经网络(CNN) 的大型语言模型。
这些替代 LLM 架构的主要目标是提高计算效率。
然而,这些架构是否能在能力上与基于变换器的 LLM 竞争,以及它们是否会在实际应用中被广泛采用,仍有待观察。
(对这些架构感兴趣的读者,可在本章末尾的**“延伸阅读(Further Reading)”** 部分找到相关文献参考。)
1.5 利用大规模数据集
GPT 类和 BERT 类模型的训练数据集 涵盖了数十亿单词,代表了多样化且全面的文本语料(text corpora),
包括:
- 广泛的主题。
- 自然语言和计算机语言。
为了提供更具体的示例,表 1.1 总结了 GPT-3 预训练所使用的数据集,
GPT-3 作为第一版 ChatGPT 的基础模型(base model)。
表 1.1 报告了数据集中的标记数(tokens),其中:
- “标记(token)” 是 模型读取的文本单位。
- 数据集中的标记数量 大致相当于文本中的单词和标点符号总数。
关于标记化(tokenization)——即将文本转换为标记的过程,我们将在 下一章 详细讨论。
LLM 训练数据规模的影响
训练数据的规模和多样性 使 LLM 能够在多种任务上表现出色,包括:
- 语言语法(syntax) 处理。
- 语义(semantics) 理解。
- 上下文(context) 解析。
- 甚至涉及一般知识(general knowledge) 的任务。
GPT-3 数据集详情
在 表 1.1 中,需要注意:
- 训练过程中只使用了部分数据集,总计 3000 亿个标记(300 billion tokens)。
- 训练并未涵盖每个数据集中的所有数据,而是从所有数据集中选取一个 3000 亿标记的子集。
- 某些数据集可能未完全包含在训练数据中,而另一些数据集可能被多次采样,以达到 3000 亿标记的总量。
- 表格中"占比"列的数值相加(忽略四舍五入误差)总计为 100%。
例如:
- CommonCrawl 数据集:
- 总计 4100 亿个标记(410 billion tokens)。
- 存储需求约 570 GB。
- GPT-3 之后的模型(如 Meta 的 LLaMA)进一步扩展了训练数据来源,包括:
- Arxiv 研究论文(92 GB)。
- StackExchange 代码问答(78 GB)。
GPT-3 训练数据来源
- Wikipedia 语料库:包含 英语 Wikipedia。
- Books1 可能来源于 Project Gutenberg (https://www.gutenberg.org/)。
- Books2 可能来源于 Libgen (https://en.wikipedia.org/wiki/Library_Genesis)。
- CommonCrawl 是 CommonCrawl 数据库 (https://commoncrawl.org/) 的 筛选子集。
- WebText2 来自 Reddit 3+ 赞(upvotes) 的帖子中的所有外部链接网页。
GPT-3 论文的作者并未公开完整的训练数据集,但有一个可公开获取的类似数据集 The Pile (https://pile.eleuther.ai/)。
- The Pile 可能包含受版权保护的内容,其具体使用条款取决于用途和所在国家。
- 更多讨论可见 HackerNews (https://news.ycombinator.com/item?id=25607809)。
LLM 预训练的高昂成本
- LLM 预训练(pretraining) 使其在各种任务上具备通用性,这也是它们被称为 基础模型(base model) 或基石模型(foundation model) 的原因。
- 预训练 LLM 需要大量计算资源,成本极高。
- GPT-3 预训练的云计算费用估计为 460 万美元($4.6 million) [2]。
开源 LLM 及微调
- 好消息:许多 预训练 LLM 以开源模型的形式提供,可作为通用工具:
- 生成文本。
- 提取文本信息。
- 编辑非训练数据中的文本。
- LLM 还可以通过较小的数据集进行微调(finetuning):
- 减少计算资源需求。
- 提升在特定任务上的性能。
在本系列中,我们将:
-
实现 LLM 预训练(pretraining) 代码,用于教育目的。
-
所有计算将在消费级硬件(consumer hardware) 上执行,无需昂贵计算资源。
-
在实现预训练代码后,我们将学习如何加载开源 LLM 权重,跳过昂贵的预训练阶段,直接进行 LLM 微调(finetuning)。
1.6 深入解析 GPT 架构
在本章前面,我们提到了 GPT 类模型(GPT-like models)、GPT-3 和 ChatGPT。
现在,让我们深入了解 GPT 的整体架构。
GPT 的定义与起源
-
GPT 代表 “Generative Pretrained Transformer”(生成式预训练变换器)。
-
GPT 最早在 2018 年由 OpenAI 的 Radford 等人提出,论文如下:
《Improving Language Understanding by Generative Pre-Training》(2018)
Radford et al., OpenAI
论文链接:http://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf
GPT-3 与 ChatGPT
- GPT-3 是 GPT 的扩展版本:
- 拥有更多参数。
- 训练数据规模更大。
- ChatGPT 的最初版本:
- 在 GPT-3 基础上进行微调(finetuning)。
- 采用 OpenAI 的 InstructGPT 论文方法(详见 第 7 章《基于人类反馈的微调》)。
GPT 任务能力
如 图 1.6 所示,GPT 模型不仅擅长文本补全(text completion),还可以执行其他任务,包括:
- 拼写纠正(spelling correction)。
- 文本分类(classification)。
- 语言翻译(language translation)。
这点尤为 惊人,因为 GPT 的预训练任务只是一个相对简单的 “下一个单词预测(next-word prediction)” 任务,如 图 1.7 所示。
图 1.7 说明
- 在 GPT 预训练任务 中,模型学习通过观察前面的单词来预测句子中的下一个单词。
- 这一方法帮助模型理解语言中单词和短语的组合方式,从而构建适用于各种任务的语言基础。
下一个单词预测任务(next-word prediction task) 是一种自监督学习(self-supervised learning) 形式,
属于自标注(self-labeling) 方法。
这意味着:
- 不需要人为收集训练数据的标签,而是利用数据本身的结构:
- 将句子或文档中的下一个单词视为模型需要预测的标签。
- 由于这种方法能够“动态生成”标签,因此可以利用大规模无标注文本数据集 来训练 LLM,
这一点在 1.5 节《利用大规模数据集》(Utilizing large datasets) 中已有讨论。
GPT 与原始变换器的区别
- 相比于 1.4 节《LLM 在不同任务中的应用》中介绍的原始变换器架构,GPT 结构更为简单。
- GPT 仅保留了解码器(decoder),去除了编码器(encoder),如 图 1.8 所示。
- 由于 GPT 这类解码器风格(decoder-style) 模型:
- 逐步预测并生成文本,每次生成一个单词,
- 因此 GPT 被归类为自回归模型(autoregressive model)。
GPT 作为自回归模型
- 自回归模型:利用 先前生成的输出 作为 未来预测的输入。
- 在 GPT 生成文本的过程中,每个新单词都是基于前面已经生成的文本选择的:
- 这提高了最终文本的连贯性(coherence)。
GPT-3 规模远超原始变换器
- 原始变换器模型:
- 编码器(encoder) 和解码器(decoder) 块各重复 6 次。
- GPT-3:
- 包含 96 层变换器(transformer layers)。
- 总参数量高达 1750 亿(175 billion parameters)。
图 1.8 说明
- GPT 仅使用原始变换器的解码器部分。
- 采用单向(unidirectional)、从左到右(left-to-right) 处理方式:
- 适用于文本生成(text generation) 和 下一个单词预测任务(next-word prediction tasks)。
- 以迭代方式逐步生成文本,每次生成一个单词。
GPT-3 于 2020 年推出,按照深度学习(deep learning) 和大型语言模型(LLM) 发展的标准,
这已被视为 较早的模型。
然而:
- 更近期的架构(如 Meta 的 Llama 模型)仍然基于相同的核心概念,
仅进行了少量修改。 - 因此,理解 GPT 依然具有重要意义。
- 本书重点在于实现 GPT 背后的主要架构,同时提供关于其他 LLM 采用的特定调整(tweaks) 的参考信息。
GPT 具备的"意外"能力
值得注意的是:
- 尽管原始变换器(transformer) 设计用于语言翻译(language translation),
- 但 GPT 模型——尽管架构更大、更简单,主要用于下一个单词预测(next-word prediction),
- 仍然能够执行翻译任务。
这一能力最初令研究人员感到意外:
- GPT 主要接受的是下一个单词预测任务训练,而非专门的翻译训练。
- 然而,GPT 仍然能够“学习”不同语言之间的翻译模式,并执行翻译任务。
GPT 的“涌现行为”(Emergent Behavior)
- 模型能够执行未经过明确训练的任务,这一现象称为“涌现行为”(emergent behavior)。
- 这种能力并非由训练过程直接教授,而是模型在处理海量多语言数据(multilingual data) 时自然形成的。
LLM 的优势
- GPT 等大型生成式语言模型(generative language models) 展现出的能力表明:
- 无需为每个特定任务训练不同的模型。
- 一个 LLM 就能够执行多种不同任务,如翻译、文本补全、分类等。
1.7 构建大型语言模型
在本章中,我们为理解 LLM 奠定了基础。
在本书的 后续章节,我们将 从零开始编写一个 LLM。
我们将:
- 以 GPT 的基本思想为蓝图。
- 分三个阶段完成(如 图 1.9 所示):
图 1.9 LLM 构建阶段
本书涵盖的 LLM 构建流程 包括:
- 实现 LLM 架构(architecture) 和数据预处理流程(data preparation process)。
- 预训练(pretraining) LLM 以创建基础模型(foundation model)。
- 微调(finetuning) 该基础模型,使其:
- 成为个人助手(personal assistant)。
- 成为文本分类器(text classifier)。
首先,我们将学习基本的数据预处理步骤,并编写注意力机制,
这是每个 LLM 的核心。
接下来,在 阶段 2,我们将学习如何编写并预训练(pretrain) 一个 GPT 类 LLM,
使其具备生成新文本的能力。同时,我们还将介绍LLM 评估的基础知识,
这对于开发高性能的 NLP 系统至关重要。
需要注意的是:
- 从零开始预训练一个大型 LLM 是一个庞大的工程,
训练 GPT 类模型需要花费数千到数百万美元的计算成本。 - 因此,阶段 2 的重点是基于小数据集实现训练代码,以满足教育目的。
- 另外,本书还将提供加载开源模型权重的代码示例。
最后,在 阶段 3,我们将:
- 使用预训练(pretrained) LLM,并对其进行微调(finetuning),
- 使其能够执行指令任务,如回答问题或文本分类,
这些是现实世界应用和研究中最常见的任务。
希望你期待这段激动人心的旅程!
1.8 总结
- LLM 彻底改变了自然语言处理(NLP) 领域,
过去 NLP 主要依赖显式的基于规则(rule-based) 系统和简单的统计方法(statistical methods)。 - LLM 的出现引入了基于深度学习(deep learning-driven) 的方法,
极大地提升了语言理解、文本生成和翻译的能力。
现代 LLM 的训练分为两个主要步骤:
- 首先,LLM 在大规模无标注文本语料库上进行预训练(pretraining),
通过预测句子中的下一个单词作为“标签”(label)。 - 然后,LLM 在一个较小的、有标签目标数据集上进行微调(finetuning),
使其能够执行指令任务或文本分类任务。
LLM 基于变换器(transformer) 架构:
- 变换器的关键思想是注意力机制(attention mechanism),
它允许 LLM 在生成文本时选择性地访问整个输入序列。 - 原始变换器(transformer) 由编码器(encoder) 和解码器(decoder) 组成:
- 编码器用于解析文本(parsing text)。
- 解码器用于生成文本(generating text)。
- GPT-3 和 ChatGPT 这类 LLM 仅使用解码器模块(decoder modules),
从而简化了架构。
大规模数据集对于 LLM 预训练至关重要:
- LLM 预训练需要包含数十亿个单词的大规模数据集。
- 在本书中,我们将使用小规模数据集来实现和训练 LLM,以满足教育目的,
同时,我们还将学习如何加载开源模型权重。
GPT 类模型的通用能力:
- 尽管 GPT 类 LLM 的主要预训练任务是“预测句子中的下一个单词”,
但它们表现出“涌现(emergent)”特性,如:- 文本分类(classification)。
- 语言翻译(translation)。
- 文本摘要(summarization)。
微调(finetuning) 的重要性
- 一旦 LLM 经过预训练(pretraining),所得的基础模型(foundation model) 可以更高效地进行微调,
使其适用于各种下游任务(downstream tasks)。 - 基于特定数据集微调的 LLM,通常能够在特定任务上超越通用 LLM。