From 22159816dabb5e5c1a0c0ca3a7435d3d7b2addcf Mon Sep 17 00:00:00 2001 From: skindhu Date: Mon, 18 Nov 2024 16:21:25 +0800 Subject: [PATCH] add seventh chapter --- cn-Book/1.理解大语言模型.md | 52 ++++++++++++++++++------------------- cn-Book/2.处理文本数据.md | 8 +++--- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/cn-Book/1.理解大语言模型.md b/cn-Book/1.理解大语言模型.md index 786c6fa..7c6397d 100644 --- a/cn-Book/1.理解大语言模型.md +++ b/cn-Book/1.理解大语言模型.md @@ -1,6 +1,6 @@ 本章涵盖以下内容: -- **大语言模型(LLMs)背后基本概念的高级解释** +- **大语言模型(LLM)背后基本概念的高级解释** - **对大语言模型(如 ChatGPT 平台上使用的模型)所源自的 Transformer 架构的深入了解** - **从零开始构建大语言模型的计划** @@ -10,8 +10,8 @@ - [1.1 LLM 是什么?](#11-llm-是什么) -- [1.2 LLMs 的应用](#12-llms-的应用) -- [1.3 构建和使用 LLMs 的步骤](#13-构建和使用-llms-的步骤) +- [1.2 LLM 的应用](#12-llm-的应用) +- [1.3 构建和使用 LLM 的步骤](#13-构建和使用-llm-的步骤) - [1.4 介绍 Transformer 架构](#14-介绍-transformer-架构) - [1.5 利用大型数据集](#15-利用大型数据集) - [1.6 深入剖析GPT架构](#16-深入剖析gpt架构) @@ -23,19 +23,19 @@ ------ -大语言模型 (LLMs),如 OpenAI 的 ChatGPT,是近年来发展起来的深度神经网络模型。这些模型为自然语言处理 (NLP) 开辟了一个新时代。在大语言模型出现之前,传统方法在电子邮件垃圾分类等分类任务中表现良好,但通常在需要复杂理解和生成能力的语言任务上表现不佳,例如解析详细指令、进行上下文分析,或生成连贯且符合上下文的原创文本。例如,早期的语言模型无法根据关键词列表撰写电子邮件,而这个任务对现代 LLMs 来说却非常简单。 +大语言模型 (LLM),如 OpenAI 的 ChatGPT,是近年来发展起来的深度神经网络模型。这些模型为自然语言处理 (NLP) 开辟了一个新时代。在大语言模型出现之前,传统方法在电子邮件垃圾分类等分类任务中表现良好,但通常在需要复杂理解和生成能力的语言任务上表现不佳,例如解析详细指令、进行上下文分析,或生成连贯且符合上下文的原创文本。例如,早期的语言模型无法根据关键词列表撰写电子邮件,而这个任务对现代 LLM 来说却非常简单。 -LLMs 具备理解、生成和解释人类语言的卓越能力。然而,我们需要澄清的是,当我们说语言模型“理解”时,并不是说它们具有人类的意识或理解能力,而是指它们能够以看起来连贯且符合上下文的方式处理和生成文本。 +LLM 具备理解、生成和解释人类语言的卓越能力。然而,我们需要澄清的是,当我们说语言模型“理解”时,并不是说它们具有人类的意识或理解能力,而是指它们能够以看起来连贯且符合上下文的方式处理和生成文本。 -得益于深度学习的进展,深度学习是机器学习和人工智能 (AI) 的一个子集,主要关注神经网络,LLMs 可以基于深度学习理论在海量文本数据上进行训练。这使得 LLMs 能够捕捉到比以往方法更深层的上下文信息和人类语言的细微差别。因此,LLMs 在各种自然语言处理 (NLP) 任务中的表现得到了显著提升,包括文本翻译、情感分析、问答等。 +得益于深度学习的进展,深度学习是机器学习和人工智能 (AI) 的一个子集,主要关注神经网络,LLM 可以基于深度学习理论在海量文本数据上进行训练。这使得 LLM 能够捕捉到比以往方法更深层的上下文信息和人类语言的细微差别。因此,LLM 在各种自然语言处理 (NLP) 任务中的表现得到了显著提升,包括文本翻译、情感分析、问答等。 -当代 LLMs 与早期 NLP 模型之间的另一个重要区别在于,早期的 NLP 模型通常是为特定任务而设计的,例如文本分类、语言翻译等。虽然这些早期模型在其特定应用中表现出色,但 LLMs 在各种自然语言处理 (NLP) 任务中展现了更广泛的能力。 +当代 LLM 与早期 NLP 模型之间的另一个重要区别在于,早期的 NLP 模型通常是为特定任务而设计的,例如文本分类、语言翻译等。虽然这些早期模型在其特定应用中表现出色,但 LLM 在各种自然语言处理 (NLP) 任务中展现了更广泛的能力。 -LLMs 的成功可以归因于支撑 LLMs 的 Transformer 架构,以及 LLMs 训练所用的海量数据。这使得它们能够捕捉到多种语言的细微差别、上下文和模式,而这些都是难以手动编码的。 +LLM 的成功可以归因于支撑 LLM 的 Transformer 架构,以及 LLM 训练所用的海量数据。这使得它们能够捕捉到多种语言的细微差别、上下文和模式,而这些都是难以手动编码的。 -这种转向基于 Transformer 架构的模型和大规模训练数据集来训练 LLMs,已经从根本上改变了自然语言处理 (NLP) 领域,为理解和与人类语言互动提供了更强大的工具。 +这种转向基于 Transformer 架构的模型和大规模训练数据集来训练 LLM,已经从根本上改变了自然语言处理 (NLP) 领域,为理解和与人类语言互动提供了更强大的工具。 -从本章开始,我们将奠定实现本书主要目标的基础:通过逐步在代码中实现一个基于 transformer 架构的类似 ChatGPT 的 LLM,以帮助理解 LLMs。 +从本章开始,我们将奠定实现本书主要目标的基础:通过逐步在代码中实现一个基于 transformer 架构的类似 ChatGPT 的 LLM,以帮助理解 LLM。 @@ -45,9 +45,9 @@ LLM(大语言模型)是一个旨在理解、生成和响应人类文本的 “大语言模型”中的“大”指的是模型的参数规模和用于训练的庞大数据集。这类模型通常包含数十亿甚至数百亿的参数,这些参数是网络中的可调节权重,训练过程中通过优化来预测序列中的下一个单词。预测下一个单词是合理的,因为这利用了语言的序列特性,帮助模型理解文本中的上下文、结构和关系。然而,这只是一项非常简单的任务,因此许多研究人员对其能够产生如此强大的模型感到惊讶。我们将在后面的章节中逐步讨论并实现下一个单词的训练过程。 -LLMs 采用了一种称为 Transformer 的架构(在第 1.4 节中将详细讨论),这使得它们在做预测时能够对输入的不同部分进行选择性关注,因此特别擅长处理人类语言的细微差别和复杂性。 +LLM 采用了一种称为 Transformer 的架构(在第 1.4 节中将详细讨论),这使得它们在做预测时能够对输入的不同部分进行选择性关注,因此特别擅长处理人类语言的细微差别和复杂性。 -由于 LLMs 能够生成文本,因此它们通常被称为一种生成式人工智能 (AI),常缩写为生成 AI 或 GenAI。如图 1.1 所示,人工智能涵盖了创造能执行类似人类智能任务的更广泛领域,包括理解语言、识别模式和做出决策,并包括机器学习和深度学习等子领域。 +由于 LLM 能够生成文本,因此它们通常被称为一种生成式人工智能 (AI),常缩写为生成 AI 或 GenAI。如图 1.1 所示,人工智能涵盖了创造能执行类似人类智能任务的更广泛领域,包括理解语言、识别模式和做出决策,并包括机器学习和深度学习等子领域。 @@ -59,33 +59,33 @@ LLMs 采用了一种称为 Transformer 的架构(在第 1.4 节中将详细讨 回到垃圾邮件分类的例子,在传统机器学习中,人类专家会手动提取电子邮件文本中的特征,例如某些触发词的频率(“奖品”、“获胜”、“免费”)、感叹号的数量、全大写单词的使用,或者是否存在可疑链接。基于这些专家定义的特征创建的数据集随后用于训练模型。与传统机器学习不同,深度学习不需要手动提取特征,这意味着人类专家不需要为深度学习模型识别和选择最相关的特征。(不过,无论是在传统机器学习还是深度学习的垃圾邮件分类中,仍然需要收集标签,如垃圾邮件或非垃圾邮件,而这些标签需要由专家或用户进行收集。) -接下来的章节将介绍 LLMs 能解决的问题、LLMs 面临的挑战,以及我们将在本书中实现的通用 LLM 架构。 +接下来的章节将介绍 LLM 能解决的问题、LLM 面临的挑战,以及我们将在本书中实现的通用 LLM 架构。 -## 1.2 LLMs 的应用 +## 1.2 LLM 的应用 -由于具备解析和理解非结构化文本数据的高级能力,LLMs 在多个领域有着广泛的应用。目前,LLMs 被广泛用于机器翻译、新文本生成(见图 1.2)、情感分析、文本摘要等多种任务。最近,LLMs 还被用于内容创作,比如撰写小说、文章,甚至计算机代码。 +由于具备解析和理解非结构化文本数据的高级能力,LLM 在多个领域有着广泛的应用。目前,LLM 被广泛用于机器翻译、新文本生成(见图 1.2)、情感分析、文本摘要等多种任务。最近,LLM 还被用于内容创作,比如撰写小说、文章,甚至计算机代码。 -LLMs 还可以支持复杂的聊天机器人和虚拟助手,例如 OpenAI 的 ChatGPT 或谷歌的 Gemini(以前称为 Bard),这些助手能够回答用户的问题,并提升传统搜索引擎的功能,如 Google Search 和 Microsoft Bing。 +LLM 还可以支持复杂的聊天机器人和虚拟助手,例如 OpenAI 的 ChatGPT 或谷歌的 Gemini(以前称为 Bard),这些助手能够回答用户的问题,并提升传统搜索引擎的功能,如 Google Search 和 Microsoft Bing。 -此外,LLMs 还可以有效地从医学或法律等专业领域的大量文本中检索知识。这包括筛选文档、总结长段落以及回答技术性问题。 +此外,LLM 还可以有效地从医学或法律等专业领域的大量文本中检索知识。这包括筛选文档、总结长段落以及回答技术性问题。 -总之,LLMs 在自动化几乎所有涉及文本解析和生成的任务中都是不可或缺的。它们的应用几乎是无限的,随着我们不断创新和探索这些模型的新用法,LLMs 显然有潜力重新定义我们与技术的关系,使其变得更加对话式、直观和易于访问。 +总之,LLM 在自动化几乎所有涉及文本解析和生成的任务中都是不可或缺的。它们的应用几乎是无限的,随着我们不断创新和探索这些模型的新用法,LLM 显然有潜力重新定义我们与技术的关系,使其变得更加对话式、直观和易于访问。 -在本书中,我们将重点了解 LLMs 的工作原理,从基础开始,编码一个能够生成文本的 LLM。我们还将学习使 LLMs 执行查询的技术,包括回答问题、总结文本、将文本翻译成不同语言等。换句话说,在本书中,我们将通过一步步构建的方式,学习复杂的 LLM 助手(如 ChatGPT)的工作原理。 +在本书中,我们将重点了解 LLM 的工作原理,从基础开始,编码一个能够生成文本的 LLM。我们还将学习使 LLM 执行查询的技术,包括回答问题、总结文本、将文本翻译成不同语言等。换句话说,在本书中,我们将通过一步步构建的方式,学习复杂的 LLM 助手(如 ChatGPT)的工作原理。 -## 1.3 构建和使用 LLMs 的步骤 +## 1.3 构建和使用 LLM 的步骤 -为什么我们应该构建自己的 LLMs?从头开始编码一个 LLM 是理解其工作机制和局限性的绝佳练习。同时,这也使我们具备了对现有开源 LLM 架构进行预训练或微调的知识,以便将其应用于我们特定领域的数据集或任务。 +为什么我们应该构建自己的 LLM?从头开始编码一个 LLM 是理解其工作机制和局限性的绝佳练习。同时,这也使我们具备了对现有开源 LLM 架构进行预训练或微调的知识,以便将其应用于我们特定领域的数据集或任务。 -研究表明,在建模性能方面,专为特定任务或领域定制的 LLMs 通常能超过通用的 LLMs,比如 ChatGPT,这些通用模型设计用于多种应用场景。例如,BloombergGPT 是一个专门针对金融领域的模型,还有针对医学问答定制的 LLMs(有关更多细节,请参阅附录 B 的进一步阅读和参考文献部分) +研究表明,在建模性能方面,专为特定任务或领域定制的 LLM 通常能超过通用的 LLM,比如 ChatGPT,这些通用模型设计用于多种应用场景。例如,BloombergGPT 是一个专门针对金融领域的模型,还有针对医学问答定制的 LLM(有关更多细节,请参阅附录 B 的进一步阅读和参考文献部分) -使用定制的 LLMs 有多个优势,尤其是在数据隐私方面。例如,公司可能因为保密问题而不愿与像 OpenAI 这样的第三方 LLM 提供商分享敏感数据。此外,开发定制的 LLMs 可以直接在客户的设备上部署,比如笔记本电脑和智能手机,这是像 Apple 这样的公司当前正在探索的方向。这种针对LLMs的本地部署实现能够显著降低响应延迟和服务器相关的成本。同时,定制的 LLMs 使开发者拥有完全的自主权,能够根据需要控制模型的更新和修改。 +使用定制的 LLM 有多个优势,尤其是在数据隐私方面。例如,公司可能因为保密问题而不愿与像 OpenAI 这样的第三方 LLM 提供商分享敏感数据。此外,开发定制的 LLM 可以直接在客户的设备上部署,比如笔记本电脑和智能手机,这是像 Apple 这样的公司当前正在探索的方向。这种针对LLM的本地部署实现能够显著降低响应延迟和服务器相关的成本。同时,定制的 LLM 使开发者拥有完全的自主权,能够根据需要控制模型的更新和修改。 创建 LLM 的一般过程包括预训练和微调。术语 "pre" 在 "pretraining" 中指的是初始阶段,此时模型(如 LLM)在一个大型且多样化的数据集上进行训练,以便获得对语言的广泛理解。预训练模型随后作为基础资源,可以通过微调进一步优化。微调是指模型在一个更针对特定任务或领域的数据集上进行专门训练。包含预训练和微调的这种两阶段训练方法在图 1.3 中进行了说明。 @@ -104,7 +104,7 @@ LLM 的第一阶段训练被称为预训练,旨在创建一个初始的预训 在从大型文本数据集上训练得到预训练的 LLM 后,该LLM会学习预测文本中的下一个单词。我们可以在优质的标注数据上对 LLM 进行进一步训练,这个过程称为微调。 -微调 LLMs 的两个最流行的类别是指令微调和分类任务微调。在指令微调中,标注数据集包含指令和答案对,例如用于翻译文本的查询及其正确翻译。在分类微调中,标注数据集由文本及其对应的类别标签组成,比如与垃圾邮件和非垃圾邮件标签相关的电子邮件。 +微调 LLM 的两个最流行的类别是指令微调和分类任务微调。在指令微调中,标注数据集包含指令和答案对,例如用于翻译文本的查询及其正确翻译。在分类微调中,标注数据集由文本及其对应的类别标签组成,比如与垃圾邮件和非垃圾邮件标签相关的电子邮件。 在本书中,我们将介绍 LLM 的预训练和微调的代码实现,并将在预训练基础 LLM 后,深入探讨指令微调和分类微调的具体细节。 @@ -118,7 +118,7 @@ LLM 的第一阶段训练被称为预训练,旨在创建一个初始的预训 图 1.4 中的 Transformer 架构由两个子模块组成:编码器和解码器。编码器模块处理文本输入,将其编码为一系列数值表示或向量,以捕捉输入的上下文信息。然后,解码器模块利用这些编码向量生成输出文本。例如,在翻译任务中,编码器将源语言文本编码为向量,而解码器则将这些向量解码为目标语言的文本。编码器和解码器都由多个层通过自注意力机制相连。您可能会对输入的预处理和编码过程有许多疑问,这些将在后续章节的逐步实现中详细解答。 -Transformers 和 LLMs 的一个关键组成部分是自注意力机制(图中未显示),它使模型能够相对地权衡序列中不同单词或标记的重要性。这个机制帮助模型捕捉输入数据中的远程依赖关系和上下文关系,从而提高生成连贯且与上下文相关的输出的能力。不过,由于自注意力机制的复杂性,我们将在第三章中逐步讨论和实现它。此外,第二章《处理文本数据》中,我们也将讨论并实现创建模型输入所需的数据预处理步骤。 +Transformers 和 LLM 的一个关键组成部分是自注意力机制(图中未显示),它使模型能够相对地权衡序列中不同单词或标记的重要性。这个机制帮助模型捕捉输入数据中的远程依赖关系和上下文关系,从而提高生成连贯且与上下文相关的输出的能力。不过,由于自注意力机制的复杂性,我们将在第三章中逐步讨论和实现它。此外,第二章《处理文本数据》中,我们也将讨论并实现创建模型输入所需的数据预处理步骤。 > [!TIP] > @@ -144,7 +144,7 @@ GPT 模型主要是为文本补全任务设计和训练的,但它们在能力 > > **TRANSFORMERS 与 LLM** > -> 如今的 LLM 大部分是基于上一节提到的 Transformer 架构来实现。因此,在文献中,Transformers 和 LLMs 常常被视为同义词。然而,值得注意的是,并非所有的 Transformers 都是 LLM,因为它们也可以用于计算机视觉。同时,并非所有的 LLM 都是基于 Transformers 的,市场上也有一些基于递归和卷积架构的大语言模型。这些替代方法的主要目的是提高 LLM 的计算效率。不过,这些替代架构能否与基于 Transformer 的 LLM 的能力相竞争,以及它们是否会在实际中得到应用,还需要进一步观察。为了简单起见,本书将“LLM”一词用来指代类似于 GPT 的基于 Transformer 的 LLM。(感兴趣的读者可以在本章末尾的进一步查找找到相关文献阅读。) +> 如今的 LLM 大部分是基于上一节提到的 Transformer 架构来实现。因此,在文献中,Transformers 和 LLM 常常被视为同义词。然而,值得注意的是,并非所有的 Transformers 都是 LLM,因为它们也可以用于计算机视觉。同时,并非所有的 LLM 都是基于 Transformers 的,市场上也有一些基于递归和卷积架构的大语言模型。这些替代方法的主要目的是提高 LLM 的计算效率。不过,这些替代架构能否与基于 Transformer 的 LLM 的能力相竞争,以及它们是否会在实际中得到应用,还需要进一步观察。为了简单起见,本书将“LLM”一词用来指代类似于 GPT 的基于 Transformer 的 LLM。(感兴趣的读者可以在本章末尾的进一步查找找到相关文献阅读。) diff --git a/cn-Book/2.处理文本数据.md b/cn-Book/2.处理文本数据.md index 1af45e7..abf92b9 100644 --- a/cn-Book/2.处理文本数据.md +++ b/cn-Book/2.处理文本数据.md @@ -76,7 +76,7 @@ 虽然我们可以使用预训练模型(例如 Word2Vec)为机器学习模型生成嵌入,但 LLM 通常会生成自己的嵌入,这些嵌入是输入层的一部分,并在训练过程中进行更新。将嵌入作为 LLM 训练的一部分进行优化,而不直接使用 Word2Vec,有一个明确的优势,就是嵌入能够针对特定的任务和数据进行优化。我们将在本章后面实现这样的嵌入层。此外,LLM 还能够创建上下文化的输出嵌入,这一点我们将在第三章中讨论。 -高维嵌入在可视化中面临挑战,因为我们的感官感知和常见的图形表示本质上只限于三维或更少的维度,这也是图 2.3 采用二维散点图展示二维嵌入的原因。然而,在处理 LLMs 时,我们通常使用的嵌入的维度远高于图 2.3 所示的维度。对于 GPT-2 和 GPT-3,嵌入的大小(通常称为模型隐状态的维度)会根据具体的模型变体和大小而有所不同。这是性能与效率之间的权衡。以具体示例为例,最小的 GPT-2 模型(117M 和 125M 参数)使用 768 维的嵌入大小,而最大的 GPT-3 模型(175B 参数)则使用 12,288 维的嵌入大小。 +高维嵌入在可视化中面临挑战,因为我们的感官感知和常见的图形表示本质上只限于三维或更少的维度,这也是图 2.3 采用二维散点图展示二维嵌入的原因。然而,在处理 LLM 时,我们通常使用的嵌入的维度远高于图 2.3 所示的维度。对于 GPT-2 和 GPT-3,嵌入的大小(通常称为模型隐状态的维度)会根据具体的模型变体和大小而有所不同。这是性能与效率之间的权衡。以具体示例为例,最小的 GPT-2 模型(117M 和 125M 参数)使用 768 维的嵌入大小,而最大的 GPT-3 模型(175B 参数)则使用 12,288 维的嵌入大小。 本章接下来的部分将系统地介绍准备 LLM 使用的嵌入所需的步骤,这些步骤包括将文本拆分为单词、将单词转换为token,以及将token转化为嵌入向量。 @@ -98,7 +98,7 @@ print("Total number of character:", len(raw_text)) print(raw_text[:99]) ``` -另外,您可以在本书的 GitHub 仓库中找到名为 "the-verdict.txt" 的文件,网址是 [https://github.com/rasbt/LLMs-from-scratch/tree/main/ch02/01_main-chapter-code](https://github.com/rasbt/LLMs-from-scratch/tree/main/ch02/01_main-chapter-code) +另外,您可以在本书的 GitHub 仓库中找到名为 "the-verdict.txt" 的文件,网址是 [https://github.com/rasbt/LLM-from-scratch/tree/main/ch02/01_main-chapter-code](https://github.com/rasbt/LLM-from-scratch/tree/main/ch02/01_main-chapter-code) 便于演示的目的,print命令输出文件的总字符数以及前100个字符。 @@ -443,7 +443,7 @@ print(tokenizer.decode(tokenizer.encode(text))) 通过将上面的去token化文本与原始输入文本进行比较,我们可以得知训练数据集,即艾迪丝·华顿的短篇小说《判决》,并不包含单词 "Hello" 和 "palace"。 -到目前为止,我们已经讨论了分词作为处理文本输入到 LLMs 中的重要步骤。根据不同的 LLM,一些研究人员还考虑其他特殊token,例如以下几种: +到目前为止,我们已经讨论了分词作为处理文本输入到 LLM 中的重要步骤。根据不同的 LLM,一些研究人员还考虑其他特殊token,例如以下几种: + [BOS](序列开始):这个token表示文本的起始位置,指示 LLM 内容的开始。 + [EOS](序列结束):这个token位于文本的末尾,在连接多个无关文本时特别有用,类似于 <|endoftext|>。例如,在合并两个不同的维基百科文章或书籍时, [EOS] token指示一篇文章结束和下一篇文章开始。 @@ -903,7 +903,7 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=) > > **嵌入层与矩阵乘法** > -> 对于那些熟悉独热编码的人来说,上述嵌入层方法本质上只是实现独热编码后再进行矩阵乘法的一种更高效的方式,相关内容在 GitHub 的补充代码中进行了说明,链接为[https://github.com/rasbt/LLMs-from-scratch/tree/main/ch02/03_bonus_embedding-vs-matmul](https://github.com/rasbt/LLMs-from-scratch/tree/main/ch02/03_bonus_embedding-vs-matmul)。由于嵌入层只是独热编码和矩阵乘法方法的更高效实现,因此可以视为一个可以通过反向传播进行优化的神经网络层。 +> 对于那些熟悉独热编码的人来说,上述嵌入层方法本质上只是实现独热编码后再进行矩阵乘法的一种更高效的方式,相关内容在 GitHub 的补充代码中进行了说明,链接为[https://github.com/rasbt/LLM-from-scratch/tree/main/ch02/03_bonus_embedding-vs-matmul](https://github.com/rasbt/LLM-from-scratch/tree/main/ch02/03_bonus_embedding-vs-matmul)。由于嵌入层只是独热编码和矩阵乘法方法的更高效实现,因此可以视为一个可以通过反向传播进行优化的神经网络层。 之前,我们已经看到如何将单个token ID 转换为三维嵌入向量。现在让我们将其应用于之前定义的所有四个输入 ID(`torch.tensor([2, 3, 5, 1])`):